Я работал над проектом Ada и мне нужно взаимодействовать с библиотекой C (fftw3). Я использовал команду
gcc -c -fdump-ada-spec -C /usr/local/include/fftw3.h
для создания предварительной привязки (требуется некоторая настройка). Я смог получить свой код и файл fftw3_h.ads для компиляции в gnat. Однако программа вылетает с
raised STORAGE_ERROR : fftw3_h.ads:733 object too large
Когда я запускаю его через GDB, код падает на строке, которая определяет строку версии,
fftw_version : aliased char_array (size_t); -- /usr/local/include/fftw3.h:457
pragma Import (C, fftw_version, "fftw_version");
Мое понимание этого состоит в том, что Ада пытается выделить место для всей строки сразу и основывает пространство хранения на диапазоне size_t. Тем не менее, size_t в этом случае происходит от interfaces.c.size_t, который определяется как
type size_t is mod 2 ** System.Parameters.ptr_bits;
в i-c.ads, а для C size_t определяется как unsigned long в stddef.h. Я не уверен, насколько велики 2 ** ptr_bits, но я не вижу никаких причин, почему определение size_t в i-c.ads должно быть ограничено размером беззнакового long в Си. Если он длиннее, чем unsigned long, то я подозреваю, что код пытается создать массив, который использует больше памяти, чем у меня. Я пытался просто использовать interfaces.c.unsigned_long вместо size_t, но Ada не нравится несоответствие типов (что я должен был знать).
На данный момент у меня есть два вопроса. Во-первых, мое понимание проблемы близко (это мой первый опыт взаимодействия между Ада и Си).
Во-вторых, при условии, что мое понимание правильное, есть ли способ обойти проблему или мне нужен совершенно другой подход?