Странное утверждение FluidSynth ('settings != NULL') результат

приведенный ниже небольшой пример программы дает мне ошибку утверждения («настройки != 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?

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


person LRMAAX    schedule 12.12.2011    source источник
comment
Что делает p *settings в сеансе gdb?   -  person buddhabrot    schedule 12.12.2011
comment
Привет, это дает мне ‹incomplete type› сразу после запуска функции new_fluid_settings.   -  person LRMAAX    schedule 12.12.2011


Ответы (1)


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

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

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

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

У меня был краткий обзор, и кажется, что он пытается инициализировать мьютекс внутри объекта настроек (я полагаю, чтобы сделать его потокобезопасным), поэтому, возможно, вам нужно добавить вызов g_thread_init() к вашему main() перед вызовом до new_fluid_settings().

person unwind    schedule 12.12.2011
comment
Привет, печать адреса с помощью %p дает действительный адрес. Однако GDB дает мне «неполный тип» структуры настроек. Добавление g_thread_init() не решило проблему. Мне очень любопытно узнать, что происходит. Спасибо за помощь в любом случае. - person LRMAAX; 12.12.2011
comment
Итак, после поиска в Google вашего pastebin я смог найти отчет об ошибке восходящего потока, который указывает здесь и помечен как закрытый. sourceforge.net/p/fluidsynth/tickets/104. Решение было связано с неправильным использованием API, вызванным неправильной документацией (первоначальная документация по-прежнему неверна). В частности, fluid_synth_setint должно быть fluid_settings_setint. У нас есть нижестоящая ошибка, похожая симптоматически здесь, но, похоже, имеет другую причину: github.com/LMMS/ lmms/issues/649 - person tresf; 23.10.2015