Newsgroup: it.comp.lang.c
Titolo: Problema paranormale

Ciao a tutti
ho un problema stranissimo, uso gcc 4.1.2 e all'interno di un semplicissimo
ciclo for mi stampo una variabile precedentemente inizializzata ad un certo
valore. Il problema è che mi stampa zero!!!! e variando l'indice del ciclo a
volte ottengo il valore esatto che avevo precendentemente fissato, com'è
possibile??
chi può illuminarmi??
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Perche' non posti il codice incriminato?


eccolo...
int executing(float x[2], char net_filename[80], float *y, float *hidden)
{
	float net_matrix1[2][2];
	float net_matrix2[2][2];
	int l,m,n,o,p,q,r;
	if ((stream8 = fopen(net_filename, "r")) == NULL)
        {
		printf("%s\n"," ");
		printf("%s\n","I cannot read you matrix learned file. Program aborted.");
		printf("%s\n"," ");
		return;
	}
	else
	{
		stream8=fopen(net_filename,"r");
		printf("%s %s\n","Reading your matrix learned file ",net_filename);
 
		while (!feof(stream8))
        	{
 
			fscanf(stream8,"%f %f",&net_matrix1[1][1],&net_matrix1[1][2]);
			fscanf(stream8,"%f %f",&net_matrix1[2][1],&net_matrix1[2][2]);
			fscanf(stream8,"%f %f",&net_matrix2[1][1],&net_matrix2[1][2]);
			fscanf(stream8,"%f %f",&net_matrix2[2][1],&net_matrix2[2][2]);
		}
	         // CONTROLLO SE HO ACQUISITO BENE I DATI DAL FILE
		printf("%f %f\n",net_matrix1[1][1],net_matrix1[1][2]); // QUI MI STAMPA
VALORI OK
		printf("%f %f\n",net_matrix1[2][1],net_matrix1[2][2]); // QUI MI STAMPA
VALORI OK
		printf("%f %f\n",net_matrix2[1][1],net_matrix2[1][2]); // QUI MI STAMPA
VALORI OK
		printf("%f %f\n",net_matrix2[2][1],net_matrix2[2][2]); // QUI MI STAMPA
VALORI OK
                // ENTRO NEL CICLO PER MANIPOLARE DATI
		for (m=1;m<3;m++)
		{
                        printf("%f %f\n",net_matrix1[2][1],net_matrix1[2][2]); // QUI IL PRIMO E' OK
IL SECONDO E' ZERO ! ! ! ! ! ! ! ! ! ! ! ! !
			for (n=1;n<3;n++)
			{
		             printf("%f %f\n",net_matrix1[1][1],net_matrix1[1][2]); // QUI MI STAMPA
VALORI OK
		             printf("%f %f\n",net_matrix1[2][1],net_matrix1[2][2]); // QUI MI STAMPA
ENTRAMBI ZERO ! ! ! ! ! ! ! ! ! !
		             printf("%f %f\n",net_matrix2[1][1],net_matrix2[1][2]); // QUI MI STAMPA
VALORI OK
		             printf("%f %f\n",net_matrix2[2][1],net_matrix2[2][2]); // QUI MI STAMPA
VALORI OK
                             //Other operations


Prova a sostituire gli 1 con 0 e i 2 con 1.
Quando definisci l'array net_matrix, il [2] e' la dimensione.
Ma quando usi net_matrix, il [2] e' l'offset, ovvero l'indirizzo di
net_matrix + 2.
Se vuoi il primo valore di net_matrix, devi usare net_matrix[0],
ovvero net_matrix+0, ovvero net_matrix.

 ha scritto:
Ok ma perchè fuori dal ciclo for mi stampa una cosa e appena entra dentro mi
stampa una cosa diversa, è la stessa riga di codice..

--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Siccome stai manipolando memoria che non ti appartiene, sei nel regno
dell' "undefined behaviour", ovvero: solo un debugger ti puo' aiutare
a questo punto.
Stai facendo qualcosa di non definito, e ne' il linguaggio, ne' il
compilatore possono garantire nulla, anzi, a questo punto potrebbe
anche partire un missile.
Ad una prima passata, penso che il motivo per cui la prima volta che
stampi i valori funziona, e' che li leggi non appena li hai scritti,
quindi le regioni di memoria 'che non ti appartengono' ma che tu hai
appena modificato sono ancora nello stato che le hai lasciate.
Non appena inizi il ciclo for, con la variabile m e n, scrivi memoria
stack, fai dei salti avanti e indietro, potrebbe pure esserci il loop-
unrolling del compilatore... insomma la memoria che avevi toccato ma
che non ti apparteneva e' stat utilizzata per altri scopi. E da qui,
la lettura di valori che non sono i tuoi.


--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 a farlo funzionare bene..
Un ebugger non iplica necessariamente un ide. Se  usi gcc avrai gdb. 
Prova ad installare (se non c'è  già)  ddd:  è  un'  ottima interfaccia 
grafica per gdb (ed anche altri debugger).
Giorgio

		stream8=fopen(net_filename,"r");
Č inutile riaprire il file.