gpt4 book ai didi

c - 使用 C 解析 MIDI 文件 - (内存分配可能出现的问题)

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:14 25 4
gpt4 key购买 nike

我一直在尝试使用 C 语言编写 MIDI 解析器。
我进行了研究,并从多个来源了解了很多关于 MIDI 文件结构的信息。
这里有一些最有用的(对于感兴趣的人):

使用上述来源的信息,我编写了一个真正未优化的 MIDI 解析器。当前版本的目的是简单地打印它遇到的事件并将它们保存在文件中。
我已经设法解析了 midi 文件[尽管我遇到了一个不应该存在的元事件(元事件 0x09) ].


但是,在实现保存功能时,我发现如果我尝试保存某些 midi 文件会导致问题(只需解析它们就可以正常工作)(程序会卡住一段时间并在完成执行前返回非零值).
我认为问题可能与我分配内存或访问内存的方式有关。
这是代码(正如我所说,它还不完美):

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
MtrkDatas[p] = (_MtrkCD *)(malloc(sizeof(_MtrkCD)));
if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
printf("Error reading MTrk Chunk. Bad MTrk.\n");
return 0;
}
}

^the part that allocates memory (posted because it's required)^

main.c
这是我使用的两个示例文件(一个工作正常,另一个导致问题):
home.mid(This file doesn't cause problems)
014-Theme03.mid(This is the one causing problems)
以下是我运行程序时的输出:
home Parsed.txt(Expected Output)
014-Theme03 Parsed.txt(What even is this?)
再次,我想指出一些我注意到的事情:

  1. 程序可以毫无问题地解析两个 MIDI 文件
  2. 程序不仅无法将事件输出写入 .txt 文件,而且无法写入正确的字节数

谢谢大家的宝贵时间。 (另外,如果有人能更好地格式化文本,我将不胜感激。如您所见,我不太擅长。)

更新:

这是工作代码。我犯了一个非常简单的错误,为轨道分配内存。感谢Paul R感谢指出错误。

_MtrkCD **MtrkDatas = (malloc(sizeof(_MtrkCD *) * (MthdData->tracks_count)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
MtrkDatas[p] = (malloc(sizeof(_MtrkCD)));
if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
printf("Error reading MTrk Chunk. Bad MTrk.\n");
return 0;
}
}

最佳答案

在这一行中:

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));

您只分配了一个包含一个指针的数组。所以这里你有未定义的行为:

MtrkDatas[p] = (_MtrkCD *)(malloc(sizeof(_MtrkCD)));

每当 p > 0(即如果 tracks_count > 1 那么你就有麻烦了)。

你可能应该改变:

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));

到:

_MtrkCD **MtrkDatas = malloc(MthdData->tracks_count * sizeof(_MtrkCD *));

(请注意,类型转换已被删除,因为它是 redundant and potentially dangerous to cast the result of malloc and friends in C )。

关于c - 使用 C 解析 MIDI 文件 - (内存分配可能出现的问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311449/

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