2013-06-23 2 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

및'앨범 * vetAlbum = (앨범 *) malloc (sizeof (Album *)); '틀 렸습니다. 'sizeof (Album)'가 필요합니다. – Elazar

+0

지금까지 해보신 것은 무엇입니까? 너의 문제는 무엇인가? www.whathaveyoutried.com을 참조하십시오. – Thilo

답변

0

는 사실에 관련된 몇 가지 경고를 산출 numArtAlbnumMusAlb 그 초기화되기 전에 사용됩니다. 그들은 아마도 0으로 초기화되어야합니다 :

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

정말 수치 스럽습니다. 간단한 실수 야. 황혼 고마워. 지금 일하고있어. –

관련 문제