Programma C - Puntatori ad array in funzioni

di il
11 risposte

Programma C - Puntatori ad array in funzioni

Buonasera a tutti!
Ho deciso di aprire questo 3d perchè, nonostante abbia seguito numerose guide, non sono ancora riuscito a venire a capo del mio problema...

Devo creare un gioco di carte; il mio problema riguarda la parte del mazzo.
Infatti, il mazzo è composto da 26 carte.
Ognuna di queste 26 carte è dotata di alcune proprietà come Nome, Forza, Arma, ecc.
Ho dichiarato queste tipo struct in Strutture.h (più in basso).

Il problema viene ora: io voglio dare un nome ad ognuna di queste 26 carte, quindi voglio creare una funzione che mi permetta di farlo senza "sporcare" il main.
Ecco come ho cercato di risolvere:
Questo è il file "Strutture.h"
#define CARTEMAZZO 26
#define DOBINIZ 50

typedef struct { char NomeArma[10]; int ForzaArma;} TipoArma;
typedef struct { int Attivo; int PuntiPotenziamento; int ContatorePotenziamento; } TipoPotenziamento;
typedef struct { char Nome[10]; int Forza; TipoArma Arma; int Costo; TipoPotenziamento Potenziamento; int Stanchezza; } TipoCarta;
typedef struct { char Nome[20]; TipoCarta Carte[CARTEMAZZO]; int Dobloni; int NumeroCarte; } TipoGiocatore; 

void CostruisciMazzo(TipoCarta *PuntatoreCarta);
Questo è il mio main
#include<stdio.h>
#include "Strutture.h"
#include<string.h>

main()
{
	TipoArma Armi[3];
	TipoCarta Mazzo[CARTEMAZZO];
	
	TipoCarta *PuntatoreCarta;
	TipoArma *PuntatoreArma;

	int i;
	
	PuntatoreCarta=&Mazzo[0];
	PuntatoreArma=&Armi[0];

	void CostruisciMazzo(TipoCarta *PuntatoreCarta);

	for (i=0; i<CARTEMAZZO; i++)
	{
		printf("%s\n", Mazzo[i].Nome);
	}
	
}
Mentre questa è la funzione CostruisciMazzo:
#include "Strutture.h"
#include <string.h>
void CostruisciMazzo(TipoCarta *PuntatoreCarta)
{
strcpy(*PuntatoreCarta->Nome, "A");
PuntatoreCarta++;
strcpy(*PuntatoreCarta->Nome, "B");
// Ovviamente questa funzione sara' MOLTO più lunga perché dovrò dichiarare altri 24 nomi, valori ecc...
}
Ho provato in vari modi, credo che questo sia quello che più si avvicina alla soluzione, ma niente: al momento della stampa eseguita nel main, il nome di Mazzo[0] non risulta modificato.

Grazie in anticipo a chi vorrà darmi una mano

11 Risposte

  • Re: Programma C - Puntatori ad array in funzioni

    Basta

    strcpy(PuntatoreCarta->Nome, "A");

    o se ti viene più facile

    strcpy(PuntatoreCarta[0].Nome, "A");
  • Re: Programma C - Puntatori ad array in funzioni

    oregon ha scritto:


    Basta

    strcpy(PuntatoreCarta->Nome, "A");

    o se ti viene più facile

    strcpy(PuntatoreCarta[0].Nome, "A");
    Ciao, in nessuno dei due modi funziona...
    Non da alcun errore né warning, ma continua a non modificarlo
  • Re: Programma C - Puntatori ad array in funzioni

    No ... non è vero ... ho provato e funziona ...

    Come vedi che "non funziona" ?
  • Re: Programma C - Puntatori ad array in funzioni

    oregon ha scritto:


    No ... non è vero ... ho provato e funziona ...

    Come vedi che "non funziona" ?
    Guarda, ti rimetto i tre file copiati copiati così puoi fare il confronto:

    Main
    #include<stdio.h>
    #include "Strutture.h"
    #include<string.h>
    
    main()
    {
    	TipoArma Armi[3];
    	TipoCarta Mazzo[CARTEMAZZO];
    	
    	TipoCarta *PuntatoreCarta;
    	TipoArma *PuntatoreArma;
    
    	int i;
    	
    	PuntatoreCarta=&Mazzo[0];
    	PuntatoreArma=&Armi[0];
    
    	void CostruisciMazzo(TipoCarta *PuntatoreCarta);
    
    	for (i=0; i<CARTEMAZZO; i++)
    	{
    		printf("%s\n", Mazzo[i].Nome);
    	}
    	
    }
    
    Strutture.h
    #define CARTEMAZZO 26
    #define DOBINIZ 50
    
    typedef struct { char NomeArma[10]; int ForzaArma;} TipoArma;
    typedef struct { int Attivo; int PuntiPotenziamento; int ContatorePotenziamento; } TipoPotenziamento;
    typedef struct { char Nome[10]; int Forza; TipoArma Arma; int Costo; TipoPotenziamento Potenziamento; int Stanchezza; } TipoCarta;
    typedef struct { char Nome[20]; TipoCarta Carte[CARTEMAZZO]; int Dobloni; int NumeroCarte; } TipoGiocatore; 
    
    void CostruisciMazzo(TipoCarta *PuntatoreCarta);
    
    
    Strutture.c
    #include "Strutture.h"
    #include <string.h>
    void CostruisciMazzo(TipoCarta *PuntatoreCarta)
    {
    strcpy(PuntatoreCarta->Nome, "A");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "B");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "C");
    PuntatoreCarta++;
    }
    Se lo compilo ed eseguo, mi stampa dei valori random invece che A, B e C...
  • Re: Programma C - Puntatori ad array in funzioni

    Beh ... ma tu ne imposti solo 3 mentre le visualizzi tutte con

    i<CARTEMAZZO;

    O le inizializzi tutte, oppure vedi solo le prime 3 con

    i<3;
  • Re: Programma C - Puntatori ad array in funzioni

    oregon ha scritto:


    Beh ... ma tu ne imposti solo 3 mentre le visualizzi tutte con

    i<CARTEMAZZO;

    O le inizializzi tutte, oppure vedi solo le prime 3 con

    i<3;
    Sisì, ovviamente guardavo solo le prime tre: in ogni caso, le ho inizializzate tutte e 26, ed escono ancora 26 stringhe casuali...
  • Re: Programma C - Puntatori ad array in funzioni

    Allora .... mostrami il codice con tutte le inizializzazioni, così che lo copio incollo e controllo ...
  • Re: Programma C - Puntatori ad array in funzioni

    oregon ha scritto:


    Allora .... mostrami il codice con tutte le inizializzazioni, così che lo copio incollo e controllo ...
    Ecco a te:
    Main
    #include<stdio.h>
    #include "Strutture.h"
    #include<string.h>
    
    main()
    {
    	TipoArma Armi[3];
    	TipoCarta Mazzo[CARTEMAZZO];
    	
    	TipoCarta *PuntatoreCarta;
    	TipoArma *PuntatoreArma;
    
    	int i;
    	
    	PuntatoreCarta=&Mazzo[0];
    	PuntatoreArma=&Armi[0];
    
    	void CostruisciMazzo(TipoCarta *PuntatoreCarta);
    
    	for (i=0; i<CARTEMAZZO; i++)
    	{
    		printf("%s\n", Mazzo[i].Nome);
    	}
    	
    }
    
    Strutture.h
    #define CARTEMAZZO 26
    #define DOBINIZ 50
    
    typedef struct { char NomeArma[10]; int ForzaArma;} TipoArma;
    typedef struct { int Attivo; int PuntiPotenziamento; int ContatorePotenziamento; } TipoPotenziamento;
    typedef struct { char Nome[10]; int Forza; TipoArma Arma; int Costo; TipoPotenziamento Potenziamento; int Stanchezza; } TipoCarta;
    typedef struct { char Nome[20]; TipoCarta Carte[CARTEMAZZO]; int Dobloni; int NumeroCarte; } TipoGiocatore; 
    
    void CostruisciMazzo(TipoCarta *PuntatoreCarta);
    
    
    Strutture.c
    #include "Strutture.h"
    #include <string.h>
    void CostruisciMazzo(TipoCarta *PuntatoreCarta)
    {
    strcpy(PuntatoreCarta->Nome, "A");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "B");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "C");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "D");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "E");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "F");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "G");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "H");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "I");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "J");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "K");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "L");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "M");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "N");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "O");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "P");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "Q");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "R");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "S");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "T");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "U");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "V");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "W");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "X");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "Y");
    PuntatoreCarta++;
    strcpy(PuntatoreCarta->Nome, "Z");
    PuntatoreCarta++;
    
    
    }
    Confermo che facendolo così, l'output è:
    
    ²¦
    Õ
    
    
    
    ?
    
    @
    
    P?O
    
    ª?O?
    ?
    Ç
    
    
    
    V
    n
    (?Î
    
    dÁ?þ²¦
    
    
    
    
    --------------------------------
    Process exited after 0.006439 seconds with return value 0
    Premere un tasto per continuare . . .
  • Re: Programma C - Puntatori ad array in funzioni

    Ma tu come chiami la funzione nel main??? Quello è il prototipo ... per chiamare la funzione si scrive

    CostruisciMazzo(PuntatoreCarta);
  • Re: Programma C - Puntatori ad array in funzioni

    oregon ha scritto:


    Ma tu come chiami la funzione nel main??? Quello è il prototipo ... per chiamare la funzione si scrive

    CostruisciMazzo(PuntatoreCarta);
    Eccolo qua l'errore...
    Finalmente! Paradossalmente avevo capito nella maniera corretta le cose più difficili, e invece sbagliavo questa che è basilare...

    Grazie mille!
  • Re: Programma C - Puntatori ad array in funzioni

    Alex12 ha scritto:


    è basilare...
    Esatto ...

    [/quote]Grazie mille! [/quote]

    Prego ...
Devi accedere o registrarti per scrivere nel forum
11 risposte