问题标签 [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.

0 投票
1 回答
217 浏览

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 中调用它的其他解决方案也受到欢迎。

0 投票
2 回答
220 浏览

c - 使 Visual Studio FORTRAN-C 混合代码 gfortran-gcc 兼容的最小修改

我正在尝试修改此代码作为备份的要点)以使其与 gfortran-gcc 兼容。

  • 我删除了[VALUE]标签
  • POINTER-fcray-pointergfortran 的标志一起使用,而不是[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 与最小更改兼容的最佳方法是什么。

PS1。也在Reddit上分享。 PS2。操作系统和编译器规范与这个问题相同。

0 投票
2 回答
538 浏览

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不同的方法是:

  1. 具有常规if then elseif else end语句,包括跨不同解释器的有效语法并具有独特的结果。正如以下答案中所建议的那样。
  2. 使用gets, exec,execstr从 Scilab 端加载.m文件。可以做一些正则表达式来清理代码。Octave 确实有类似的 xml#<include>...</include>
  3. 有一个像这样的定制import功能,用于将 MATLAB 代码导入 Octave

PS2 Octave 有version()功能,Scilab /ScicosLab 有getversion(),Julia 有versioninfoand VERSIONFreeMat也有version功能。也许也可以使用。

PS3已经有scilab 的Matlab/Octave 兼容性工具箱。还有Sci cosim可以使用 TCP 端口将变量从 Scilab 工作区导入 Octave。

0 投票
0 回答
50 浏览

matlab - 使用 if 语句在 Octave 和 MATLAB 之间具有内部兼容的代码

这个问题一样,我想要一些仅根据解释器是 MATLAB 还是 Octave 运行的代码。例如

Octave 和 MATLAB 都有versionorversion()命令返回

答案 = 5.1.0

答案=

'9.5.0.1049112 (R2018b) 更新 3'

分别。我可以使用正则表达式来定义一个函数来区分它们,但我想知道是否有更规范和更快的解决方案?

0 投票
1 回答
212 浏览

c++ - 调用从 C++ 返回 KIND=10 复数值的 Fortran 函数

我有一堆旧的 F77 源代码(通常在x86_64with上编译gfortran -std=legacy)。它包含相当多的形式功能:

我需要从一些 C++ 代码(通常在x86_64with上编译g++)调用这些函数。

  1. 它适用于默认的 Fortran KIND=8

  2. 当我KIND=4使用以下-freal-8-real-4选项强制执行默认 Fortran 时,它可以工作:

  3. 当我KIND=16使用该-freal-8-real-16选项(以及在 C++ 中#include <quadmath.h>)强制执行默认的 Fortran 时,它可以工作:

    令我惊讶的是,在这种情况下,它似乎也可以使用(返回值在 中*z):

    上面这两个原型中哪一个是(更多?)正确的?

  4. 我的问题是我无法KIND=10使用该-freal-8-real-10选项使其与我想要的默认 Fortran 一起工作。在 Fortran 内部kindprecisionrangesizeof返回值直接对应于 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):

0 投票
0 回答
75 浏览

c - 由于 C 跨平台,chez-scheme FFI 的错误

有ac文件

当我在 chez-scheme 中调用它时

当我在互联网上搜索它时,我发现 termios.h 是针对 POSIX 终端的,而我的操作系统是 Debian。

请问为什么会出现这个错误提前谢谢。

0 投票
0 回答
63 浏览

c - 方案和C之间的混合编程

我正在阅读 CSUG 以了解 chez-scheme 的 FFI。所以我可能有一些初学者的错误。我只是想知道 FFI 是否存在一些问题。C 有一些类型的数据,就像 char、float、double、int、functions、struct、union 或 enumeration。但它们不存在于方案中。有数字、列表、字符、字符串和符号。或者defstruct

它们的数据类型之间是否存在一些不兼容的问题。如果是退出,FFI 的解决方案是什么。