2011-12-12 58 views
0

下面的小示例程序給我一個斷言錯誤('設置!= NULL'失敗),我不明白爲什麼它認爲設置結構指針是NULL 。奇怪的fluidsynth聲明('設置!= 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是不是真的?

我忘記了一些重要的東西嗎?

+0

在gdb會話中,「p * settings」是做什麼的? – buddhabrot

+0

嗨,剛剛運行new_fluid_settings函數後,它給了我<不完整類型>。 – LRMAAX

回答

0

打印地址後使用它,使用例如。 printf("the settings are at %p\n", settings);;你當然也可以添加自己的保護:

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

如果它的_new()調用失敗,你需要深入挖掘爲什麼會發生,當然。

它曾經是你必須手動初始化FluidSynth似乎依賴的glib庫,但不應該再這麼做。

我有一個簡短的看,它似乎嘗試初始化設置對象內的互斥體(以使它線程安全,我假設),所以有可能你需要添加一個g_thread_init()到你的main() ,然後致電new_fluid_settings()

+0

嗨,用%p打印地址給出了一個有效的地址。 但是,GDB給了我一個的設置結構。添加g_thread_init()並不能解決問題。 我很好奇,知道發生了什麼事。無論如何感謝您的幫助。 – LRMAAX

+0

嗯,它定義了一個錯誤,無論是在fluidsynth或glib ... – LRMAAX

+0

我將這提供給fluidsynth開發人員(http://pastebin.com/M3uLbVcg) – LRMAAX