Rozbieżności kompilatora GCC i CodeBlock'a

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 ??

#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;
}

 
2

dodaj fflush(stdout); po tym printfie

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

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

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.

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