Pisanie dwóch tekstów w jednej linii – jeden z lewej, drugi z prawej strony konsoli

0

Witam ponownie. Mam do Was małą prośbę, a właściwie pytanie. Chciałbym wypisać dwa teksty w jednej linii w ten sposób, by pierwszy był po lewej stronie konsoli, a drugi po prawej. Jak to zrobić? Próbowałem użyć gotoxy(), ale niestety drugi tekst jest pisany linijkę niżej.

1

Poczytaj np. o ncurses.

0

@Patryk27: Znam ncurses, ale czy nie istnieje może inna możliwość?

0
nojaniewiem napisał(a):

Próbowałem użyć gotoxy(), ale niestety drugi tekst jest pisany linijkę niżej.

Nie używaj endl, \n i innych takich wynalazków, a także policz dokładnie ile znaków znajduje się w jednej linii. Jeśli spróbujesz wyświetlić więcej znaków, to zostaną one przeniesione do nowej linii. No i też pilnuj, aby współrzędna y w gotoxy dla obu tekstów była taka sama.

Bez problemu da się to wykonać, ale bierz pod uwagę, że ktoś inny może mieć szerszą lub węższą konsolę, przez co interfejs Twojego programu rozjedzie się. Chyba że skorzystasz również z funkcji zwracających rozmiar konsoli.

0

Jak najbardziej - przykładowo:

printf("ten tekst bedzie z lewej                             a tej z prawej");

... ale to nie zadziała, jeśli terminal ma inną szerokość ;-)

0

Niestety, nie mogę tego tak rozwiązać :(
Mój program ma z lewej pisać, że przeszedł do sekcji prywatnej, natomiast z prawej, że przeszedł do sekcji krytycznej.
Chyba faktycznie zastosuję ncurses.

EDIT: Właśnie się dowiedziałem, że mam użyć sekwencji sterujących konsoli. Oprócz tego użycie ncurses okazało się być nietrafionym pomysłem. Pomimo wszelkich prób na ekranie robił się śmietnik,

0

Temat do zamknięcia. Przerobiłem funkcję gotoxy() tak, by pisząc drugi raz w tej samej linii nie kasowała poprzedniego tekstu:

void gotoxy(unsigned x, unsigned y)
{
  printf("\033[%d;%dH", y, x);
}
0

Witam ponownie. Niestety, wciąż mam problem z pisaniem w jednej linii. Doszedłem do wniosku, że problem związany jest z gotoxy(). Problem polega na tym, że zdarzają się sytuacje, gdzie sekcja krytyczna pisze dwa razy w jednej linii lub daną linię pomija. Wywalenie '\n' z komunikatu sekcji prywatnej skutkuje prawidłowym zapisem, który jednak nie jest wykonywany na bieżąco (po dłuższym czasie pojawia się od razu kilkanaście linii). Przeniesienie tego znaku do komunikatu sekcji krytycznej przenosi problem na komunikaty sekcji prywatnej. Czy istnieje może jakaś komenda odświeżająca terminal, lub coś w tym stylu? Użycie bibliotek takich, jak ncurses nie wchodzi w grę.

#include "func.h"


/*void gotoxy(unsigned x, unsigned y)
{
  printf("\033[%d;%dH\033[2K", y, x);
}*/

void gotoxy(unsigned x, unsigned y) //nie kasuje zawartości wiersza, w którym zamierza pisać
{
  printf("\033[%d;%dH", y, x);
}

void* wzajemneWykluczanie(void* arg)
{
    srand(time(NULL));

    for(int i=0; i<LOOP; ++i)
    {
        int tm=(rand()%MAX_SL)+MIN_SL;  //czas uśpienia

        //++poz_b_priv;
        gotoxy(POZ_A, (++poz_b_priv));  //lewa strona - sekcja prywatna
        printf("S. pr. w.: %ld po raz: %d |\n", (long int)arg, i+1);  //komunikat sekcji prywatnej

        //sekcja krytyczna
        if(pthread_mutex_lock(&Mutex)!=0)   //opuszczenie mutexu + obsługa błędów
        {
            perror("Blad opuszczania mutexu\n");
            exit(5);
        }

        int counter=zmienna_globalna;   //przypisanie prywatnemu licznikowi wartości zmiennej globalnej
        sleep(tm);  //uśpienie

        gotoxy(POZ_C, (++poz_b_kryt));  //prawa strona - sekcja krytyczna
        printf("S. kr. w.: %ld po raz: %d", (long int)arg, i+1);  //komunikat sekcji krytycznej
        ++counter;  //preinkrementacja licznika

        sleep(SLV); //uśpienie przed zapisem
        zmienna_globalna=counter;   //przypisanie zmiennej globalnej wartości licznika

        if(pthread_mutex_unlock(&Mutex)!=0) //podniesienie mutexu + obsługa błędów
        {
            perror("Blad podnoszenia mutexu\n");
            exit(6);
        }
    }

    return NULL;    //funkcja zwraca wskaźnik
}

EDIT: Już ogarnąłem. Wystarczyło usunąć znaki '\n' i za instrukcjami pisania wstawić ```
fflush(stdout);

1 użytkowników online, w tym zalogowanych: 0, gości: 1