【问题标题】:Strange fluidsynth assertion ( 'settings != NULL') result奇怪的流体合成断言('settings != NULL')结果
【发布时间】:2011-12-12 17:21:28
【问题描述】:

下面的小示例程序给了我一个断言错误('settings != NULL' failed),我不明白为什么它认为设置结构指针为 NULL。

文件 test.c:

#include <fluidsynth.h>

int main(int argc, char** argv) 
{
    fluid_settings_t* settings = new_fluid_settings();
    fluid_synth_setint(settings, "synth.polyphony", 128); //assertion error
    delete_fluid_settings(settings);
    return 0;
}

编译:gcc test.c -lfluidsynth。

我已尝试打印 new_fluid_settings() 返回的地址,但它对我来说似乎是一个有效地址。

于是我搜索了fluidsynth 1.1.5的源代码,找到了utils/fluid_settings.c文件的第1213行:

fluid_return_val_if_fail (settings != NULL, 0);

但fluid_return_val_if_fail只是一个简单的宏,用于调用GLib的g_return_val_if_fail (utils/fluid_sys.h:59)。

由于设置地址是有效的,我想不出别的了。 NULL指针指向的地址不是0x00吗?

我是不是忘记了什么重要的事情?

【问题讨论】:

  • 在 gdb 会话中,“p *settings”有什么作用?
  • 嗨,它在运行 new_fluid_settings 函数后给了我

标签: c debugging glib


【解决方案1】:

在使用之前打印地址,例如使用printf("the settings are at %p\n", settings);;当然,您也可以自己添加保护:

if (settings != NULL)
{
  fluid_synth_setint(settings, "synth.polyphony", 128);
}

如果是 _new() 调用失败,您当然需要深入研究为什么会发生这种情况。

过去,您必须手动初始化 FluidSynth 似乎依赖的 glib 库,但现在应该不再需要了。

我看了一眼,它似乎试图在设置对象中初始化一个互斥锁(我假设它是线程安全的),所以您可能需要添加对 @987654321@ 的调用到您的main(),在调用new_fluid_settings()之前。

【讨论】:

  • 您好,使用 %p 打印地址会给出有效地址。但是,GDB 给了我一个 设置结构。添加 g_thread_init() 并没有解决问题。我很想知道发生了什么。无论如何感谢您的帮助。
  • 所以在谷歌搜索你的 pastebin 之后,我能够找到上游错误报告,它指向这里并标记为已关闭。 sourceforge.net/p/fluidsynth/tickets/104。解决方法是文档不正确导致API使用不当(上游文档仍然不正确)。具体来说,fluid_synth_setint 应该是 fluid_settings_setint。我们在这里有一个症状相似的下游错误,但似乎有不同的原因:github.com/LMMS/lmms/issues/649
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多