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

2023-12-24

我正在将一些旧版 Fortran77 代码迁移到 C/C++。在Fortran77代码中,如果从文件中读入8个字符,则可以将它们存储在real*8类型的变量中,没有问题。

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

非常感谢您的帮助。

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

具体来说,在程序的一次运行中,每一行的格式可能是:f1:字符串、f2:数字、f3:数字、f4:字符串,但在另一个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端你可以简单地claimFortran 接口接受一个字符数组,而实际上它需要一个双精度数组。 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、交错传递的隐藏字符串长度),就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Scala 中“null == last”和“null eq last”有什么区别?

    我在内置类中看到MessageQueue scalascala 2 7 7 的第 164 行左右 它是 def extractFirst p Any gt Boolean MessageQueueElement changeSize 1 a
  • iPhone-如何将 Storyboard 与自定义 UITableView 单元格和 CellWithIdentifier 一起使用

    我正在尝试利用新的故事板设计器和绘制 UITableView 单元格的简便性 而不是以编程方式 设计 每一行 标准单元的一个很好的例子在堆栈溢出链接 iPhone dequeueReusableCellWithIdentifier 用法 h
  • Hbase shell - 如何写入字节值

    我想在 hbase 中写入一个值 65 为此 我必须在 hbase shell 上运行以下命令 put table key cf qual A 但是有没有办法直接写成这样 put table key cf qual 65 this is n
  • C++ - 结构与类[重复]

    这个问题在这里已经有答案了 可能的重复 C C 结构与类 https stackoverflow com questions 2750270 c c struct vs class C 中的 POD 类型是什么 https stackove
  • 将 HTML 导出到 Excel 而不丢失格式

    我有一个生成报告的 asp net 页面 无论好坏 整个事情都是使用嵌套表生成的 我能够将页面导出到 Excel 但是我丢失了所有格式 无法设置列宽等 有办法处理这个问题吗 我愿意添加 html 方面所需的任何愚蠢的 MS Office 特
  • 在 SQL 查询中执行正则表达式(替换)

    将所有 lt 替换为的最佳方法是什么 lt 在给定的数据库列中 基本上执行s lt lt gi Notes 必须工作于微软SQL服务器 http en wikipedia org wiki Microsoft SQL Server SQL
  • Laravel - 未定义的偏移量 0 - collection.php

    我正在编写一个网络应用程序 后端是一个基于 Laravel 4 的 RESTFul 应用程序 我在使用特定控制器时遇到问题 BedsController php class BedsController extends BaseContro
  • RPY2:导入程序因 .Renviron 失败

    这是使用时应该发生的事情rpy2 robjects packages importr对于基础 R 包 例如stats gt gt gt from rpy2 robjects packages import importr gt gt gt
  • 量角器 - 描述未定义

    我正在使用 Protractor js 进行测试 当我尝试使用运行测试用例时 量角器 e2e main test spec js 我的conf js An example configuration file exports config
  • DatePicker 不更新 Android 中的 Textview

    当选择某个日期的日期选择器时 我试图更新文本视图 但它的textview 没有更新 我正在使用两个日期选择器来更新两个不同的文本视图 这是我更新 TextView 的代码 public class SearchingActivity ext
  • wxPython CheckListBox 与 HTML

    我正在使用 wxPython 创建一个 GUI 应用程序 现在我正在使用 wx CheckListBox 来显示带有复选框的选项 但我希望使用 HTML 来格式化 CheckListBox 中的文本 解决这个问题的最佳方法是什么 Repla
  • 如何滚动重启一群杂种集群

    任何人都知道一种通过 Capistrano 以 滚动 方式重新启动杂种集群的好方法 例如一次一个杂种 如果每个人都有一点等待时间 让杂种也能加载 Rails 应用程序 那就太好了 我已经做了一些搜索 但没有找到太多 所以在我自己深入研究 m
  • 我可以使用 boost 库来执行跨平台应用程序吗?

    boost c 库中是否有任何 WinAPI WinExec 模拟 我需要从我的程序运行可执行文件 并将参数传递给它 我应该为此使用任何其他跨平台库 还是自己处理我的程序编译的操作系统 重要的 请参阅末尾的 POSIX 系统更新
  • 为什么我会收到有关此代码示例的警告?什么才是正确的呢?

    我正在学习一些 C 并且正在阅读scanf from 本教程 http www tutorialspoint com c standard library c function scanf htm其中包含以下代码块 include
  • WCF NetTcpBinding 缓冲与流性能问题

    我编写了一个 WCF 服务 该服务应该使用 Streamed TransferMode 转换任何大小的文件NetTcpBinding and System IO Stream object 在运行性能测试时 我发现了明显的性能问题 然后我决
  • 如何设置带空格的环境变量?

    我需要使用批处理文件设置环境变量的值 我为此编写了脚本 echo off set value Hello world setx M srijani srijani value 它给出了错误 ERROR Invalid syntax Defa
  • 重命名字典键

    有没有一种方法可以重命名字典键 而无需将其值重新分配给新名称并删除旧名称键 并且不迭代 dict 键 值 的情况下OrderedDict https docs python org 3 library collections html co
  • JPA更新多对多删除记录

    我在两个实体之间有 ManyToMany 关系 当我在拥有方执行更新时 JPA 似乎从我的数据库中删除了所有链接记录并重新插入它们 对我来说这是一个问题 因为我有一个在删除记录之前触发的 MySQL 触发器 关于如何解决这个问题有什么想法吗
  • .NET 进程间通信的最佳选择是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我应该使用命名管道还是 NET Remoting 与计算机上正在运行的进程进行通信 WCF是最好的选择 它支持许多不同的传输机制 https l
  • 是否可以在 c/c++ 中的 double 类型(8 字节)变量中存储 8 个字符(每个字符 1 字节)?

    我正在将一些旧版 Fortran77 代码迁移到 C C 在Fortran77代码中 如果从文件中读入8个字符 则可以将它们存储在real 8类型的变量中 没有问题 是否可以在 C 或 C 中做类似的事情 如果是这样 我该怎么做 我无法在互