さて、これは私が行う必要がある 1 つの演習ですが、プログラムに新しいアルバムを登録しようとして、アーティストを 1 つ選択すると機能しなくなります。
私のプログラムがクラッシュする理由を知っている人はいますか? コンソール/デバッグ/コンパイルにエラーはありません。
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;
}