这个问题是基于另外两个问题[1][2],但我想如果我问一些不太具体的问题并从那里开始自己工作,我会取得更多进展。
根据第一篇文章中的用户所说,根据编译器的不同,Fortran 用于表示逻辑类型的值可能会有所不同:
Fortran 的逻辑值不一定像 C 或 Matlab 中那样映射到 0 和 1;相反,映射是依赖于编译器的。
假设他的陈述是正确的,我不明白如何或为什么。为什么会这样呢?为什么不同的编译器不能以相同的方式表示稳定的数据类型?如果数据类型表示的标准化不是一个合理的期望,那么为什么 Fortran 中不是这样,但其他大型语言的情况却如此?这是一个历史遗留问题,还是有充分的理由?
那些方法是什么?我怎样才能确定我的编译器做了什么?是在文档中还是我可以根据代码输出确定它?
最后,像原始示例中那样使用 C 包装器是否会更有可能做出某种选择,还是根本不重要?
我无法找到太多关于这个问题的信息,尽管我怀疑这是因为我不知道搜索它的正确关键字。任何有助于阐明此事的帮助将不胜感激。
如果上下文完全相关,我个人使用的编译器是 Mingw-64 6.3,但它是在 Matlab 2022a 中使用 Mex 添加的任何内容完成的。编译后的文件是 Matlab 的 Lapack C 包装器,可以在此处找到。
我在从 Simulink 子系统模块中调用它时遇到了一些麻烦,因为无论数据类型如何(int64/32/16、float、逻辑、字符串和 int8 甚至不被接受),包含逻辑标志的向量似乎都会被忽略。 。使用正确的标志调用“dtrsen”函数后,生成的特征值向量无序且看似随机,这与我在 Matlab 脚本中执行相同操作时不同,其中结果按标记特征值的降序排列。
说实话,我个人认为这可能是 Simulink 数据传输问题,而不是编译器问题,因为从 Matlab 脚本中调用文件时不会出现问题,但我想了解我的情况可以肯定的是,我们正在处理更好的事情。我仍然会尝试一些其他的事情,但很可能我最终会在一天结束时做我自己的 S-Function,并且这些知识可以防止我花几个小时来调试我的错误。
而且我只是一个好奇的人。
[3] https://mathworks.com/matlabcentral/fileexchange/16777-lapack
逻辑类型(和默认类型)只有两个不同的值:
.false.
和.true.
。标准没有指定内存中的确切实现。如果处理器基于二进制表示,则所有位 0
都是 .false.
值的明显选择,因此您将看不到其他任何内容。但是.true.
呢?最低位设置为 1
还是所有位设置为 1
是更明显的选择?一个表示 1
的利息值,另一个 -1
表示二补码有符号整数。
标准未定义其他位模式的逻辑值。