Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68

    [C] Passaggio di una matrice in una funzione

    Sto creando un gioco, ma sono fermo a chiedere i nomi dei giocatori. Ho creato una funzione logicamente indipendente dalle restanti, ora ve la riporto:

    codice:
    char NomeGioc(char giocatori[][MAX_NOME_GIOC], int gioc)
    {   
        int j = 0;
    	
        while(j > numGiocatori)
    	{
    		printf("Giocatore %d inserisci il tuo nome (max %d caratteri)\n[S per uscire]: ", j + 1, MAX_NOME_GIOC);
    		scanf("%s", giocatori[j]);
    		fflush(stdin);
    
    		if(giocatori[j] == 'S' || giocatori[j] == 's')
                    {
                          exit(0);
                    }
    
    		else if(giocatori[j] <= 0 || giocatori[j] > MAX_NOME_GIOC)
                    {
                         printf("Nome piu\' lungo del consentito!");
                    }
                    else
                    {           
                         break;
                    }    
    		j++;
    	}
    
    	return giocatori[][MAX_NOME_GIOC];
    }
    MAX_NOME_GIOC è una macro, e vale 35, numGiocatori è invece il numero di giocatori stabilito dagli utenti prima di chiedere i loro nomi (quindi è una variabile).

    Il compilatore mi dà il seguente errore: [Warning] comparison between pointer and integer
    Penso che il problema sia dovuto al passaggio della matrice come parametro della funzione. Inoltre non sono sicuro che il return sia corretto.

    Grazie mille a chi mi aiuterà

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Questa riga

    codice:
    if(giocatori[j] == 'S' || giocatori[j] == 's')
    e' sbagliata perche' stai confrontando una stringa con un carattere.

    Per confrontare le stringhe devi usare la funzione strcmp

    Anche questa riga

    codice:
    if(giocatori[j] <= 0 || giocatori[j] > MAX_NOME_GIOC)
    e' sbagliata perche' per ottenere la lunghezza di una stringa si usa la funzione strlen

    La return e' sbagliata ma non ho capito cosa deve restituire la funzione (che hai indicato restituire un singolo char ...).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Tutte le righe in cui confronti giocatori[indice] con numeri o caratteri non hanno senso. Nel primo caso
    codice:
    if(giocatori[j] == 'S' || giocatori[j] == 's')
    ti basta cambiare in
    codice:
    if(stricmp(giocatori[j],"s")==0)
    ; nel secondo caso non ha proprio senso questo genere di confronto, visto che (1) la lunghezza di una stringa si calcola con la funzione strlen e (2) se l'utente ha inserito più di MAX_NOME_GIOC caratteri il danno ormai è fatto, visto che è andato a sovrascrivere della memoria che non gli compete. Piuttosto puoi troncare l'acquisizione a 35 caratteri modificando la scanf in modo che acquisisca al massimo MAX_NOME_GIOC-1 caratteri; studiati la documentazione della scanf per capire come fare, e ricorda che il numero massimo di caratteri acquisibili è MAX_NOME_GIOC-1 perché devi contare che un char è occupato dal NUL finale. Per verificare che il nome inserito sia almeno di un carattere ti basta poi semplicemente verificare se il primo carattere è diverso da NUL, per cui
    codice:
    else if(!*giocatori[j])
    {
        puts("Nome troppo breve!");
    }
    .
    Inoltre l'else finale mi pare errato, visto che, lasciandolo, se l'utente non commette errori il programma smette di acquisire i nomi; infine, non ha senso restituire un singolo char.
    ---EDIT---
    Tardi, sempre troppo tardi...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da MItaly
    Tardi, sempre troppo tardi...
    Sì ... ma tu sei stato molto piu' preciso nella risposta ... ma dato che lo sapevo che lo saresti stato, ho fatto un riassunto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68
    Ah ecco, quelle funzioni rientravano in una lista che non ho mai studiato xD Dovrò iniziare a farlo...

    Comunque ho seguito i vostri consigli, ma purtroppo il problema persiste. Quando vado a inserire il nome e a premere INVIO, il programma si blocca e mi dà errore. E' per quello che pensavo che l'errore risiedesse nella matrice.

    Vi riposto il codice modificato, se può servire:
    codice:
    char NomeGioc(char giocatori[][MAX_NOME_GIOC], int j)
    {   
        j = 0;
    	
        do {
    		printf("Giocatore %d inserisci il tuo nome (max %d caratteri)\n[S per uscire]: ", j + 1, MAX_NOME_GIOC);
    		scanf("%s", giocatori[j][MAX_NOME_GIOC - 1]);
    		fflush(stdin);
    
    		if(strcmp(giocatori[j], "S") == 0 || strcmp(giocatori[j], "s") == 0)
                    {
                           exit(0);
                    }
    		else if(size_t strLen(giocatori[j]) <= 0 || size_t strLen(giocatori[j]) > MAX_NOME_GIOC - 1)
                    {
                           printf("Nome piu\' lungo del consentito!");
                    }
                    else if(!giocatori[j])
                    {
                           puts("Nome troppo breve!");
                    }
        } while(j < numGiocatori);    
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La funzione è

    strlen

    e non

    strLen

    e l'indicazione del tipo size_t nella if non c'entra nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Mi son preso la briga di provare a compilare cio' che hai postato (aggiungendo la define gli include e la main):
    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAX_NOME_GIOC 32

    char NomeGioc(char giocatori[][MAX_NOME_GIOC], int j)
    {   
        
    0;
        
        do {
            
    printf("Giocatore %d inserisci il tuo nome (max %d caratteri)\n[S per uscire]: "1MAX_NOME_GIOC);
            
    scanf("%s"giocatori[j][MAX_NOME_GIOC 1]);
            
    fflush(stdin);

            if(
    strcmp(giocatori[j], "S") == || strcmp(giocatori[j], "s") == 0)
                    {
                           exit(
    0);
                    }
            else if(
    size_t strLen(giocatori[j]) <= || size_t strLen(giocatori[j]) > MAX_NOME_GIOC 1)
                    {
                           
    printf("Nome piu' lungo del consentito!");
                    }
                    else if(!
    giocatori[j])
                    {
                           
    puts("Nome troppo breve!");
                    }
        } while(
    numGiocatori);    
    }

    int main (void){
        return 
    0;

    ottenendo:
    codice:
    $ gcc -Wall -ansi -pedantic main.c 
    main.c: In function 'NomeGioc':
    main.c:13: warning: format '%s' expects type 'char *', but argument 2 has type 'int'
    main.c:20: error: parse error before 'size_t'
    main.c:27: warning: control reaches end of non-void function

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    68
    Non mi è chiara questa linea:
    main.c:13: warning: format '%s' expects type 'char *', but argument 2 has type 'int'

    Per "argument 2" intende il secondo parametro passato alla funzione?

  9. #9
    Originariamente inviato da Andres7X
    Non mi è chiara questa linea:
    main.c:13: warning: format '%s' expects type 'char *', but argument 2 has type 'int'

    Per "argument 2" intende il secondo parametro passato alla funzione?
    si riferisce alla seguente:
    Codice PHP:
    scanf("%s"giocatori[j][MAX_NOME_GIOC 1]); 
    Gli dici di acquisire una stringa, ma anziché passargli un puntatore a char, gli passi un char.

    Osserva che siccome scanf è una funzione a numero variabili di argomenti, allora il compilatore promuove implicitamente il char ad int, perciò ti dice che il secondo argomento è un int anziché un char.

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.