【发布时间】:2018-11-23 11:19:28
【问题描述】:
我正在编写一些必须从 C 调用的 Ada 代码,但遇到了一个我无法解决且不知道为什么会发生的问题。
这里有一个测试项目来说明问题:
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;
}
我有一个简单的 makefile 来构建它:
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 的可执行文件。如果makefile第一行的BUILD变量设置为ada,则使用Adamain.adb,否则Cmain.c
现在,问题来了:如果在 lookup.adb 我使用 Month_Length 数组的第一个变体(现在已被注释掉),我得到两个电源的以下输出是正确的:
Month_Length(5): 31
但在另一个数组(称为查找表)的情况下,C 变体返回 0:
Month_Length(5): 0
有人知道为什么从 C 调用查找表数组返回 0 吗? 有没有人遇到过这个问题? 我错过了什么? 感谢您的帮助。
【问题讨论】:
-
引用 [docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/… : "
adainit您必须调用此例程以通过调用必要的细化例程来初始化程序的 Ada 部分。在第一次调用之前需要调用 adainit一个 Ada 子程序。” -
确实如此,感谢您的提示,我已经发布了有关如何解决它的答案。