2013-06-23 53 views
-2

嗯,這是我需要做的一項練習,但我堅持在這一點上,我試圖在我的程序中註冊一個新專輯,當我將選擇一個藝術家停止工作。我的程序停止工作

任何人都知道我的程序崩潰的原因?我在控制檯/調試/編譯中沒有任何錯誤。

funcoes.c

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <ctype.h> 
    #include "funcoes.h" 

    void mostraMenu(void) 
    { 
     printf("\n\nChoose one \n 1 - Register Artist \n 2 - Register Music \n 3 - Register Album \n 4 - List Music \n 5 - List Artist\n 0 - Exit \n"); 
    } 

    void cadastrarArtista(Artista **vetArt , int nArt) 
    { 

     Artista *tmp; 
     tmp = (Artista*)malloc(sizeof(Artista)); 
     setbuf(stdin, NULL); 
     printf("Informe o nome do artista:\t"); 
     scanf("%[^\n]s", tmp->nome); 
     setbuf(stdin, NULL); 

     printf("Informe a nacionalidade:\t"); 
     scanf("%[^\n]s", tmp->nacionalidade); 
     setbuf(stdin, NULL); 

     vetArt[nArt] = tmp; 
    } 

    void cadastrarMusica(Musica **vetMus , int nMus) 
    { 

     Musica *tmp; 
     tmp = (Musica*)malloc(sizeof(Musica)); 
     setbuf(stdin, NULL); 
     printf("Informe o nome da musica:\t"); 
     scanf("%[^\n]s", tmp->nome); 
     setbuf(stdin, NULL); 

     printf("Informe o ano:\t"); 
     scanf("%d", &tmp->ano); 
     setbuf(stdin, NULL); 

     vetMus[nMus] = tmp; 
    } 

    void cadastrarAlbum (Album *vetAlbum, Musica **vetMusica, int tamanhoMusicas, Artista **vetArtistas, int tamanhoArtistas) 
    { 
     Album albumAux; 
     vetAlbum->musicas =(Musica**) malloc(sizeof(Musica *)); 
     vetAlbum->artistas = (Artista**) malloc(sizeof(Artista *)); 

     int numArtAlb, numMusAlb, i,a = 0; 
     char _nome[TAM_NOME] , _musica[TAM_NOME]; 
     if(tamanhoArtistas == 0 || tamanhoMusicas == 0) 
     { 
      printf("There is not at least one artist/music"); 
      return; 
     } 

     printf("\tName of the album:\t"); 
     setbuf(stdin, NULL); 
     scanf("%[^\n]s", vetAlbum->nome); 
     setbuf(stdin, NULL); 
     printf("\tYear of the album:\t"); 
     scanf("%d", &vetAlbum->ano); 
     setbuf(stdin, NULL); 

     while(a != 3) 
     { 
      start: 
      printf("\t1 - Associate an Artist with album \n\t2 - Associate music with album\n\t3 - Parar\n"); 
      scanf("%d", &a); 
      switch(a) 
      { 
       case 1: 

        printf("\tArtist Name:\t"); 
        setbuf(stdin, NULL); 
        scanf("%[^\n]s", _nome); 
        setbuf(stdin, NULL); 

        for(i = 0; i < tamanhoArtistas; i++) 
        { 
         if (strcmp(vetArtistas[i]->nome, _nome) == 0) 
         { 
          printf("\tArtist Found!\n"); 
          vetAlbum->artistas[numArtAlb] = vetArtistas[i]; 
          numArtAlb += 1; 

          vetAlbum->num_artistas = numArtAlb; 
          albumAux.artistas = (Artista**)malloc((numArtAlb +1)*sizeof(Artista*)); 

          if (albumAux.artistas != NULL) 
          { 
           vetAlbum->artistas = albumAux.artistas; 
          } 
          break; 
         } 
         else if(strcmp (vetArtistas[i]->nome, _nome) != 0 && i == tamanhoArtistas-1) 
         { 
          printf("\tThis Artist does not exist!\n"); 
          goto start; 
         } 
        } 
        break; 
        //FIM FOR 

       case 2: 
        printf("\tName of the music:\t"); 
        setbuf(stdin, NULL); 
        scanf("%[^\n]s", _musica); 
        setbuf(stdin, NULL); 

        for(i = 0; i < tamanhoMusicas; i++) 
        { 
         if (strcmp(vetMusica[i]->nome, _nome) == 0) 
         { 
          printf("\tMusic Found!\n"); 
          vetAlbum->musicas[numMusAlb] = vetMusica[i]; 
          numMusAlb += 1; 

          vetAlbum->num_musicas = numMusAlb; 
          albumAux.musicas = (Musica**)malloc((numMusAlb +1)*sizeof(Musica*)); 

          if (albumAux.musicas != NULL) 
          { 
           vetAlbum->musicas = albumAux.musicas; 
          } 
          break; 
         } 
         else if(strcmp (vetMusica[i]->nome, _musica) != 0 && i == tamanhoMusicas-1) 
         { 
          printf("\tMusic not found!\n"); 
          goto start; 
         } 
        } 
        break; 

       case 3: 

        if(numArtAlb == 0 || numMusAlb == 0){ 
         printf("\tOne album need at least one music/artist!\n"); 
         goto start; 
        }else{ 
         break; 
        } 

       default: 

        printf("Invalid Option\n"); 
        break; 
      } 
      //FIM SWITCH 

     } 
     //FIM WHILE 
    } 
//FIM FUNCAO 

funcoes.h

#ifndef funcoes_h 
#define funcoes_h 

/* Definição do tamanho máximo de um nome */ 
#define TAM_NOME 80 

typedef struct { 
    char nome[TAM_NOME]; 
    int ano; 
} Musica; 

typedef struct { 
    char nome[TAM_NOME]; 
    char nacionalidade[TAM_NOME]; 
} Artista; 

typedef struct { 
    char nome[TAM_NOME]; 
    int ano; 
    Musica **musicas; 
    int num_musicas; 
    Artista **artistas; 
    int num_artistas; 
} Album; 

void mostraMenu(void); 
void cadastrarArtista(Artista **vetArt, int nArt); 
void cadastrarMusica(Musica **vetMus, int nMus); 
void cadastrarAlbum(Album *vetAlbum, Musica **vetMusica, int tamanhoMusicas, Artista **vetArtistas, int tamanhoArtistas); 
#endif 

的main.c

#include <stdio.h> 
#include <stdlib.h> 
#include "funcoes.h" 
int main (void) 
{ 
Artista **vetArt = (Artista**)malloc(sizeof(Artista*)); 
Musica **vetMus = (Musica**)malloc(sizeof(Musica*)); 
Album *vetAlbum = (Album*)malloc(sizeof(Album)); 

int nArt = 0; 
int nMus = 0; 
int nAlb = 0; 
int opcao; 
int op = 0; 

while(op == 0) 
{ 
    mostraMenu(); 
    scanf("%d",&opcao); 
    if (opcao == 0) 
    { 
     op = 1; 
     break; 
    } 
    else if (opcao == 1) 
    { 
     Artista **artAux = (Artista**)malloc((nArt+1)*sizeof(Artista*)); 
     if (artAux == NULL) 
     { 
      printf("Alocacao invalida."); 
      exit(EXIT_FAILURE); 
     } 
     free(artAux); 
     cadastrarArtista(vetArt , nArt); 
     nArt += 1; 

    }else if (opcao == 2) 
    { 
     Musica **musAux = (Musica**)malloc((nMus+1)*sizeof(Musica*)); 
     if (musAux == NULL) 
     { 
      printf("Alocacao invalida."); 
      exit(EXIT_FAILURE); 
     } 
     free(musAux); 
     cadastrarMusica(vetMus , nMus); 
     nMus += 1; 

    }else if (opcao == 3) 
    { 
     cadastrarAlbum(vetAlbum, vetMus, nMus, vetArt, nArt); 
     nAlb += 1; 
    } 
} 
return 0; 
} 
+0

不要使用'realloc'。 – Elazar

+0

和'Album * vetAlbum =(Album *)malloc(sizeof(Album *));'是錯誤的。你需要'sizeof(專輯)' – Elazar

+0

你到目前爲止嘗試過什麼?你有什麼問題?見www.whathaveyoutried.com – Thilo

回答

0

編譯鏗鏘你的代碼產生相關的事實幾個警告,numArtAlbnumMusAlb在被初始化之前被使用。它們應該初始化爲零:

int numArtAlb = 0, numMusAlb = 0, i,a = 0; 
+0

真是太遺憾了。這是一個簡單的錯誤。感謝黃昏,它現在正在工作。 –