Newsgroup: it.comp.lang.c
Titolo: c'e' un problema

forse chiedo troppo...
ho un altro programma che non funziona.
il programma lavora su un file come questo (virgolette escluse)
"4
FondInf1 ProgeSW1  0
FondInf2 ProgeSW2  5
BasiDati BasiDati  0
Fisica1  ElemFis1  5"
queste sono le trutture dichiarate nel programma
struct elemento {
	char nomeVO[9];
	char nomeNO[9];
	int crediti;
};
typedef struct elemento ELEM;
struct elemento2 {
	char nome[9];
	struct elemento2 *next;
};
typedef struct elemento2 ELEM2;
questa č la funzione lista(), in cui il programma si blocca. piů sotto
ci sono le due funzioni chiamate da lista().
ELEM2* lista(char nomefile[20],ELEM2 *pStart1, int *crediti)
{
	ELEM *V;
	int *n, i = 0, j = 0, c;
	ELEM2 *pStart2, *pTmp, *pNext;
	char nome[9];
	*crediti = 0;
	V = creaVettore(nomefile, &n);
	while (pStart1 != NULL) {
		if (i == 0) {
			pStart2 = malloc(sizeof(ELEM2));
			pTmp = pStart2;
			pTmp->next = NULL;
		}
		else {
			pNext = malloc(sizeof(ELEM2));
			pTmp->next = pNext;
			pNext->next = NULL;
			pTmp = pTmp->next;
		}
		i++;
		prendiInfo(V, pStart1->nome, nome, &c, *n);
/*******************************************************************/
/* ****a questo punto il programma crasha************************** */
/********************************************************************/
/*tuttavia, la funzione prendiInfo credo che sia giusta, in quanto */
/* funziona in un'altra parte di programma (che non ho copiato qui */
		strcpy(pTmp->nome, nome);
		*crediti += c;
	}
	return pStart2;
}
void prendiInfo(ELEM *V, char codiceVO[9], char codiceNO[9], int
*crediti, int n)
{
	int i = 0, trovato = 1;
	while ((i < n) && (trovato != 0))
		trovato = strcmp(V[i++].nomeVO, codiceVO);
	i--;
	if (trovato == 0) {
		strcpy(codiceNO, V[i].nomeNO);
		*crediti = V[i].crediti;
	}
}
ELEM* creaVettore(char nomefile[20], int *n)
{
	ELEM *V;
	int i = 0, crediti;
	FILE *f;
	char nomeVO[9], nomeNO[9];
	if ((f = fopen(nomefile, "r")) != NULL) {
		fscanf(f, "%d", n);
		V = malloc(sizeof(ELEM) * (*n));
		while (!feof(f)) {
			fscanf(f, "%s%s%d", nomeVO, nomeNO, &crediti);
			strcpy(V[i].nomeVO, nomeVO);
			strcpy(V[i].nomeNO, nomeNO);
			V[i].crediti = crediti;
			i++;
		}
	}
	else {
		printf("errore!\n");
		exit(1);
	}
	return (V);
}
/* 
č troppo incomprensibile e devo postare il programma completo?
grazie per l'attenzione !
*/

 strcpy(codiceNO, V[i].nomeNO);
codiceNO[]  e' meglio lasciarlo stare. Dalla comp.lang.c FAQ:
1.32: What is the difference between these initializations?
  char a[] = "string literal";
  char *p  = "string literal";
 My program crashes if I try to assign a new value to p[i].
A: A string literal can be used in two slightly different ways.  As
 an array initializer (as in the declaration of char a[]), it
 specifies the initial values of the characters in that array.
 Anywhere else, it turns into an unnamed, static array of
 characters, which may be stored in read-only memory, which is
 why you can't safely modify it.  In an expression context, the
 array is converted at once to a pointer, as usual (see section
 6), so the second declaration initializes p to point to the
 unnamed array's first element.
 (For compiling old code, some compilers have a switch
 controlling whether strings are writable or not.)
 See also questions 1.31, 6.1, 6.2, and 6.8.
 References: K&R2 Sec. 5.5 p. 104; ISO Sec. 6.1.4, Sec. 6.5.7;
 Rationale Sec. 3.1.4; H&S Sec. 2.7.4 pp. 31-2.
--
-=[]=- 
ian...@libero.it
 -=[]=-
Now working... seeh ;-)

 ammetto che ciň mi č poco comprensibile.
Lascia perdere, non tenere conto di quel che ho detto, sono io che ho
capito il contrario.
/me soffre terribilmente il caldo.


 /* funziona in un'altra parte di programma (che non ho copiato qui */
Penso di sì, non ho finito di controllare.
Ciao!
--
Paolo Giarrusso