Rozbieżności kompilatora GCC i CodeBlock'a

Rozbieżności kompilatora GCC i CodeBlock'a
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,
Moi drodzy mam dzisiaj problem związany nie z czystym programowanie ale z dwojakim działaniem programu na różnych systemach operacyjnych...
Otóż... na Windowsie kompilując w CodeBlock'sie rezultatem jest "linia zachęty" >>> i oczekiwanie na input...
Natomiast kompilując i odpalając na Linuchu rezultatem jest oczekiwanie na input a dopiero później wypisanie "linii zachęty"

Dziwi mnie zachowanie programu w Linuxie ponieważ komenda printf(">>> "); jest jako pierwsza w pętli while dlatego powinna zostać wykonana przed read'em...

Jakieś pomysły ??

Kopiuj
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
//#include <sys/wait.h>

char zczytanaKomenda[1000];
char tablicaStringow[32][50];

void ZerujTabliceStringw()
{
    int i;
    for (i = 0; i < 32; i++)
    {
        memset(tablicaStringow[i], 0, 50);
    }
}

int PodzielNaArgumenty(int n)
{
    int i, j, kolejnoscAtrybutu=0, koniecAtrybutu=0, poczatekAtrybutu=0;
    for (i = 0; i < n; i++)
    {
        if ((zczytanaKomenda[i] == 32) || (zczytanaKomenda[i] == '\n'))
        {
            koniecAtrybutu = i;
            for (j = 0; j < koniecAtrybutu-poczatekAtrybutu; j++ )
            {
                tablicaStringow[kolejnoscAtrybutu][j] = zczytanaKomenda[poczatekAtrybutu + j];
            }
            poczatekAtrybutu = i + 1;
            kolejnoscAtrybutu++;
        }
    }
    return kolejnoscAtrybutu;
}

int main (int argc, char* argv[])
{
    int i, n;
    while (1)
    {

        printf(">>> ");
        ZerujTabliceStringw();
        if ((i = read(0, zczytanaKomenda, 1000)) > 1)
        {
            n = PodzielNaArgumenty(i);
        }
        else if (i == 1)
        {
            n = 0;
        }
        if (i == -1)
        {
            fprintf(stderr, "Blad odczytu z lini polecen");
        }
        printf("Ilosc znakow: %d\n", i);
        printf("Ilosc argumentow: %d\n", n);
        printf("TabStr[0]: %s\n", tablicaStringow[0]);
        printf("TabStr[1]: %s\n", tablicaStringow[1]);
        printf("TabStr[2]: %s\n", tablicaStringow[2]);
        printf("TabStr[3]: %s\n", tablicaStringow[3]);
    }
    return 0;
}

 
  • Rejestracja: dni
  • Ostatnio: dni
2

dodaj fflush(stdout); po tym printfie

KX
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Wyśmienicie :) A z czego wynikła ta rozbieżność ?? I co tak naprawde się stało ?? Bo definicje fflush() jakoś do mnie nie przemawiają...
pozdrawiam

NI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 535
2

jak nie masz znaku końca linii w printf("\n") to nie masz pewności że ci się to pojawi w konsoli, fflush(stdout) wrzuca oczekujący tekst do konsoli, więc masz pewność że się pojawi

  • Rejestracja: dni
  • Ostatnio: dni
2

Funkcje piszące na wyjścia programu (tutaj stdout ale mógłby to być np. plik) mają prawo buforować wyjście żeby ograniczyć liczbę wywołań systemowych które faktycznie piszą do pliku/na konsole. Powodem takiego zachowania jest optymalizacja. Wywołania systemowe są kosztowne, więc lepiej zebrać sobie np. kilobajt danych i potem wypluć go na raz. Problem pojawia się wtedy kiedy oczekujemy tego wyjścia w danym momencie. Jeżeli chcemy być pewni że wyjście się pojawi należy wymusić jego wyświetlenie funkcją fflush. Znak nowej lini nie gwarantuje wymuszenia wyświetlenia wyjścia. Mozna też wyłączyć buforowanie funkcją setbuf.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.