Salta ai contenuti. | Salta alla navigazione

Strumenti personali

Applicazioni su più file

Importante

... sono incorso in errori probabilmente banali sul passaggio di array per riferimento, ma non capisco dove è l'errore. può aiutarmi alla risoluzione?

file nuovo_personaggio.c

#define DIM_NOME 20
#define N_CARATTERISTICHE 10

typedef struct //Definizione della struttura del personaggio
{
char nome[DIM_NOME],razza,classe;
int id,caratteristiche[N_CARATTERISTICHE];
} personaggio;

void nuovo_e() //Procedura principale per la creazione del nuovo personaggio
{
personaggio nuovo;

printf("Creazione guidata al nuovo eroe\n");
name(nuovo.nome); //nomina il personaggio

nuovo.razza=razza(); //restituisce la razza scelta
nuovo.classe=classe(); //restituisce la classe del personaggio
nuovo.id=id(); /restituisce l'id del personaggio
nascita(nuovo.caratteristiche); //restituisce i parametri del personaggio
salva_e(nuovo); //salva personaggio creato


//printf("%s %d",nuovo.nome,nuovo.caratteristiche[10]); (printf usata come verifica rapida dati)
}

file scelte.c (contiene le funzioni usate per la scelta della creazione di personaggio eroe o personaggio nemico)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N_CARATTERISTICHE 10
#define N_CARATTERISTICHE_A 6
#define CLOCK_PER_SEC 60

char razza () //funzione per scelta razza
{
[...]
}

char classe () //funzione per scelta classe
{
[...]
}

void nascita(int eroe[]) //procedura per parametri personaggio
{
int i,ok,dati[N_CARATTERISTICHE];

[...]

//eroe=dati; <<----- Errore nel passaggio dell'array scritto cosi: perchè?

}

... nella procedura nascita se scrivo eroe=dati non segna alcun errore, ma quando verifico i dati passati nuovo.caratteristiche[10] è un valore diverso da quello segnato. come devo quindi passare l'array?

Gli array sono passati bene, mi sembra; l'errore è altrove. L'assegnamento fra array non si può fare come indica lei (eroe=dati), ma si devono ricopiare i singoli elementi (tipicamente con un ciclo). Inoltre, l'array è definito come costituito da 10 elementi. Questi verranno quindi chiamati dati[0], dati[1], ..., dati[9], quindi l'elemento dati[10] non esiste.

Inoltre ottengo dei warning nella procedura principale nuovo_e, uno per ogni procedura/funzione che richiamo:

dungeon\crea nuovo.c(19) : warning C4013: 'name' undefined; assuming extern returning int
f:\dungeon\crea nuovo.c(21) : warning C4013: 'razza' undefined; assuming extern returning int
f:\dungeon\crea nuovo.c(22) : warning C4013: 'classe' undefined; assuming extern returning int
f:\dungeon\crea nuovo.c(23) : warning C4013: 'id' undefined; assuming extern returning int
f:\dungeon\crea nuovo.c(24) : warning C4013: 'salva_e' undefined; assuming extern returning int
f:\dungeon\crea nuovo.c(25) : warning C4013: 'nascita' undefined; assuming extern returning int
crea nuovo.obj - 0 error(s), 6 warning(s)

cosa vuol indicare? credo che sia un errore tipico, ma non capisco la causa: perchè le ritiene indefinite?

Le ritiene indefinite perché nel file nuovo_personaggio.c non sono definite, né dichiarate. Per questo, il compilatore, quando cerca di compilare il file nuovo_personaggio.c non sa il numero ed il tipo dei parametri ed il tipo del valore di ritorno delle funzioni. Per questo, non è in grado di compilare l'invocazione delle funzioni. Il C a questo punto ipotizza (sbagliando) che le funzioni che non sono definite restituiscano un int.

Visto che la definizione delle funzioni è in un altro file, in questo si può mettere la dichiarazione (il prototipo). La cosa migliore è mettere i prototipi vengono in un file header, che nel suo caso si chiamerà scelte.h, in cui deve mettere le dichiarazioni delle funzioni che devono essere usate da altri moduli. Il file scelte.h conterrà quindi:

    char razza ();
char classe ();
void nascita(int eroe[]);
void name(char n[]);
...

Poi, nel file nuovo_personaggio.c dovrà aggiungere una riga #include "scelte.h"