Newsgroup: it.comp.lang.c
Titolo: problema curioso da neofita che non dovrebbe esserlo...

Salve
   scusate la fretta ma ho un grosso problema (esame) e sono lontano da
tutti i miei colleghi a cui poter chiedere: non riesco a passare una doppia
struttura ad una funzione e a farla funzionare.
mi spiego meglio, anzi no vi do il listato con il testo dell'esercizio
--Si consideri il caso dei dati che rappresentano lo statodel libretto di
uno studente.
si assuma che la rappresentazione includa nome, cognome,matricola e l'elenco
degli esami sostenuti. per ciascun esame sia riportato il nome del corso e
la valutazione.
Si definisca la struttura adeguata
si definisca la funzione che riceve in ingresso un vettore di descrittori di
studenti e un numero di matricola,e che restituisce in uscita  il numero di
esami sostenuti e la somma dei voti conseguiti dallo studente con il numero
di matricola assegnato.
il programma che ho fatto ha sostanzialmente un problema (chiamato "primo
problema"): non so come fargli prendere i dati e buttarli negli esami di
quel singolo studente. forse ho sbagliato a inizializza re la lista degli
esami.
#include <stdio.h>
#include <stdlib.h>
typedef int boolean;  /* definisco una boolean*/
#define true 1
#define false 0
struct student       /*struttura degli studenti...*/
{
   char nome[81];
   char cognome[81];
   int matricola;
   struct esami *data;  /*...con richiamo a quella degli esami*/
};
struct esami  /*struttura delgi esami*/
{
   char corso[81];
   int voto;
   struct esami*nextptr;
};
/* funzione di inserimento*/
void insert(struct student*matriceptr, struct esami*esam, int nl)
{
   int count,nes=0,matricola=1;
/*  nome=matriceptr[count].nome;*/
/*  cognome=matriceptr[count].cognome;*/
   for (count=1; count<=nl; count++)
   {
      printf("libretto 
n.ro
 %d della matricola %d\n", count, matricola);
      printf("- dammi il nome: ");
      scanf("%s",&(matriceptr[count].nome));
      printf("- dammi il cognome: ");
      scanf("%s",&(matriceptr[count].cognome));
      printf("- Immatricolazione automatica: %d\n", matricola);
      matricola++;
      printf("dammi il numero di esami da inserire: ");
      scanf("%d",&nes);
      if (nes==0)
      {
         printf("Nessun esame\n");
  esam=NULL;
      }
      else
      {
         esam=NULL;
         esam=(struct esami*)malloc(nes*sizeof(struct esami));
         while (esam!=NULL)
         {
            printf("dammi il nome del corso: ");
            scanf("%s",&(matriceptr[count].exams->corso));  /*primo
problema*/
            printf("dammi il voto dell'esame: ");
            scanf("%d",&(matriceptr[count].exams->voto));  /*primo
problema*/
            esam=esam->nextptr;
         }
      }
   }
}
void main()
{
   boolean found=false;
   int c,nl,cercmatr,*nesami=0,*somma=0;
   char choice;
   struct student*arrayptr;
   struct esami*exams;
   printf("---------------------\n");
   printf("Dammi numero dei libretti:");
   scanf("%d",&nl);
   arrayptr=(struct student*)malloc(nl*sizeof(struct student));
   insert(arrayptr,exams,nl);
   printf("dammi la matricola da cercare: ");
   scanf("%d",&cercmatr);
   found=getdata(arrayptr,exams,nl,cercmatr,nesami,somma);
   if (found=true)
   {
      printf("----- R E S U L T -----\n");
      printf("-maricola: %d\n",cercmatr);
      printf("numero di esami sostenuti: %d\n",nesami);
      printf("totale punti: %d\n",somma);
   }
   else printf("----- N O   R E S U L T -----");
   printf("\n");
   printf("     ciao belli-->fine programma!!\n");
   getch();
}
/* funzione che prende il valore della matricola e cerca lo studente */
boolean getdata(struct student *studenti,struct esami*ciro, int nstudent,int
matricola,int *nesami,int *somma)
{
   int count=0;
   boolean found=false;
   while((count<nstudent)&&(found=false))
   {
      if(studenti[count].matricola==matricola)
      {
         getvalue(studenti[count].data,nesami,somma);
         return true;
      }
      else
      count++;
   }
   return found;
}
/* funzione che calcola il numero degli esami e la somma dei voti*/
getvalue(struct esami *esamiptr,int *numeroptr,int *sommas)
{
   int  *numptr;
   int  *sum=0;
   (*numptr)=0;
   while(esamiptr!=NULL)
   {
      (*sum)+=esamiptr->voto;
      (*numptr)++;
      esamiptr=esamiptr->nextptr;
   }
}
Scusate ancora se vi importuno, ma come ho detto non ho nessuno a cui
chiedere.
se notate altri errori segnalatemeli
Ve ne sono infinitamente grato in anticipo!!!:)

      }
Il ciclo e' impostato male, devi verificare se nesam != 0 e di conseguenza:
-allocchi spazio per struct esame
-memorizzi i dati in struct esame
-inserisci la struct esame nella lista.
-decrementi 'nesam'
Per gestire l'allocazione e l'inserimento nella lista degli esami ... beh e'
lasciato ad esercizio ( scusa, ma sta spiegato in ogni testo di FI; se to lo
spiegassi perderebbe senso fare di questi esercizio )