Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : nochmal conio.h !?!



howtnted
07-04-2005, 17:52
Ich weiß ja, dass dieses thema unter linux oft angesprochen wird dennoch ist es für einen neuling (linux und c++) da durchzublicken und mitzukommen!
Also ich habe lange google und massen von foren durchsucht und habe nur paar ansätze gefunden!

Also um es euch einfacher zu machen hier mal so paar daten:
nutze ubuntu und programmiere mit anjuta
habe schon paar erfahrungen mit der c++ programmierung unter windows in borland und devc++.
Tja ich habe den umstieg auf linux nun gewagt, habe aber festgestellt, dass das programmieren nen ganzen stück anders ist als unter windows. Zumal ich sehr plattformabhängig geprogt habe unter windows (conio.h und windows.h)
Da ich so kleine spielchen programmiert habe, brauche ich natürlich auch zeit und eingaben damit das spiel interaktiv wird.
da gibts nun unterschiede bei win und linux.

so zum eigentlichen prob...
in vielen foren wird der link auf die conio.h als txt datei gegeben!

http://www.mrunix.de/forums/showpost.php?p=151924&postcount=12
klar dachte ich mir... probier ich doch mal aus... hat auch geklappt... nur beim genaueren testen habe ich festgestellt, dass manche funktionen nicht die gewünschte leistung erbringen.
hier als beispiel die funktion getch(); aus der conio.h

int main()
{
cout<<"lol";
getchar();
cout<<"lol2";
return 0;
}

tja was sollte der code machen?
er soll mir "lol" ausgeben dann auf ne eingabe warten und danach
"lol2" anzeigen.
hmmm... sollte... aber das komische, er wartet erst auf die eingabe und gibt dann beides auf einmal aus! Wieso habt ihr das auch?

hier mal der code der die getch(); funktion herstellt. fällt euch nen fehler auf?

int getch(void)
{
int zeich;

if (tty_cbreak(STDIN_FILENO, 0) < 0) {
fprintf(stderr, "kann nicht in cbreak-Modus umschalten\n");
return(EOF);
}
if (read(STDIN_FILENO, &zeich, 1) == 1)
zeich &= 0xff;
tty_reset(STDIN_FILENO);
return(zeich);
}

is komisch... naja vielleicht könnt ihr mir helfen, um meine codes etwas portabler zu machen zwischen borland und anjuta (borland in der schule)

das mit ncurses hab ich schon versucht, aber das kann dann borland wieder nicht. und mixen is auch nicht gut, weil sich einige sachen da überschneiden und nur fehler bringen.

Tja bei fragen, wenn ich etwas schlecht erklärt habe, dann schreibts plz... wäre für jede hilfe dankbar!

cu
Hotte + oWned = howtnted ;)

howtnted
07-04-2005, 18:42
tja... wies manchmal so ist... man schreibt hier son riesen text und bekommt wärendessen die antwort im irc.... Sry aber für alle die das selbe problem haben / hatten: es liegt daran, dass ich kein flush/<<endl; gemacht habe!

int main()
{
cout<<"lol";
fflush(stdout);
getch();
cout<<"lol2";
return 0;
}

so funzt es ;) juhu endlich

panzi
07-04-2005, 20:34
Du mischt da C und C++, bzw. zwei unterschiedliche Arten auf die Shell zuzugreifen. Das is nie gut. Denn stdin und cin bzw. stdout und cout haben AFAIK von einander getrennte buffer.
Nimm lieber nur C++ und mach:

int main()
{
cout << "lol" << flush;
cin.get();
cout << "lol2" << endl;

return 0;
}

oder nur C:

int main()
{
printf( "lol" );
fflush( stdout );
getchar();
puts( "lol2" );

return 0;
}

locus vivendi
08-04-2005, 07:12
Du mischt da C und C++, bzw. zwei unterschiedliche Arten auf die Shell zuzugreifen. Das is nie gut. Denn stdin und cin bzw. stdout und cout haben AFAIK von einander getrennte buffer.
Nicht ganz, meines Wissens. Im Allgemeinen ist der Zugriff auf Streams durch C und C++ Funktionen nicht synchronisiert. Für die Standard-Streams jedoch schon.
http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#8

howtnted
09-04-2005, 17:39
k danke für den tipp! Wusste nur nicht, dass man unter linux den flush braucht. Unter borland und dev sind sie nicht von nöten. Mein problem is ja nur, dass ich unter linux annähernd den selben code haben will wie unter windows. Wäre ja doof, wenn ich nen programm unter linux für win schreiben muss, was dann unter borland nicht läuft, aber bei mir unter anjuta tadelos funzte.... wäre ja schade. Aber thx für den flush-tipp wusste halt net wie man nen flush macht.

THX howtnted!

panzi
09-04-2005, 19:37
Naja, geflushed wird im algemeinen autom. bei einen \n.
Wenn jetzt aber keins kommt, weil die eingabe in der selben Zeile wie der zuletzt ausgegebenen String kommen soll, dann ist's immer gut ein flush zu machen. Das funktioniert überall und ist schlimmstenfalls einfach nur unnötig.