使用 C 解析 MIDI 文件 - (内存分配可能出现的问题)
Parsing MIDI Files using C - (Possible Problem Allocating Memory)
我一直在尝试使用 C 编写 MIDI 解析器。
我进行了研究,并从多个来源了解了很多关于 MIDI 文件结构的信息。
这里有一些最重要的有用的(对于感兴趣的):
- https://web.archive.org/web/20141227205754/http://www.sonicspot.com:80/guide/midifiles.html
- https://www.csie.ntu.edu.tw/~r92092/ref/midi/
使用上述来源的信息,我编写了一个真正未优化的 MIDI 解析器。当前版本的目的是简单地打印它遇到的事件并将它们保存在文件中。
我已经设法解析了 midi 文件[尽管我遇到了一个不应该存在的元事件(元事件 0x09 )].
然而,在实现保存功能时,我发现如果我尝试保存某些 midi 文件会导致问题(只需解析它们就可以正常工作)(程序冻结了一段时间并且 returns 非- 完成执行前的零值)。
我认为问题可能与我分配内存或访问内存的方式有关。
这是代码(正如我所说,它还不漂亮):
_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?)
再次,我想指出一些我注意到的事情:
- 程序解析两个 MIDI 文件没有任何问题
- 该程序不仅无法将事件输出写入 .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 编写 MIDI 解析器。
我进行了研究,并从多个来源了解了很多关于 MIDI 文件结构的信息。
这里有一些最重要的有用的(对于感兴趣的):
- https://web.archive.org/web/20141227205754/http://www.sonicspot.com:80/guide/midifiles.html
- https://www.csie.ntu.edu.tw/~r92092/ref/midi/
使用上述来源的信息,我编写了一个真正未优化的 MIDI 解析器。当前版本的目的是简单地打印它遇到的事件并将它们保存在文件中。
我已经设法解析了 midi 文件[尽管我遇到了一个不应该存在的元事件(元事件 0x09 )].
然而,在实现保存功能时,我发现如果我尝试保存某些 midi 文件会导致问题(只需解析它们就可以正常工作)(程序冻结了一段时间并且 returns 非- 完成执行前的零值)。
我认为问题可能与我分配内存或访问内存的方式有关。
这是代码(正如我所说,它还不漂亮):
_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?)
再次,我想指出一些我注意到的事情:
- 程序解析两个 MIDI 文件没有任何问题
- 该程序不仅无法将事件输出写入 .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)。