gpt4 book ai didi

将特定结构成员复制到另一个结构

转载 作者:行者123 更新时间:2023-11-30 20:35:46 26 4
gpt4 key购买 nike

所以我有一个文件,我必须从中加载许多轨道,找到长度超过 3:30 的轨道并找到这些轨道的平均 bpm。

这是我的代码。

主文件:

#include <stdio.h>  
#include "functions.h"
int main(void)
{
Playlist *all, *long_tracks;
float avg_bpm;
all = load_tracks("tracks.txt");
long_tracks = get_tracks_longer_than(3,30,all);
print_playlist(long_tracks);
avg_bpm = get_avg_bpm(long_tracks);

printf("Average BPM of the playlist is: %.2f\n", avg_bpm);

return 0;
}

标题:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

typedef struct track {
char track[250];
float bpm;
int mm, ss;
} Track;

typedef struct playlist {
int count;
Track **tracks;
} Playlist;


void print_playlist(Playlist *list);
Playlist* load_tracks(char *filename);
Playlist* get_tracks_longer_than(int mm, int ss, Playlist* all);
float get_avg_bpm(Playlist *list);

#endif

功能:

#include <stdio.h>  
#include <stdlib.h>
#include <string.h>
#include "functions.h"


void print_playlist(Playlist *list) {
int i;
for (i = 0; i < list->count; i++) {
printf("%s (%d:%d) [%f]\n", list->tracks[i]->track, list->tracks[i]->mm, list->tracks[i]->ss, list->tracks[i]->bpm);
}
}

Playlist* load_tracks(char *filename) {
int n,i;
Playlist *list = (Playlist*) malloc(sizeof(Playlist));
Track *tracks;

FILE *f = fopen(filename, "r");
fscanf(f, "%d", &n);
printf("Tracks: %d\n", n);

tracks = (Track*) malloc(n*sizeof(Track));
list->tracks = (Track**) malloc(n*sizeof(Track*));

for (i = 0; i < n; i++) {
fscanf(f, "%d:%d", &tracks[i].mm, &tracks[i].ss);
fscanf(f, "%f", &tracks[i].bpm);
fgetc(f);
fgets(tracks[i].track, 250, f);
tracks[i].track[strlen(tracks[i].track)-1] = '\0';
list->tracks[i] = &tracks[i];
}


list->count = n;
return list;
}

Playlist* get_tracks_longer_than(int mm, int ss, Playlist* all) {
Playlist *longSongs = (Playlist*) malloc(sizeof(Playlist));

Track *tracks;
tracks = (Track*) malloc(all->count*sizeof(Track));
longSongs->tracks = (Track**) malloc(all->count*sizeof(Track*));

int i, n = 0;

for(i=0;i<all->count;i++)
{

if(all->tracks[i]->mm>mm)
{
n++;
memcpy ( &longSongs, &all, sizeof(all) ); //I also tried longSongs[i]=all[i];
}
else if(all->tracks[i]->mm==mm)
{
if(all->tracks[i]->ss>ss)
{
n++;
memcpy ( &longSongs, &all, sizeof(all) );
}
}
}

longSongs->count=n;
return longSongs;
}

float get_avg_bpm(Playlist *list) {
float avg_bpm=0;
int i;

for(i=0;i<list->count;i++)
{
avg_bpm+=list->tracks[i]->bpm;
}

return avg_bpm/=list->count;

}

问题出在我的 get_tracks_longer_than 函数中,我真的不知道如何将我想要的结构成员从源结构复制到目标结构,我只能设法将所有成员从一个结构复制到另一个结构。我的 n 计数器正确计算轨道数量,并且计算 bpm 的函数似乎可以工作,但我不知道如何获得我想要的确切数据。我尝试使用 memcpy 函数,尝试像这样分配它:longSongs[i]=all[i],并且我尝试手动分配值,例如:

longSongs->tracks[i]->mm = all->tracks[i]->mm;
longSongs->tracks[i]->ss = all->tracks[i]->ss;
longSongs->tracks[i]->bpm = all->tracks[i]->bpm;

但没有任何作用,它总是复制源结构的所有成员,忽略我的 if 语句。

最佳答案

您不需要复制成员,只需复制指针即可。

longSongs->tracks[n] = all->tracks[i];

请注意,longSongs->tracks 的索引是 n,而不是 i。否则,您将在 longSongs->tracks 数组中为所有未选择的歌曲留下空白。

Playlist* get_tracks_longer_than(int mm, int ss, Playlist* all) {

int min_secs = mm*60 + ss;

Playlist *longSongs = malloc(sizeof(Playlist));
longSongs->tracks = malloc(all->count*sizeof(Track*));

int i, n = 0;

for(i=0;i<all->count;i++)
{
if(all->tracks[i]->mm*60 + all->tracks[i]->ss > min_secs)
{
longSongs->tracks[n++] = all->tracks[i];
}
}

longSongs->count=n;
return longSongs;
}

其他更改:我删除了未使用的 tracks 变量,并通过将分钟和秒合并为总秒数来简化运行时间的比较。

关于将特定结构成员复制到另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38134865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com