gpt4 book ai didi

c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?

转载 作者:太空狗 更新时间:2023-10-29 19:53:13 25 4
gpt4 key购买 nike

我正在将一些遗留的 Fortran77 代码迁移到 C/C++。在Fortran77代码中,如果从文件中读入8个字符,可以毫无问题地存储到real*8类型的变量中。

是否可以在 C 或 C++ 中做类似的事情?如果是这样,我该怎么做?我无法在互联网上找到任何解决方案。我需要使用 C/C++ 读入 8 个字符并将它们存储在一个 double 类型的变量中,然后将其传递回 Fortran 并对应于原始的 real*8 变量。

非常感谢您的帮助。

编辑:作为对@sixlettervariables 的回应,我将进一步澄清我的用例。我对他的建议的问题是我在运行时只知道每一行的格式(即哪些字段是字符串,哪些数字),因此我不知道该结构应该静态包含哪些成员。这些字段还需要按照它们被读入的顺序占据一个连续的内存块。

具体来说,在程序的一次运行中,每一行的格式可能是:f1:string, f2:number, f3:number, f4:string,但在另一个f1中:字符串,f2:字符串,f3:字符串,f4:数字,f5:数字。对于第一种情况,我需要:

struct { char[8] f1; double f2; double f3; char[8] f4}

第二个我需要:

struct { char[8] f1; char[8] f2; char[8] f3; double f4; double f5} 

也许有一些方法可以用模板做到这一点?

最佳答案

您不需要将它们存储在 double 中只是因为 Fortran 需要这样做。事实上,您绝对不应该在您的 C/C++ 代码中这样做。

简单地将字符数据存储在字符数组中。

如果您混合使用 Fortran 和 C/C++,则两者在 ABI 之外对彼此一无所知。从 C 端,您可以简单地声称 Fortran 接口(interface)接受一个字符数组,而实际上它需要一个 double 组。 Fortran 方面也是如此。

从C端:

extern void FCHARS(char* str, int length);

/* ... */
int flength = 0; /* optional: length of the string in Fortran terms */
char str[9]; /* in C/C++ add one for \0 at the end */

/* read in up to a block of 8 */
fgets(str, sizeof(str), fp);

/* At this point if you know the 8 characters are space padded to their end
* you have no more work to do, otherwise you may need to fill from the right
* with spaces.
*/
{
size_t ii = sizeof(str) - 1;
while (ii > 0 && str[ii - 1] == '\0') {
str[ii - 1] = ' ';
flength = ii--; /* optional: keep track of our unpadded length */
}
}

/* Once you've space padded the string you can call your Fortran method.
* If your Fortran method accepts a string of unknown length, supply
* `flength`. If your Fortran method expects a string of a fixed length, pass
* the size of `str` (excluding '\0') instead.
*/
FCHARS(str, flength);

只要您在 C/C++ 代码中遵循 Fortran 编译器的 ABI 要求(例如 CDECL,隐藏字符串长度交错传递),就没问题。

关于c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com