c - Ada 到 C:跨语言导入函数的参数值变化
问题描述
我有以下 Ada 功能
function Get_GPS_Epoch(Time : Standard_Types.Integer_Type)
return Global_Types.Long_GPS_Time_Type;
pragma import(C, get_GPS_Epoch, "getGpsEpoch");
在 C 侧
unsigned long long
getGpsEpoch(time_t startTime)
{
time_t gpsEpoch;
// Get current time
time_t curTime;
if (startTime == -1)
curTime = time(NULL);
else
curTime = startTime;
// Get gmtime broken down into parts
struct tm utcTime
if (curTime >=0 && gmtime_r(&curTime, &utcTime))
{
// Calculate the number of seconds from the Linux epoch
// to the GPS epoch which is midnight Jan 1st of the current year
gpsEpoch = curtime - (utcTime.tm_yday * 86400 +
utcTime.tm_hour * 3600 +
utcTime.tm_min * 60 +
utcTime.tm_sec);
}
// Convert to micro seconds
return (unsigned long long)gpsEpoch * 1000000;
}
我的问题是关于 Ada 我打电话给以下
Get_GPS_Epoch(-1);
然后当它进入 C 函数(使用调试器)时,-1
变成4294967295
.
(两者都是1111 1111 1111 1111
调试器打印二进制文件时,让我觉得他们使用不同的字长(QWORD
vs DWORD
),但我没有遇到过这样的问题。
这让我认为这time_t
是一个,unsigned int
但我不确定如果是这样的话它是否会这样做。它会破裂吗?还是我只是被 Ada Range Check Exceptions宠坏了?
在以前的基线中,这很有效。他们也在不同的RHEL版本上。
解决方案
假设您使用的是 GCC,您可以使用它gcc -fdump-ada-spec
来生成与您的 C 函数的 Ada 绑定。这应该生成一个保证工作的绑定(使用用于编译 C 和 Ada 的 GCC 版本)。
推荐阅读
- powershell - 在 PowerShell 中设置变量和静音输出
- typescript - 在`.d.ts`中导出枚举会导致“无法解决”错误
- javascript - 尝试将json中的图像从我的nestjs api发送到另一个api
- javascript - 如何在 React 中默认选择索引项
- jmeter - JMeter - 保持当前威胁活跃
- python - 如何提取字符串中整数值的第二个实例
- r - 根据列中的正则表达式语法,将变量添加到包含每行最大值的数据框中
- angular - 问题是使用 Angular `renderer` 创建单选按钮
- c - 分配指针值
- python - Pyspark,如何附加数据帧但从特定数据帧中删除重复项