Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Flush del buffer

  1. #1

    [C] flush del buffer

    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!

  2. #2

    Re: [C] flush del buffer

    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 :
    codice:
    ...
    	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.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3

    niente compilazione inserendo getch()

    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

    codice:
    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

    codice:
    /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"...

  4. #4

    Re: niente compilazione inserendo getch()

    Originariamente inviato da absgothic
    ...
    il problema è che non riesco a compilare.

    includendo <conio.h> mi restituisce sulla shell

    codice:
    provaGETCH.c:5:19: error: conio.h: No such file or directory
    ...
    Prova un pò se rieci a compilare questo:
    codice:
      /** 
    	* 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 ...
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    no, Sam
    non credo che quello sia codice in linguaggio C...Ho provato a compilare e inizialmente mi ha dato solo l'errore

    codice:
    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!

  6. #6
    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

    codice:
    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.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.