我正在尝试制作一个程序,以便为学校作业创建播放列表。
为此,我为歌曲和艺术家制作了结构:
struct song {
int id; /* unique identity of the song */
char name[40]; /* name of song */
int duration; /* duration in seconds */
artist* artist; /* pointer to artist */
};
struct artist {
int id; /* unique identity of artist */
char name[30]; /* name of artist (could be a band as well) */
song* songList; /* pointer to array containing all songs from this artist */
int amountSongs;
};
然后,我从文件中读取有关此信息的信息,以获取所有歌曲和所有艺术家的指针数组。
这一切正常。
然后,我尝试创建一个播放列表,我要求用户输入他想要添加到播放列表中的歌曲的ID,并为该歌曲检索指向该歌曲的正确指针:
printf("Type the ID of the song that you want to add\n");
int inputID;
scanf("%i", &inputID);
for(i=0;i<(*numberOfSongs);i++){
if (inputID==((*song_ptr)+i)->id){
printf("Song is found!!!!!\n\n");
songArray = realloc((songArray ), ((numberSongsInPlaylist) + 1) * sizeof(struct song));
struct song *next = songArray + (numberSongsInPlaylist);
next = ((*song_ptr)+i);
numberSongsInPlaylist++;
printf("%i \n", next->id);
printf("%i \n", (*songArray[0]).id);
}
}
如您所见,我在这里打印了ID号。
当前添加的歌曲和Songarray中的第一首歌曲。 (用于调试)
这是问题所在。
第一个打印出next-> id的打印正确的值,第二个打印出似乎是地址的内容。
我尝试了几件事,但没有任何一项工作,因此,我为什么希望这里的人可以帮助我解决这个问题,以下是我尝试过的事情:
printf("%i \n", (**songArray[0]).id); //invalid type unary '*' //does not compile
printf("%i \n", &(*songArray[0]).id); //Prints address (I think, value changes with each run)
printf("%i \n", (*songArray).id); //Error: request for member 'id' in something not a structure or union
printf("%i \n", (*songArray)->id); //Prints address
欢迎您提供任何帮助。
之后,我尝试将这个songarray添加到具有ID,这个songArray和其中歌曲数量的播放列表结构中。
我在以下代码中执行此操作,并在播放列表中打印了值:
*playlist_ptr = realloc((*playlist_ptr ), ((*numberOfPlaylists) + 1) * sizeof(struct playlist));
struct playlist *nextPlay = *playlist_ptr + (*numberOfPlaylists);
nextPlay->id = numberOfPlaylists;
nextPlay->numberOfSongs = numberSongsInPlaylist;
nextPlay->songs = songArray;
printf("song ID %d\n\n", ((*playlist_ptr) + 0)->songs[0]->id);
这将打印与第二个打印语句相同的值。这让我想知道问题是否出在songArray中的数据存储中,但是我找不到错误。
[评论更新]
实际上,它[
songArray
]被声明为struct song **songArray = NULL;
最佳答案
您在这里确实让这个问题变得过于复杂。我假设songArray
被声明为struct song* songArray
?在这种情况下,songArray[0]
返回一个struct song
,而不是struct song*
。在这种情况下,您只需要songArray[0].id
。