[lnkForumImage]
Download FREE Software.

Confronta i prezzi di migliaia di prodotti.
News Forum Italiano
 Home | Login | Registrati | Ricerca 


 

Forums >

it.comp.giochi.sviluppo

Problema con FILE E CHAR

Equinox

09/04/2009 15:52:12

Buona sera,

ho questo codice che va per meta':

global var
int VAR[3][3];
char * ICON[3][3];
//=================
FILE*file;// **** SAVE *******
VAR[0][0] = 111;
VAR[0][1] = 222;
VAR[0][2] = 333;

//strcpy(ICON[0], "A");
ICON[0][0] = "A";
ICON[0][1] = "B";
ICON[0][2] = "C";

//strcpy(ICON[0][0], MAGIA[0]);// NOME NUOVO MAGIA<----FUNZIONA !!!!!!!!!!!

file = fopen("TextNote.txt", "w");
fwrite(&VAR, sizeof(VAR), 1, file);
fwrite(&ICON, sizeof(ICON), 1, file);
fclose(file);
//*************
FILE*file; LOAD INT
file = fopen("TextNote.txt", "r+");
fread(&VAR, sizeof(VAR), 1, file);
A1.textNumber = VAR[0][0]; <<<<- questo funziona
A2.textNumber = VAR[0][1];
A3.textNumber = VAR[0][2];
fclose(file);
//**********
FILE*file;//*** LOAD CHAR E PRINT
file = fopen("TextNote.txt", "r+");
fread(&ICON, sizeof(ICON), 1, file);
fclose(file);

.... ma quando cerco di stampare ICON[0][0], non si vede nulla.

Qualche idea su dove sbaglio,perfavore?


Grazie1000.


17 Risposte

Davide Pasca

10/04/2009 07:08:09

0

On Apr 10, 12:52 am, "equinox" <equin...@alice.it> wrote:
> Buona sera,
>
> ho questo codice che va per meta':
>
> global var
>  int VAR[3][3];
> char * ICON[3][3];

> //=================
>  FILE*file;// **** SAVE *******
>  VAR[0][0] = 111;
>  VAR[0][1] = 222;
>  VAR[0][2] = 333;
>
>  //strcpy(ICON[0], "A");
>  ICON[0][0] = "A";
>  ICON[0][1] = "B";
>  ICON[0][2] = "C";
>
>  //strcpy(ICON[0][0], MAGIA[0]);// NOME NUOVO MAGIA<----FUNZIONA !!!!!!!!!!!
>
>  file = fopen("TextNote.txt", "w");
>  fwrite(&VAR, sizeof(VAR), 1, file);
>  fwrite(&ICON, sizeof(ICON), 1, file);
>  fclose(file);

....vedo diversi problemi 8)
Prima di tutto, probabilmente dovresti usare "wb" e "rb" ..ovvero la
versione binaria di write e read.. altrimenti sorgono problemi con
caratteri non ASCII tipo in:

VAR[0][0] = 111

...il secondo problema e' che ICON e' un array di puntatori (o stringhe
'C').. e quindi quello che scrivi sono indirizzi di memoria e non dati
effettivi.

Un altro problema con le stringhe tipo 'C' e' che sono di dimensione
variabile, in tal caso ti suggerisco di scegliere una dimensione
massima e di usare quella (a meno che lo spazio non sia un problema).

const static unsigned int MAX_SIZE = 32; // valore massimo a tua
scelta

char ICON[3][3][MAX_SIZE];

strcpy(ICON[0][0], MAGIA[0]);


bauuu
Davide

Equinox

10/04/2009 07:49:14

0

Intanto GRazie-> Davide per la risposta. Quello che CERCO di fare è scrivere
una funzione per SALVARE E CARICARE INT E ARRAY DI STRINGHE. Seguo i
consigli dati da questo group - di non salvare in maniera DUMP la memoria.

Ora, nel compilatore che usao, per fare questio giochino uso il C ansi, c'è
scritto nel manuale.

Ho provato a fare in questo modo ,per array di stringhe e mi sembra
funzionare entrambi( a parte quando scrivo

char *VetMAGIA[3][20];// Nome MAGIA<<<--3 = a 3 sprite, ognuno ha 20 NOMI
MAGIE(questo funziona con > *...ma posso anche usare....

char VetMDESC[3][20][20];// Descrizione MAGIA.......questo formato: 3
sprite, che hanno 20 NOMI MAGIE, le quali sono lunghe 20 char

la differenza( che onestamente non ho capito- -ma funziona cosi') è che la
prima uso un vettore 2 dimensioni con * davanti

e l'altro modo vet a 3 dimensioni senza *.

MI aiuti/aiutate a capire,perfavore?

....se no ho scritto del codsice per nulla,,,se non riescoa capire e quidi a
salvare-load i dati.

Grazie1000.

NIccolo'


Equinox

10/04/2009 09:02:12

0

.... FILE *file;//*** LOAD CHAR E PRINT

file = fopen("TextNote.txt", "r");
fread(p[1], strlen(p[1]), 1, file);
fclose(file);

strcpy(A1.text, p[1]);
or
sprintf(getclone2(A1.name, 0)->text ,"NAME: %s", p[1]);

NON STAMPA NULLA

A1 è uno sprite e text serve per fargli stampare del testo(textNumber invece
dei numeri)

quando salvo, salvo quello che voglio, cioè "D",per il momento è solo un
char( ma poi sarranno nomi)

Non capisco perchè non mi stampi a video "D". Qualche idea,perfavore?

Gabriele Greco

10/04/2009 10:00:18

0

equinox wrote:
> ... FILE *file;//*** LOAD CHAR E PRINT
>
> file = fopen("TextNote.txt", "r");
> fread(p[1], strlen(p[1]), 1, file);
> fclose(file);

Come fai a calcolare la lunghezza di qualcosa che non hai ancora letto (
strlen(p[1]) )?

Ammesso che p sia qualcosa del tipo:

p[x][y]

Puoi sostituire quella strlen con sizeof(p[0])) che viene sostituta
compile time con y (l'indice non e' importante perche' tutti gli
elementi avranno dimensione y).

> quando salvo, salvo quello che voglio, cioè "D",per il momento è solo un
> char( ma poi sarranno nomi)

Occhio che mi sembra che hai ancora un po' di confusione tra puntatori e
array nel tuo codice.

Un carattere e una stringa sono due tipi di dato diversi.

Bye,
Gabry

Equinox

10/04/2009 10:29:41

0

> Come fai a calcolare la lunghezza di qualcosa che non hai ancora letto (
> strlen(p[1]) )?

Allora scrivo cosi', spero di essere + chiaro per quello che mi serve fare:

io ho:

char *MAGIA[2][4] = 2 SPRITE che hanno 4 NOMI-MAGIA ognuno di lunghezza
varialbile. Col mio compilatore posso anche fare
char >>SENZA *<<< MAGIA[2][4][len stringa]

MAGIA[SPRITE 0] [0] = "MAG 1";
MAGIA[SPRITE 0] [1] = "MAG 345"; ....e cosi' via.

Ora questo char *MAGIA[2][4] all'inizio del gioco è vuoto,, ma poi si
riempi di NOMI MAGIA,,,.

Questo è quello che voglio salvare su disco e poi....ricaricarlo come SAVE
STAE dello SPRITE 0 e SPRITE 1....ma non riesco a farlo,,

neanche con
char >>SENZA *<<< MAGIA[2][4][len stringa].

Spero di essere stato chiaro.

Puoi aiutarmi a risolvere per sempre questo problema,per me? Se no,, non
vado avanti--se non riesco a salvare e a caricare....


GRazie1000.


Gabriele Greco

10/04/2009 10:55:25

0

equinox wrote:
>> Come fai a calcolare la lunghezza di qualcosa che non hai ancora letto (
>> strlen(p[1]) )?
>
> Allora scrivo cosi', spero di essere + chiaro per quello che mi serve fare:
>
> io ho:
>
> char *MAGIA[2][4] = 2 SPRITE che hanno 4 NOMI-MAGIA ognuno di lunghezza
> varialbile. Col mio compilatore posso anche fare

In questo modo il tuo compilatore ha solo allocato 8 puntatori sullo
stack, quando fai

> MAGIA[SPRITE 0] [0] = "MAG 1";

Non fai altro che impostare uno dei compilatori, non viene effettuata
alcuna copia.

> char MAGIA[2][4][len stringa]

In questo modo ha allocato lo spazio per 8 stringhe di lunghezza massima
"len stringa - 1", le stringe in C devono essere NULL terminate.

Per scrivere effettivamente dentro una delle stringhe devi fare:

strcpy(MAGIA[2][4], "MAG 1");


> Ora questo char *MAGIA[2][4] all'inizio del gioco è vuoto,, ma poi si
> riempi di NOMI MAGIA,,,.
> Questo è quello che voglio salvare su disco e poi....ricaricarlo come SAVE

Se usi i puntatori NON puoi salvare il tutto su disco in un solo colpo,
ti conviene utilizzare la seconda formula, stando attento a non sforare
coi nomi delle magie "len stringa".

> STAE dello SPRITE 0 e SPRITE 1....ma non riesco a farlo,,
> neanche con
> char >>SENZA *<<< MAGIA[2][4][len stringa].

In quel modo dovrebbe funzionare.

> Spero di essere stato chiaro.

Sei chiaro nel tuo obbiettivo, ma ti e' poco chiara la distinzione tra
stringhe, puntatori, array, etc, etc...

Ti suggerisco di leggerti un buon libro sul C o magari studiare il C++
direttamente che e` piu` adatto ai giochi e che comunque permette una
gestione delle stringhe un po' + naturale (std::string s = "ciao" fa
quello che tu ti aspetti che faccia, copia la stringa).


> Puoi aiutarmi a risolvere per sempre questo problema,per me? Se no,, non
> vado avanti--se non riesco a salvare e a caricare....

Piu` vai avanti piu` avrai problemi, perche` la complessita cresce, se
non hai chiare le basi.

Ad ogni modo, salvataggio:

char MAGIA[2][4][64];
FILE *f;

memset(MAGIA, 0, sizeof(MAGIA);

strcpy(MAGIA[0][0], "Magia 1");
strcpy(MAGIA[0][1], "Magia 2");
strcpy(MAGIA[0][2], "Magia 3");

if ((f = fopen("save.bin", "wb"))) {
fwrite(MAGIA, 1, sizeof(MAGIA), f);
fclose(f);
}


Caricamento:
char MAGIA[2][4][64];
int i, j;
FILE *f;

if ((f = fopen("save.bin", "rb"))) {
fread(MAGIA, 1, sizeof(MAGIA), f);
fclose(f);
}

for (i = 0; i < 2; i++)
for (j = 0; j < 8; j++)
printf("MAGIA %d,%d = %s", MAGIA[i][j]);

Equinox

10/04/2009 12:01:48

0

> Per scrivere effettivamente dentro una delle stringhe devi fare:
>
> strcpy(MAGIA[2][4], "MAG 1");

Quindi adesso devo andare a cambiare nel codice dove ho messo CHAR *
xxx[][]---> A CHAR xxx[][], GIUSTO?

> In quel modo dovrebbe funzionare.

Finsco di risponderti e provo subito

> Ti suggerisco di leggerti un buon libro sul C o magari studiare il C++
> direttamente che e` piu` adatto ai giochi e che comunque permette una
> gestione delle stringhe un po' + naturale (std::string s = "ciao" fa
> quello che tu ti aspetti che faccia, copia la stringa).

Si, devo prendere qualche libro, adesso + che mai. MA questo compilatore usa
solo C ansi, no C++.

>
> for (i = 0; i < 2; i++)
> for (j = 0; j < 8; j++)
> printf("MAGIA %d,%d = %s", MAGIA[i][j]);

...non so se c'è altro codice, finisce qua il tuo,,,ma il compilatore non
riconsce PRINTF: alternativa?

Graziemolto per la'iuto che mi stai dando.

NIccolo'


Equinox

10/04/2009 12:24:53

0

Grazie Gabriele,

questo funziona e stamap su file come volevo.

Adesso spero che tu legga la mia precedente, per il caricamento-printf

Grazie1000.


> Ad ogni modo, salvataggio:
>
> char MAGIA[2][4][64];
> FILE *f;
>
> memset(MAGIA, 0, sizeof(MAGIA);
>
> strcpy(MAGIA[0][0], "Magia 1");
> strcpy(MAGIA[0][1], "Magia 2");
> strcpy(MAGIA[0][2], "Magia 3");
>
> if ((f = fopen("save.bin", "wb"))) {
> fwrite(MAGIA, 1, sizeof(MAGIA), f);
> fclose(f);
> }
>
>


Equinox

10/04/2009 12:40:32

0

> for (i = 0; i < 2; i++)
> for (j = 0; j < 8; j++)
> printf("MAGIA %d,%d = %s", MAGIA[i][j]);


FATTO!!!!! Risolto tutto. Grazie1000 Gabriele. Ora posso continuare col
codice.

Se avro' bisogno di aiuto,,,so dove scriverti. :o)

NIccolo'


Equinox

10/04/2009 13:05:57

0


"Gabriele Greco" <gabrielegreco@REMOVEUPPERCASETOMAILtin.it> ha scritto nel
messaggio news:xAFDl.19465$VA5.4619@tornado.fastwebnet.it...

....dimenticavo di chiederti:

dal momento che mi hai risolto questo super problem-per me-
saresti cosi' gentile perfavore , di buttarmi giu' (non la pasta).........8
righe(4 x save e 4 x load) su come fare il DUMP della memoria che chiedevo
all'inizio?

Slo per scopo..di prova.. POsso usare CALLOC, FREE, MALLOC, REALLOC, oltre
credo, agli altri del C ansi.

INtanto ti saluto e ringrazio...continuo col codice del mio giochino.

Ah: ultima cosa: il DUMP lo proverei solo sulla GP2X-F200, per questa
consollle che sto facendo il giochino,,,non per winxp.