Newsgroup: it.comp.lang.c
Titolo: problemi listato

Cari amici del newsgroup,
ho bisogno di allocare dinamicamente un array di n posizioni ed effettuare
per il momento il riempimento. Il compilatore mi dice che non vi sono
errori, ma nel lanciare l'eseguible, non mi consente di effettuare
operazioni sopra. Sapreste aiutarmi? Grazie mille in anticipo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct canzone{
       char titolo[30];
       long int durata;
       };
typedef struct {
   char titolo[30];
   int numCanzoni;
   struct canzone canzoni[25];
   char autore[30];
   float prezzo;
   }CD;
main(){
      int n,nuc,i,j;
      float pre;
      char tit[30],canz[30],aut[30];
   CD *compilation;
      printf("Inserisci il numero di cd da inserire: ");
   scanf("%d\n",&n);
   compilation = (CD*)malloc(n*sizeof(CD));
   for(i=1;i<n;i++){
         printf("Inserisci il titolo del cd: ");
         scanf("%c\n",&tit);
         strcpy(tit,compilation[i].titolo);
         do{
         printf("Inserisci il numero di canzoni contenute nel cd(max 25):
");
         scanf("%d\n",&nuc);
         }while(nuc>25);
         compilation[i].numCanzoni = nuc;
         for(j=1;j<nuc;j++){
            printf("Inserisci il titolo della canzone: ");
            scanf("%c",&canz);
            strcpy(canz,compilation[i].canzoni[j].titolo);
            compilation[i].canzoni[j].durata=0;
               }/*fine del ciclo for*/
         printf("Inserisci il nome dell'autore: ");
         scanf("%c\n",&aut);
         strcpy(aut,compilation[i].autore);
         printf("Inserisci il prezzo: ");
         scanf("%f\n",&pre);
         compilation[i].prezzo=pre;
         };
free(compilation);
}   /*chiusura main*/

 operazioni sopra. Sapreste aiutarmi? Grazie mille in anticipo.
Prima di tutto devi tenere conto che gli indici
degli array nel linguaggio C partono da 0 e non
da 1.
Cioe' se definisci, per esempio, un vettore come
int X[5];
allora avrai  X[0], X[1], X[2], X[3], e X[4].
La stessa cosa vale se avevi allocato dinamicamente X
come
int *X;
X = malloc(5*sizeof(int));
Quindi in particolare, per riempire X dovremo usare
for (i=0; i<5; i++) X[i]=666;
e non
for (i=1; i<=5; i++) X[i]=666;
perche' il secondo modo causera' probabilmente
gravi malfunzionamenti o anche il crash del programma,
perche' ti porta a scrivere "fuori" dell'array.
Nel tuo programma mischi le due cose, cioe' fai partire gli indici da 1 
e pero' fai il test i<LIMITE, cioe' esegui il ciclo LIMITE-1 volte,
(dove LIMITE vale nel tuo caso n e nuc)
che in particolare, se LIMITE=1, non verranno eseguiti neanche una volta.
Non ho guardato il resto del programma.
ciao,
g.

 Cari amici del newsgroup,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct canzone{
       char titolo[30];
       long int durata;
       };
typedef struct {
   char titolo[30];
   int numCanzoni;
   struct canzone canzoni[25];
   char autore[30];
   float prezzo;
   }CD;
int main(){ /// int main(void) oppure int main(int argc, char* argv[])
      int n,nuc,i,j;
      float pre;
      char tit[30],canz[30],aut[30];
   CD *compilation;
      printf("Inserisci il numero di cd da inserire: ");
      scanf("%d",&n); /// ??? '\n' di troppo
   compilation = malloc(n*sizeof(CD)); //  cast di troppo
   for(i=0;i<n;i++){ /// ??? i dovrebbe partire da 0
         printf("Inserisci il titolo del cd: ");
         scanf("%s",&tit); // ???  %s non %c
         strcpy(compilation[i].titolo, tit); // ????
         // strcpy(stringaCopia, stringa_Da_Copiare);
         do{
         printf("Inserisci il numero di canzoni contenute nel cd(max
25):");
         scanf("%d",&nuc);
         }while(nuc>25);
         compilation[i].numCanzoni = nuc;
         for(j=0;j<nuc;j++){ // ???
            printf("Inserisci il titolo della canzone: ");
            scanf("%s",&canz); /// ???
            strcpy(compilation[i].canzoni[j].titolo, canz);
            compilation[i].canzoni[j].durata=0;
               }/*fine del ciclo for*/
         printf("Inserisci il nome dell'autore: ");
         scanf("%s\n",&aut); /// ???
         strcpy(compilation[i].autore, aut); /// ???
         printf("Inserisci il prezzo: ");
         scanf("%f",&pre); /// ???
         compilation[i].prezzo=pre;
         };
free(compilation);
}   /*chiusura main*/
mi sembra sia tutto...
O meglio ci sarebbe molto da dire sia sull'uso della scanf(), sui
buffer a dimensione prestabilita e soprattutto della totale assenza
di controlli, ma poi Resta mi dice che sono palloso :-)
HTH
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 di controlli, ma poi Resta mi dice che sono palloso :-)
Non mi sono mai permesso di esprimermi in cotal guisa.
Secondo me fai benissimo a dire: se e quando le persone arriveranno
a fare programmi "seri", magari una tua parola detta ora qui avra' 
germinato nella loro testa e gli fara' risparmiare giorni di debugging...
Quello che io dico (a volte) e' che se uno sta scrivendo programmini
di poche righe per fare esperimenti e  impratichirsi di certi costrutti
del  linguaggio forse tanto vale concentrarsi su quelli e non scrivere
il programma come dovesse regolare il nocciolo di una centrale nucleare
:-) Comunque sono consapevole che questa mia posizione dipende piu'
dalla mia pigrizia intrinseca che da una reale convinzione....
ciao,
g.

 Non mi sono mai permesso di esprimermi in cotal guisa.
:-)
