Я работаю над кодом Ada, который мне нужно вызвать из C, и я столкнулся с проблемой, которую не могу решить и не знаю, почему это происходит.
Вот тестпроект для иллюстрации проблемы:
lookup.ads
with Interfaces.C; use Interfaces.C;
package lookup is
procedure Printf(str : in Interfaces.C.char_array; i : in Positive);
pragma Import(C, printf, "printf");
procedure PrintLookup;
pragma Export(C, PrintLookup, "print_lookup");
end lookup;
lookup.adb
with Interfaces.C; use Interfaces.C;
package body lookup is
-- Month_Length : constant array (1..12) of Positive := (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Month_Length : constant array (1..12) of Positive := (4 | 6 | 9 | 11 => 30, 2 => 28, others => 31);
procedure PrintLookup is
begin
printf("Month_Length(5): %d"&To_C(ascii.LF)&To_C(ascii.NUL), Month_Length(5));
end PrintLookup;
end lookup;
main.adb
with lookup;
procedure main is
begin
lookup.PrintLookup;
end main;
main.c
extern void print_lookup();
int main()
{
print_lookup();
return 0;
}
И у меня есть простой make-файл для его сборки:
BUILD=ada
GM=gnatmake
CC=gcc
LIB=-L/usr/lib/gcc/i686-linux-gnu/4.9/adalib
ifeq ($(BUILD),ada)
main:
$(GM) lookup.adb main.adb
else
main: lookup.o main.o
$(CC) $(LIB) lookup.o main.o -o $@ -lgnat
lookup.o:
$(GM) lookup.adb
main.o:
$(CC) -c main.c
endif
.PHONY: clean
clean:
rm -f lookup.ali lookup.o
rm -f main.ali main.o
rm -f main
Makefile сгенерирует исполняемый файл с именем main .Если переменная BUILD в первой строке make-файла установлена в ada , она будет использовать Ada main.adb , в противном случае - C main.c
Теперь возникает проблема: если в lookup.adb я использую первый вариант массива Month_Length (который закомментированпрямо сейчас), я получаю следующий вывод для обеих сетей, который является правильным:
Month_Length (5): 31
Но в случае другого массива (которыйназывается таблицей поиска), вариант C возвращает 0:
Month_Length (5): 0
Кто-нибудь имеет представление, почему массив таблицы поиска возвращает 0, когдазвонил из C?Кто-нибудь сталкивался с этой проблемой?Что мне не хватает?Я ценю вашу помощь.