PDA

Visualizza la versione completa : [C] Flush del buffer


absgothic
08-12-2005, 01:06
Salve a tutti,

Mi scuso anticipatamente perch non sono riuscito ad essere conciso, ma non saprei come esprimermi meglio...

sto realizzando un'applicazione (linguaggio C su ambiente Linux Fedora Core 4) che implementi una battaglia navale tra 2processi (ogni processo parte lanciando dalla shell l'eseguibile. Poi i due processi cominciano a giocare coordinandosi tra di loro attraverso dei semafori).

All'avvio dell'applicazione ad ogni giocatore (quindi ad ogni processo), viene chiesto se vuole posizionarsi le proprie navi da se o se lasciare che a farlo sia una funzione random automatica. Riporto il codice relativo a questo passaggio

....
do {
printf("puoi decidere (1) se posizionare da te le tue navi (scrivi 1)\n");
printf(" (2) o se lasciare che sia il computer a farlo(scrivi 2);\n");
printf("\n");

scanf("%d", &scelta);
}
while ((scelta != 1) && (scelta != 2));
scelta = (int) scelta;

if (scelta == 1)
posizionaMYSELF(grigliaPLAYER1);
else if (scelta == 2)
posiziona(grigliaPLAYER1);
...

la funzione "posizionaMYSELF" appunto quella che permette di scegliere dove posizionare le proprie navi, la funzione "posiziona" invece quella che le posiziona automaticamente.

Se un giocatore sceglie di avviare la funzione "posizionaMYSELF" e di decidere quindi dove posizionare le proprie navi, parte il seguente codice:

int posizionaMYSELF(int griglia[8][8])
{
int k;
int quanteCoord;
int nrCoord1, nrCoord2;
char primaCoord, secondaCoord;
char prendi[256];

for (k = 0; k < NUMERONAVI; k++)
{
if (k == 0) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la PRIMA nave%s\n",ROSSO,STANDARD);
}
else if (k == 1) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la SECONDA nave%s\n", ROSSO, STANDARD);
}
else if (k == 2) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la TERZA nave%s\n", ROSSO, STANDARD);
}
else if (k == 3) {
printf("\n");
printf("%sScegli le coordinate dove posizionare la QUARTA nave%s\n", ROSSO, STANDARD);
}
else if (k == 4) {
printf("\n");
printf("%sScegli le coordinate dove posizionare l' ULTIMA nave%s\n", ROSSO, STANDARD);
}

printf("\n");
printf("ATTENZIONE! Inserisci le coordinate una alla volta!\n");
printf("\n");

do {
do {
do {

printf ("Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')\n", VERDE, STANDARD);
fgets(prendi, 256, stdin);
quanteCoord = lunghezza(prendi);
}
while (quanteCoord != 2);
primaCoord = prendi[0];

}
while ((primaCoord != 'a') && (primaCoord != 'b') && (primaCoord != 'c') && (primaCoord != 'd') && (primaCoord != 'e') && (primaCoord != 'f') && (primaCoord != 'g') && (primaCoord != 'h'));

nrCoord1 = trasforma(primaCoord);

do {
do {
printf ("Inserisci la %sSECONDA COORDINATA%s(una lettera tra 'a'-'h' oppure 'q' per uscire)\n", VERDE, STANDARD);
fgets(prendi, 256, stdin);
quanteCoord = lunghezza(prendi);

}
while (quanteCoord != 2);
secondaCoord = prendi[0];

}
while ((secondaCoord != 'a') && (secondaCoord != 'b') && (secondaCoord != 'c') && (secondaCoord != 'd') && (secondaCoord != 'e') && (secondaCoord != 'f') && (secondaCoord != 'g') && (secondaCoord != 'h'));

nrCoord2 = trasforma(secondaCoord);

if (griglia[nrCoord1][nrCoord2] == 8)
{
printf("\n");
printf("%sATTENZIONE! hai gia' posizionato una nave su questa coordinata%s, inseriscine una diversa!\n", SOTTOLINEATO, STANDARD);
printf("\n");
}
}
while (griglia[nrCoord1][nrCoord2] != 0);
griglia[nrCoord1][nrCoord2] = 8;
}
}


che prende una coordinata alla volta di ogni nave (sono in tutto 5 navi ciascuna di lunghezza unitaria) controllando che la coordinata passata sia valida.

IL MIO PROBLEMA che appena parte la funzione "posizionaMYSELF" chiede sempre 2volte

Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')
Inserisci la %sPRIMA COORDINATA%s(una lettera tra 'a'-'h')

io credo che dipenda dal fatto che prima di far partire quella funzione, si debba indicare "1" o "2" per scegliere se posizionare le navi o lasciare che lo faccia il computer, e che questa scelta in qualche modo venga interpretata come un passaggio di coordinata alla funzione "posizionaMYSELF".
Quest'ultima facendo i controlli sulla legalit della coordinata trova naturalmente che non ammissibile e quindi chiede per la seconda volta di inserire la prima coordinata.

Esiste un modo per aggirare questo problema? Oppure il problema non questo? Conosco la funzione "flush" che ripulisce il buffer di un canale, ma non so come usarla...

Aiutatemi, vi prego! Sto diventando matto! :dh:

Samuele_70
08-12-2005, 01:30
Originariamente inviato da absgothic

...
printf ("Inserisci la %sSECONDA COORDINATA%s(una lettera tra 'a'-'h' oppure 'q' per uscire)\n", VERDE, STANDARD);
fgets(prendi, 256, stdin);
quanteCoord = lunghezza(prendi);

}
while (quanteCoord != 2);
secondaCoord = prendi[0];
...


Non capisco perch leggi un'intera stringa in input per poi
utilizzare solo il primo carattere...
Prova con :


...
char ch;
...

...
printf ("Inserisci la %sSECONDA COORDINATA%s(una lettera tra 'a'-'h' oppure 'q' per uscire)\n", VERDE, STANDARD);
ch=getch();
...

La funzione "getch()" preleva un solo carattere da stdin,
ed dichiarata in "conio.h".
E non essendo bufferizata, non serve neanche la "flush(stdin)"
prima del suo utilizzo, contrariamente allo scanf(), fgets(), etcc etcc.

Usa l'indentazione del codice per renderlo pi comprensibile.

absgothic
08-12-2005, 11:03
Ciao Samuele_70,
l'idea di leggere un solo carattere valida effettivamente perch le coordinate che la mia applicazione si aspetta di ricevere sono monodimensionali.

il problema che non riesco a compilare.

includendo <conio.h> mi restituisce sulla shell


provaGETCH.c:5:19: error: conio.h: No such file or directory

ho controllato su "man getch" ed saltato fuori che devo includere <curses.h> . L'ho fatto, ma adesso quando provo a compilare mi da in output


/tmp/cc0EvcPh.o(.text+0x2d): In function `main':
provaGETCH.c: undefined reference to `stdscr'
/tmp/cc0EvcPh.o(.text+0x36):provaGETCH.c: undefined reference to `wgetch'
collect2: ld returned 1 exit status

da cosa pu dipendere? In tutto il codice non esistono n "wgetch" ne tantomeno "stdscr"...

Samuele_70
08-12-2005, 11:50
Originariamente inviato da absgothic
...
il problema che non riesco a compilare.

includendo <conio.h> mi restituisce sulla shell


provaGETCH.c:5:19: error: conio.h: No such file or directory
...


Prova un p se rieci a compilare questo:


/**
* minGW code (G++.exe)
*
**/

#include <iostream.h>
#include <conio.h>

int main()
{
char cx, cy;
cout << "Digita le coordinate" << endl << endl;
cout <<"Inserisci coordinata x [ 1 - 8 ] : ";
do
{
cx = getch();
}
while(cx<'1' || cx>'8');

cout << cx << endl;

cout <<"Inserisci coordinata y [ a - h ] : ";
do
{
cy = getch();
}
while(cy<'a' || cy>'h');

cout << cy << endl;

getch(); // Attendi la pressione di un tasto prima di uscire ...
return 0;
}


Su WinXP & minGW non mi da alcun problema,
Su Linux non garantisco ... :stordita:

absgothic
08-12-2005, 12:34
no, Sam
non credo che quello sia codice in linguaggio C...Ho provato a compilare e inizialmente mi ha dato solo l'errore


provaGETCH.c:5:19: error: conio.h: No such file or directory

ho provato (x scrupolo) a cambiare la libreria da conio.h a curses.h (quella cio suggeritami dal man riguardo al comando getch) e sono saltati fuori un casino di errori riguardanti i <<

Forse su Unix questi comandi non corrispondono a operazioni ammissibili

cmq grazie 1000 xl'aiuto che mi stai dando! :)

Samuele_70
08-12-2005, 14:06
Originariamente inviato da absgothic
no, Sam
non credo che quello sia codice in linguaggio C...Ho provato a compilare e inizialmente mi ha dato solo l'errore


provaGETCH.c:5:19: error: conio.h: No such file or directory

ho provato (x scrupolo) a cambiare la libreria da conio.h a curses.h (quella cio suggeritami dal man riguardo al comando getch) e sono saltati fuori un casino di errori riguardanti i <<

Si il mio esempio in 'c++' sufficiente sostituire :
#include <iostream.h>
con
#include <stdio.h>
e
cout<<cx<<endl;
con
printf("%c\n",cx);
e la conversione in 'c' risolta ... :)


Forse su Unix questi comandi non corrispondono a operazioni ammissibili

cmq grazie 1000 xl'aiuto che mi stai dando! :)
Mi spiace non posso aiutarti con le curses.h :(

Comunque ritornando alla 'fflush()' sufficiente aggiungere :
fflush(stdin);
prima di ogni scanf() e fgets() per svuotare il buffer.

Loading