Результат странного флюидосинтеза ('settings! = NULL') - PullRequest
0 голосов
/ 12 декабря 2011

небольшая примерная программа, приведенная ниже, выдает ошибку подтверждения («settings! = NULL» завершилась неудачей), и я не могу понять, почему она считает указатель на структуру настроек 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 и обнаружил строку 1213 файла utils / fluid_settings.c:

fluid_return_val_if_fail (settings != NULL, 0);

Но Fluid_return_val_if_fail - это простой макрос для вызова g_return_val_if_fail из GLib(utils / fluid_sys.h: 59).

Поскольку адрес настроек действителен, я не могу думать о чем-то еще.Не правда ли, что указатели NULL указывают на адрес 0x00?

Я забыл что-то важное?

1 Ответ

0 голосов
/ 12 декабря 2011

Распечатайте адрес перед его использованием, например, используя. printf("the settings are at %p\n", settings);; и вы можете, конечно, также добавить защиту самостоятельно:

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

Если вызов _new () не удался, вам, конечно, нужно разобраться, почему это может произойти.

Раньше вам приходилось вручную инициализировать библиотеку glib, от которой, по-видимому, зависит FluidSynth, но в этом больше нет необходимости.

Я кратко посмотрел, и, похоже, он пытается инициализировать мьютекс внутри объекта настроек (я полагаю, чтобы сделать его потокобезопасным), поэтому возможно, что вам нужно добавить вызов к <a href="http://developer.gnome.org/glib/stable/glib-Threads.html#g-thread-init" rel="nofollow">g_thread_init()</a> к вашему main(), перед звонком на new_fluid_settings().

...