首页 > 解决方案 > 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调试器打印二进制文件时,让我觉得他们使用不同的字长(QWORDvs DWORD),但我没有遇到过这样的问题。

这让我认为这time_t是一个,unsigned int但我不确定如果是这样的话它是否会这样做。它会破裂吗?还是我只是被 Ada Range Check Exceptions宠坏了?

在以前的基线中,这很有效。他们也在不同的RHEL版本上。

标签: cadaunsigned-integer

解决方案


假设您使用的是 GCC,您可以使用它gcc -fdump-ada-spec来生成与您的 C 函数的 Ada 绑定。这应该生成一个保证工作的绑定(使用用于编译 C 和 Ada 的 GCC 版本)。


推荐阅读