问题标签 [mixed-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在 C 中从 Fortran 调用全局字符串变量会导致分段错误
我正在尝试调用在 Fortran 子例程中定义的全局字符串变量,在 C 中。C 代码是Cfile.c
:
和 FORTRAN 代码是Ffile.f
:
它编译为:
但是在运行时出现分段错误。我不明白我什么时候违反了内存边界。
我的操作系统是:
Linux ubuntu 4.15.0-39-generic #42-Ubuntu SMP Tue Oct 23 15:48:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
我的编译器是:
GNU Fortran (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
如果您能帮助我知道我的错误在哪里以及如何解决,我将不胜感激?在 Fortran 中定义全局变量然后在 C 中调用它的其他解决方案也受到欢迎。
c - 使 Visual Studio FORTRAN-C 混合代码 gfortran-gcc 兼容的最小修改
我正在尝试修改此代码(作为备份的要点)以使其与 gfortran-gcc 兼容。
- 我删除了
[VALUE]
标签 POINTER
与-fcray-pointer
gfortran 的标志一起使用,而不是[REFERENCE]
标签- 删除了
__stdcall
,因为尝试了#define __stdcall __attribute__((stdcall))
导致warning: ‘stdcall’ attribute ignored [-Wattributes]
现在这就是我所拥有的:
C代码CMAIN.C
:
FORTRAN 代码FORSUBS.FOR
:
Makefile
:_
但是我仍然收到错误:
CMAIN.o:在函数“main”中:
CMAIN.C:(.text+0x1d): 未定义对“FACT_(int)”的引用
CMAIN.C:(.text+0x4c): 未定义引用`PYTHAGORAS_(float, float, float*)'
如果您能帮助我知道,我将不胜感激:
- 问题是什么,我该如何解决?
- 修改原始代码以使 gcc-gfortran 与最小更改兼容的最佳方法是什么。
octave - 是否有用于 Octave 和 Scilab 的 C 类预处理器指令用于互兼容代码?
在 C / C++ 语言中,可以使用宏或所谓的“每处理器指令”来指示编译器应如何读取代码。#def
, #ifdef
, #ifndef
, #else
, ...的简单命令#endif
使编译器能够检查操作系统、编译器和其他环境信息。我知道 Octave 和 Scilab 是解释性语言,但我想知道是否有任何方法可以告诉解释器在加载脚本时替换部分脚本?例如,我可以编写一个基于 Scilab 语法注释的代码,//
然后指示解释器将它们作为 Octave 的注释语法读取为#
or%
吗?这似乎是 Scilab Octave 间兼容性的主要问题之一。
如果有一种方法可以指示口译员检查口译员的信息 Scilab/ScicoLab/Octave/FreeMat,Julia... 和版本... 然后根据这些信息有一些#ifdef
#endif
块... 然后可以写与上述多个解释器兼容的代码。如果您能告诉我加载时间指令是否可行,我将不胜感激,如果不可行,是否/如何编写与 Octave 和 Scilab 兼容的代码?
PS1不同的方法是:
- 具有常规
if then elseif else end
语句,包括跨不同解释器的有效语法并具有独特的结果。正如以下答案中所建议的那样。 - 使用
gets
,exec
,execstr
从 Scilab 端加载.m
文件。可以做一些正则表达式来清理代码。Octave 确实有类似的 xml#<include>...</include>
- 有一个像这样的定制
import
功能,用于将 MATLAB 代码导入 Octave
PS2 Octave 有version()
功能,Scilab /ScicosLab 有getversion()
,Julia 有versioninfo
and VERSION
,FreeMat
也有version
功能。也许也可以使用。
PS3已经有scilab 的Matlab/Octave 兼容性工具箱。还有Sci cosim可以使用 TCP 端口将变量从 Scilab 工作区导入 Octave。
matlab - 使用 if 语句在 Octave 和 MATLAB 之间具有内部兼容的代码
与这个问题一样,我想要一些仅根据解释器是 MATLAB 还是 Octave 运行的代码。例如
Octave 和 MATLAB 都有version
orversion()
命令返回
答案 = 5.1.0
和
答案=
'9.5.0.1049112 (R2018b) 更新 3'
分别。我可以使用正则表达式来定义一个函数来区分它们,但我想知道是否有更规范和更快的解决方案?
c++ - 调用从 C++ 返回 KIND=10 复数值的 Fortran 函数
我有一堆旧的 F77 源代码(通常在x86_64
with上编译gfortran -std=legacy
)。它包含相当多的形式功能:
我需要从一些 C++ 代码(通常在x86_64
with上编译g++
)调用这些函数。
它适用于默认的 Fortran
KIND=8
:当我
KIND=4
使用以下-freal-8-real-4
选项强制执行默认 Fortran 时,它可以工作:当我
KIND=16
使用该-freal-8-real-16
选项(以及在 C++ 中#include <quadmath.h>
)强制执行默认的 Fortran 时,它可以工作:令我惊讶的是,在这种情况下,它似乎也可以使用(返回值在 中
*z
):上面这两个原型中哪一个是(更多?)正确的?
我的问题是我无法
KIND=10
使用该-freal-8-real-10
选项使其与我想要的默认 Fortran 一起工作。在 Fortran 内部kind
,precision
、range
和sizeof
返回值直接对应于 C++long double
。所以,我尝试了:但我根本无法让它工作。
也许我需要向
gfortran
和/或g++
调用添加一些特殊标志,以便让 C++ 检索 FortranKIND=10
复杂值?注意:我认为我不能使用-ff2c
.
更新(2020.08.04):我已经能够欺骗 C++ 编译器,使它似乎可以为任何 Fortran 生成正确的代码KIND=4,8,10
。诀窍是在 C++ 中使用 ISO C99 _Complex
(注意:此技巧仅适用于KIND=10
,但它实际上也适用于KIND=4,8
):
请注意,在 C++ 中,您不能使用 eg long double complex
,但幸运long double _Complex
的是仍然可以。
C++中 ISO C99 的可用性_Complex
相当有限。例如,使用-std=c++11
(或更新)甚至最基本的creal*
功能都cimag*
消失了。
所以,最好的办法是立即将返回的值复制到一些标准的 C++ 模板化复杂变量中,例如使用类似的东西(注意:f_
返回C99KIND _Complex
):
c - 由于 C 跨平台,chez-scheme FFI 的错误
有ac文件
当我在 chez-scheme 中调用它时
当我在互联网上搜索它时,我发现 termios.h 是针对 POSIX 终端的,而我的操作系统是 Debian。
请问为什么会出现这个错误提前谢谢。
c - 方案和C之间的混合编程
我正在阅读 CSUG 以了解 chez-scheme 的 FFI。所以我可能有一些初学者的错误。我只是想知道 FFI 是否存在一些问题。C 有一些类型的数据,就像 char、float、double、int、functions、struct、union 或 enumeration。但它们不存在于方案中。有数字、列表、字符、字符串和符号。或者defstruct
宏
它们的数据类型之间是否存在一些不兼容的问题。如果是退出,FFI 的解决方案是什么。