首先:我不知道如何创建这个问题的MVCE。我意识到这是一个大不对这个网站,但我坦率地说,这里有很多专业知识,我不知道有更好的地方来问这个问题。也许答案是,发布这个问题<insert other site here>。
问题:对于这里发生了什么,我如何去探讨这个问题,有什么想法吗?
总之,代码库是>10K行的fortran,它也链接在开源C++库nanort中。所以它是Fortran和C++的组合内部代码,有很多事情要做。
在代码的某个位置,我必须在C++中读取二进制文件并对其进行解析。我遇到的问题是,10%的时候,函数std::filesystem::exists告诉我文件不
我的问题很简单:如果我检查gcc的版本,我会得到4.5.1,但是CMake找到gcc 4.5.0:
> /usr/bin/gcc --version
gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTA
我正在使用Gfortran编译fortran代码。使用英特尔fortran编译器时,我从未遇到过这些编译错误。Gfortran编译器抱怨使用"==“进行if语句比较。具体地说,它给出了错误
Error: Logicals at (1) must be compared with .eqv. instead of ==
谁能解释一下为什么Gfortran需要.eqv。使用而不是==?
我正在使用Fortran代码,它必须使用各种Fortran编译器(并且与C++和Java代码交互)。目前,我们让它与gfortran和g95一起工作,但我正在研究如何使它与ifort一起工作,我遇到的第一个问题是如何在源代码中确定它是否使用ifort。
例如,我现在有一段代码:
#if defined(__GFORTRAN__)
// Macro to add name-mangling bits to fortran symbols. Currently for gfortran only
#define MODFUNCNAME(mod,fname) __ ## mod ## _MOD_ #
当我链接fortran和C++代码时,我得到了一个重复的符号错误,我不知道为什么。
我有下面的fortran代码,simple.f90
module foo
use iso_c_binding
integer(kind=c_int) :: bar
end module foo
subroutine print()
use foo
write(*,*) bar
end subroutine print
我有以下C++驱动程序main.cpp
extern "C"
{
int __foo_MOD_bar;
void print();
}
当函数放入用"ar“创建的库时,我遇到了从C++调用FORTRAN子程序的问题。
FORTRAN例程(tt.f90)是:
Module A
contains
Subroutine SubIF2(ii)
Integer*8, Intent(In) :: ii
write(*,*) "hello", ii
End Subroutine SubIF2
End Module A
c++调用方(testcpp.cpp)代码是
#include <iostream>
using namespace std;
extern"C" {
我在编写一段用于我的研究的代码时遇到了困难。它由一个用C++编写的组件和另一个用FORTRAN编写的组件组成。我认为问题与我的gcc版本有关。
例如,第一个文件是C++文件(foo.ccp)。
#include <iostream>
using namespace std;
extern "C" {
extern int MAIN__();
}
int main(){
cout << "main in C++\n";
return MAIN__();
}
第二个是bar.f90:
program test
im
我需要将一个动态数组从c++传递给Fortran。我做了很多研究,把一个我认为应该有效的例子放在一起,但它不能。程序应该在c++程序中创建一个数组,将该数组的指针传递给Fortran例程,将C指针转换为Fortran指针,然后在Fortran端打印数组。
我的c++主程序:
using namespace std;
extern "C" {
void cinterface(int*,int*);
}
int main()
{
int carray[]={0,1,2,3,4};
int carray_siz=5;
cinterface(&ca
我很难理解为什么在子例程中声明的变量(i)会出现在包含的子例程中,但是对于导致编译错误的函数(fie),情况并非如此。我寻找一个答案,也试图看看我是否能在Fortran 95标准中找到一些东西,但没有结果。
我编写了一个小示例程序:
program pgm
call a
end
subroutine a
implicit none
integer :: i
double precision :: fie
i = 7
call b
!write(*,*) fie(9)
contains
subroutine b
double precision ::
我使用gfortran编译器(在Cygwin上)作为我自己的模块。一个很好的例子有望从编译阶段开始,处理破损的名称,并通过ccall从Julia调用子例程。我见过的大多数例子都跳过了前两个阶段。
因此,假设我在Fortran 90文件中有以下模块,名为'f90tojl.f90':
module m
contains
integer function five()
five = 5
end function five
end module m
这个例子来自。我用gfortran编译它,如下所示,以创建一个共享库:
gfortran -shared -O
我有主程序Engine.f,它在LIB.f中调用函数/外部。与C++和Java不同,主程序中没有包含,因此可以编译。
我的Fortran喜剧演员怎么知道还有一个我使用的图书馆呢?
我用的是Eclipse的照片。
制作文件:
.PHONY: all clean
# Change this line if you are using a different Fortran compiler
FORTRAN_COMPILER = gfortran
all: src/Engine.f
$(FORTRAN_COMPILER) -O2 -g \
-o bin/Engine.ex
我有一个bash shell脚本,它在for循环中运行多个MATLAB和fortran代码。
在循环中,bash脚本一次又一次地调用MATLAB。这使得脚本效率低下。
我使用MATLAB 2017b和Mac OS X Catalina(10.15.7)。
有什么建议吗?
#!/bin/bash
for i in {1..10}
do
cp initial_input_$i initial_input
matlab -nodesktop -nosplash -r "matlab1; exit;"
cp matlat1.output fortran1.
Fortran 2008添加了一个名为COMPILER_OPTIONS()的新过程,根据,该过程应该返回一个字符串,其中包含用于编译文件的选项。根据的说法,几乎所有的编译器,包括GNU和PGI,似乎都支持这个特性。
我创建了一个简单的程序COMPILER_OPTIONS.f08,如下所示
use iso_fortran_env
print '(4a)', 'This file was compiled by using the options ', compiler_options()
end
这是我从gfortran和pgfortran得到的结果
Gfo