Newsgroup: it.comp.lang.c
Titolo: fscanf

Salve. 
Scusate, ma č possibile che una chiamata a fscanf possa cambiare il
valore di una variabile che non c'entra con la chiamata?
A me succede cosi'. Dopo aver assegnato il valore ad una variabile, e
dopo una chiamata a fscanf (che non c'entra con la variabile) , il
valore č cambiato. Piů precisamente io ho:
char *nome      che ha come valore :   "0"
Dopo una chiamata a fscanf assume questo valore (almeno cosě mi
segnala il gdb del Djgpp) :     "\230\034\024"
Ed il valore non cambia ogni volta.
Potete aiutarmi? Grazie
Giacomo               

...


 Ed il valore non cambia ogni volta.
Il fatto che non cambi č solo una questione di fortuna, punta ad un'area
di memoria nn utilizzata. 
Ho il sospetto che nome non venga allocato, hmmm....
puoi usare 
char nome[128];
nome[0] = 0x00;
e poi fscanf
Ciao.

 valore di una variabile che non c'entra con la chiamata?
Se c'è un errore di corrispondenza tra specificatori di formato e tipo
delle variabili effettivamente fornite questo può capitare. Controlla
bene.
EMG

Ed il valore non cambia ogni volta.
Devi postare il codice incriminato.
Comunque ti dico subito che e' possibile che manchi l'inizializzazione
di qualche puntatore.
--
Andrea Laforgia
andrea_...@bigfoot.com

e poi fscanf
fscanf non ha bisogno che la variabile sia azzerata.
--
Andrea Laforgia
andrea_...@bigfoot.com


andrea_...@bigfoot.com
Giacomo

EMG
Cosa vuoi dire? 

Ciao.
Si ma io avrei bisogno di un puntatore.
Ciao e grazie.


andrea_...@bigfoot.com

 Cosa vuoi dire?
Forse mi sto sbagliando e il compilatore controlla queste cose, ma se
leggi una stringa con %d o un intero con %s cosa succede?
EMG

Che gli č stato assegnato come valore lo 0
Allora e' diverso da cio' che hai scritto.
Non e' per essere pignoli, ma la cosa ha realmente due significati
molto diversi.
Scrivere  
char *nome = "0" ;
e' molto diverso da 
char *nome = 0 ;
Ed il motivo (intuibile) e' che nel primo caso compi un'assegnazione
tra puntatori, nel secondo, invece, assegni al puntatore un valore
nullo.
--
Andrea Laforgia
andrea_...@bigfoot.com

temp->name = &stringa[0];
Scrivere 
temp->name = stringa ;
equivale a
temp->name = &stringa[0] ;
stringa, difatti, essendo un vettore, decade nel puntatore al suo
primo elemento, cioe' proprio in &stringa[0].   
Pero', stai attento, perche' temp->name, adesso, punta ai caratteri di
stringa e, probabilmente, non e' questo che vuoi fare, quanto invece
allocare un nuovo spazio per temp->name e copiarci dentro i caratteri
di stringa.
--
Andrea Laforgia
andrea_...@bigfoot.com


andrea_...@bigfoot.com
Giacomo

EMG
No, no, non ci sono questi problemi, al massimo posso aver letto uno
short int con %d , ma oltre aquesto no.

Ed infatti temp->name deve valere 0, non un valore nullo.
Non mi sono spiegato : dire "temp->name deve valere 0" equivale a dire
che temp->name deve avere un valore nullo...
--
Andrea Laforgia
andrea_...@bigfoot.com

Quindi dove sta il prpblema?
Il problema e' che non ci fai vedere il codice sorgente, per cui e'
difficile farsi un'idea di cosa succeda di preciso...
--
Andrea Laforgia
andrea_...@bigfoot.com


andrea_...@bigfoot.com
Ecco il codice:
STRUCT TYPE {
    .....
    STRUCT_DATA *req [MAX_NUMBER];
    .....
};
STRUCT_DATA {
    char *name;
    short int value;
    short int type;
    STRUCT_DATA *next;
};
struct  STRUCT_TYPE  STRUCT_TABLE [NUMERO] = 
{
      {...........
      },
      {.........
      }
} 
Ecco il codice:
void open_file() 
{
	FILE *file;
	short int lvsk;
	char nome[30];
	STRUCT_TYPE *type_struct;
	if ( !(file = fopen("file.txt","r") ) ) 
		return;
	else {
                          	while ( !feof(file) ) {
			fscanf (file,"%*[ \t\n] %[ A-Za-z] %hd", nome,
&lvsk);
			while (lvsk > 0){ 
				lvsk--;
				type_struct = &struct_table[numero];
				type_struct->req[lvsk] = (REQ_DATA
*)malloc(sizeof(REQ_DATA));
				read_req_file (type_struct->req[lvsk],
ftell (file), file);
				fscanf ( file,"%d" , &lvsk);     /* č
dopo questa chiamata che il valore viene cambiato   */
			}
		}
	}
	fclose (file);
	return;
}
 
void read_req_file(STRUCT_DATA *req_struct, long pos_cor, FILE *file) 
{
	STRUCT_DATA *temp;
	char stringa[20],tipo[20], oper[5], tmp_str[15];
	short int valore;
	temp = req_struct;
    fseek (file, pos_cor, SEEK_SET);
 
	fscanf (file,"%s %d %s %s" , stringa, &valore, tipo, oper);
	if (strstr (stringa,"NOT") != 0) 
		temp->name = &stringa[3];
	else 
		temp->name = stringa;
 
	temp->value = valore;
	temp->type = conv_req_word (tipo) ;    /* La funzione
conv_req_word converte una data parola con un numero  */
	if(temp->type == 4) {
		strcpy( tmp_str, temp->name);
		if (! strcmp (tmp_str,"uno")) 
			strcpy( tmp_str , "0");
		else if(!strcmp(tmp_str,"due"))
			strcpy( tmp_str , "1");
		else if(!strcmp(tmp_str,"tre")) 
			strcpy( tmp_str , "2");
		else if(!strcmp(tmp_str,"quattro")) 
			strcpy( tmp_str , "3");
		else if(!strcmp(tmp_str,"quinto")) 
			strcpy( tmp_str , "4");
		temp->name = &tmp_str[0];
	}
	temp->pc_oper = conv_req_word(oper);
	if (strcmp(oper,"STOP")){
		temp->next = (REQ_DATA *)malloc(sizeof(REQ_DATA));
		read_req_file(temp->next,ftell(req_file),req_file);
	}
	else 
		temp->next = NULL;
	return;
}

 				fscanf ( file,"%d" , &lvsk);
Non ho guardato il resto ;), ma sicuramente questo è un problema: stai
memorizzando un int mentre hai riservato posto per uno short int.
[root@fokhouse /root]# cat >lung.c
#include <stdio.h>
int main()
{
        printf("int = %d; short = %d\n", sizeof(int), sizeof(short int));
        return 0;
}
[root@fokhouse /root]# gcc -o lung lung.c -Wall -ansi -pedantic
[root@fokhouse /root]# ./lung
int = 4; short = 2
[root@fokhouse /root]#
Se vuoi leggere uno short int, la sintassi corretta è
 
 fscanf(file, "%hd", &lvsk);
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

memorizzando un int mentre hai riservato posto per uno short int.
E' esattamente questo il problema (ho verificato) e cioe' la mancanza
di %hd.
--
Andrea Laforgia
andrea_...@bigfoot.com


andrea_...@bigfoot.com

Ho cambiato il codice, ma il problema permane.
Se tu potessi fornirci una versione *compilabile* del programma, si
potrebbe aiutarti a fare il debug.
--
Andrea Laforgia
andrea_...@bigfoot.com