導航:首頁 > 編程語言 > fortranc混合編程

fortranc混合編程

發布時間:2023-03-16 00:27:49

❶ fortran和C#的混合編程

  1. 兩種方法都是可陵仔橋行的。

  2. 第二種方法可以使用命令行參數。

  3. 如果你遇到問題,則說明你使用方法不尺猛對。具體情況需結合你的代碼戚前及工程設置等綜合判斷。

❷ c語言和fortran語言可以結合編程嗎

可以。如 軍酷兒所說「Fortran做友岩雀成DLL動態庫格式,在C中直好早接調用就行了」。
建議看一下彭國倫老師的fortran95程序設計一書棗姿

linux操作下的一個fortran和C混編的程序,裡面也有makefile,怎麼放到linux系統里運行

ubuntu桌面版的那種,就凱寬需要自己臘瞎下載安裝的,我用的fedora14.iso,像這種就比較全,裡面有gcc編譯器盯局亮,如果你的makefile寫好了,一個make命令就可以搞定的,我是菜鳥,也在學習中......

❹ vs2013如何實現C與Fortran混合編程

方法一,使用obj

  1. 創建兩個工程。其中一個 C ,其中一個Fortran

  2. 把被調用的工程編譯(但不鏈接),得到一個obj文件

  3. 把 obj 文件添加到需調用的工程中。鏈接。

方法二,使用lib

  1. 創建兩個工慎陸程。其御孝猜中一個 C ,其中一個 Fortran(被調鎮型用的創建為靜態庫 lib)

  2. 把被調用的工程編譯,鏈接,得到一個 lib文件

  3. 把 lib文件添加到需調用的工程中。再次鏈接。

❺ fortran如何調用c語言函數,本人小白,求大神寫詳細點

你的想法,叫做 「混合編程」,簡稱「混編」。

混編有多種方式,一般有:
1.直接調用 C 編譯後的 exe
2.通過 DLL
3.通過神基御靜態 lib
4.通過編譯器直接鏈接Fortran和C的obj

不管是 Fortran 還是 C 的語法,通常不會規定混編的具體內容。這些內游岩容,是不同的編譯器自行規定的。(至少絕大多數是)

所以,具體的操作,也因你選擇的編譯器產品,因你選擇的混編方式,而有較大的不同。

所以,我建議你:
1.閱讀你使用的 C 編譯器和 Fortran 編譯器的幫助文檔,查看其中關於混合編程(mix-language)的章節。鋒塌
2.如果你閱讀英文幫助有困難,至少告知你使用何種 C編譯器,何種 Fortran 編譯器。打算採用何種混編方式。

❻ C#和FORTRAN混合編程中,如何合理設置進度條 做的是一個科學類計算軟體,C#做界面,FORTRAN做演算法內核。

多線程步考慮安全其實很簡單的,如果你繼續學vc遲早是要讓兆接觸的。我把用進度條的程序給你個框架代碼你自己填;
1、設計一個帶有進度條的對話框,把對話框用一個類CProgressDlg 來管理(這個你會吧),進度條增加一個成員變數m_progress;
2、定義一個多線程函塌伍數DWORD WINAPI ThreadReadFile (CProgressDlg *pDlg)(如何聲明函數你應該會),函數實體裡面就是具體讀取文件的代碼,先取得文件的大小,用這個除一個整數設置進度條團滑或的最大值,文件大了,分一小塊一小塊的讀,比如1024K,這樣就好插入對進度條的操作,每讀一塊就pDlg->m_progress.SetPos(progressStep+1);怎麼分?你自己看MSDN。文件讀完後在pDlg->PostMessage(WM_CLOSE);AfxMessageBox("文件已讀完!");發送消息關閉主線程的對話框結束工作。
3、在主線程其實就是你的主程序里先調用多線程函數,然後產生對話框;
[code=C/C++][/code]
CProgressDlg *pdlg=new CProgressDlg;//注意:一定要把對話框的Visable選上才能顯示控制項;
HANDLE m_Thread; //線程句柄
DWORD threadID;
//AfxBeginThread(ThreadReadFile ,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);
m_Thread=CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE)ThreadReadFile ,(LPVOID)pdlg,0,&threadID);
pdlg->DoModal();//產生進度條對話框,這個對話框由你的線程來結束,否則一直有。

❼ 怎樣從 C 中調用 FORTRAN (C++, BASIC, Pascal, Ada, LISP) 的函數反之亦然

一、IF語句的嵌套

在if語句中,如果then子句或else子句仍是一個if語句, 則稱為if語句的嵌套。

例1 計算下列函數

分析:根據輸入的x值,先分成x>0與x≤0兩種情況,然後對於情況x≤0,再區分x是小於0,還是等於0。

源程序如下:
program ex;
var
x:real;
y:integer;
begin

wrtie('Input x:');readln(x);
if x>0 then y:=1{x>0時,y的值為1}
else {x≤0時}
if x=0 then y:=0
else y:=-1;
writeln('x=',x:6:2,'y=',y);
end.

顯然,以上的程序中,在then子句中嵌套了一個Ⅱ型if語句。當然程序也可以寫成如下形式:

program ex;
var
x:real;y:integer;
begin
wrtie('Input x:');readln(x);
if x>=0 then
if x>0 then y:=1
else y:=0
else y=-1;
writeln('x=',x:6:2,'y=',y);
end.

但是對於本題,下面的程序是不對的。
y:=0;
if x>=0 then
if x>0 then y:=1
else y:=-1;

明顯,從此人的程序書寫格式可以看出,他想讓else與第一個if配對,而事實上,這是錯的。因為pascal規定:else與它上面的距它最近的then配對,因此以上程序段的邏輯意義就與題義不符。
要使上程序段中esle與第一個then配對,應將程序段修改為:
y:=0; 或者 y:=0;
if x>=0 if x>=0
then if x>0 then
then y:=1 begin
else if x>0 then Y:=1;
else y:=-1; end
else Y:=-1;
二、case語句

上面我們知道可以段頌碰用嵌套的if語句實現多分支的選擇結構。但是如果分支越來越多時,用嵌套的if語句實現多分支就顯得繁雜。當多分支選擇的各個條件由同一個表達式的不同結果值決定時,可以用case語句實現。它的選擇過程,很象一個多路握談開關,即由case語句的選擇表達式的值,決定切換至哪一語句去工作。因此在分支結構程序設計中,它是一種強有力的手段。在實現多路徑分支控制時,用case對某些問題的處理和設計,比用if語句寫程序具有更簡潔、清晰之感。

(一)、情況語句的一般形式:
case <表達式> of
<情況標號表1>:語句1;
<情況標號表2>:語句2;
:
<情況標號表n>:語句n
end;
其中case、of、end是Pascal的保留字, 表達式的值必須是順序類型,它可以是整型、布爾型及以後學習的字元型、枚舉型和子界型。情況標號表是一串用逗號隔開的與表達式類型一致的常量序列。語句可以是任何語句,包括復合語句和空語句。

(二)、case語句的執行過程
先計算表達式(稱為情況表達式)的值,如果它的值等於某一個常量(稱為情況常量,也稱情況標號),則執行該情況常量後面的語句,在執行完語句後,跳到case語句的末尾end處。

(三)、說明

①情況表達式必須是順櫻嘩序類型的;
②情況常量是情況表達式可能具有的值,因而應與情況表達式具有相同的類型;
③情況常量出現的次序可以是任意的;
④同一情況常量不能在同一個case語句中出現兩次或兩次以上;
⑤每個分語句前可以有一個或若干個用逗號隔開的情況常量;
⑥如果情況表達式的值不落在情況常的范圍內,則認為本case語句無效,執行case語句的下一個語句。turbo pascal中增加了一個"否則"的情況,即增加一個else子句,但也是可省的。
⑦每個常量後面只能是一個語句或一個復合語句。

例2 根據x的值,求函數Y的值:

分析:利用case語句進行程序設計, 關鍵在於巧妙地構造情況表達式。本例中三種情況可用一個表達式區分出來:Trunc(x/100)。因為x在(0~100)之間時表達式值為0;x在[100,200)時表達式值為1 ;其餘部分可用else子句表示。

源程序如下:
program ex;
var x,y:real;
begin
write('Input x:');readln(x);
case trunc(x/100) of
0:y:=x+1;
1:y:=x-1;
else y:=0;
end;{end of case}
writeln('x=',x:8:2),'y=',y:8:2);
end.

三、選擇結構的程序設計

例3 輸入一個年號,判斷它是否是閏年。
分析:判斷閏年的演算法是:如果此年號能被400除盡, 或者它能被4整除而不能被100整除,則它是閏年。否則,它是平年。

源程序如下:
program ex;
var year:integer;
begin
write('Input year:');readln(year);
write(year:6);
if (year mod 400=0 ) then
writeln('is a leap year.')
else
if (year mod 4=0)and(year mod 100<>0)
then writeln('is a leap year.')
else writeln('is not a leap year.');
end.

例4 判斷1995年,每個月份的天數。
分析:程序分為:輸入月份,計算該月的天數,輸出天數

源程序如下:
program days;
var month,days:integer;
begin
write('Input month:');readln(month);
case month of
1,3,5,7,8,10,12:days:=31;
4,6,9,11 :days:=30;
2 :days:=28;
else days:=0;
end;
if days<>0 then writeln('Days=',days);
end.

例5 期未來臨了,班長小Q決定將剩餘班費X元錢,用於購買若干支鋼筆獎勵給一些學習好、表現好的同學。已知商店裡有三種鋼筆,它們的單價為6元、5元和4元。小Q想買盡量多的筆(鼓勵盡量多的同學),同時他又不想有剩餘錢。請您編一程序,幫小Q制訂出一種買筆的方案。
分析:對於以上的實際問題,要買盡量多的筆,易知都買4元的筆肯定可以買最多支筆。因此最多可買的筆為x div 4支。由於小q要把錢用完,故我們可以按以下方法將錢用完:
若買完x div 4支4元錢的筆,還剩1元,則4元錢的筆少買1支,換成一支5元筆即可;若買完x div 4支4元錢的筆,還剩2元,則4元錢的筆少買1支,換成一支6元筆即可;若買完x div 4支4元錢的筆,還剩3元,則4元錢的筆少買2支,換成一支5元筆和一支6元筆即可。
從以上對買筆方案的調整,可以看出筆的數目都是x div 4,因此該方案的確為最優方案。

源程序如下:
program pen;
var a,b,c:integer;{a,b,c分別表示在買筆方案中,6元、5元和4元錢筆的數目}
x,y:integer;{x,y分別表示剩餘班費和買完最多的4元筆後剩的錢}
begin
write('x=');readln(x){輸入x}
c:=x div 4;{4元筆最多買的數目}
y:=x mod 4;{求買完c支4元筆後剩餘的錢數y}
case y of
0 : begin a:=0;b:=0; end;
1 : begin a:=0;b:=1;c:=c-1; end;
2 : begin a:=1;b:=0; c:=c-1;end;
3 : begin a:=1;b:=1; c:=c-2;end;
end;
writeln('a=',a,'b=',b,'c=',c);
end.
在實際應用中,會經常遇到許多有規律性的重復運算,這就需要掌握本章所介紹的循環結構程序設計。在Pascal語言中,循環結構程序通常由三種的循環語句來實現。它們分別為FOR循環、當循環和直到循環。通常將一組重復執行的語句稱為循環體,而控制重復執行或終止執行由重復終止條件決定。因此,重復語句是由循環體及重復終止條件兩部分組成。

一、for語句的一般格式

for <控制變數>:=<表達式1> to <表達式2> do <語句>;
for <控制變數>:=<表達式1> downto <表達式2> do <語句>;
其中for、to、downto和do是Pascal保留字。表達式1 與表達式2的值也稱為初值和終值。

二、For語句執行過程

①先將初值賦給左邊的變數(稱為循環控制變數);
②判斷循環控制變數的值是否已"超過"終值,如已超過,則跳到步驟⑥;
③如果末超過終值,則執行do後面的那個語句(稱為循環體);
④循環變數遞增(對to)或遞減(對downt o)1;
⑤返回步驟②;
⑥循環結束,執行for循環下面的一個語句。

三、說明

①循環控制變數必須是順序類型。例如,可以是整型、字元型等,但不能為實型。
②循環控制變數的值遞增或遞減的規律是:選用to則為遞增;選用downto則遞減。
③所謂循環控制變數的值"超過"終值,對遞增型循環,"超過"指大於,對遞減型循環,"超 過"指小於。
④循環體可以是一個基本語句,也可以是一個復合語句。
⑤循環控制變數的初值和終值一經確定,循環次數就確定了。但是在循環體內對循環變數的值進行修改,常常會使得循環提前結束或進入死環。建議不要在循環體中隨意修改控制變數的值。
⑥for語句中的初值、終值都可以是順序類型的常量、變數、表達式。

四、應用舉例

例1.輸出1-100之間的所有偶數。
var i:integer;
begin
for i:=1 to 100 do
if i mod 2=0 then write(i:5);
end.

例2.求N!=1*2*3*…*N ,這里N不大於10。
分析:程序要先輸入N,然後從1累乘到N。
程序如下:
var
n,i : integer;{i為循環變數}
S : longint;{s作為累乘器}
begin
write('Enter n=');readln(n);{輸入n}
s:=1;
for i:=2 to n do{從2到n累乘到s中}
s:=s*i;
writeln(n,'!=',s);{輸出n!的值}
end.
一、WHILE循環

對於for循環有時也稱為計數循環,當循環次數未知,只能根據某一條件來決定是否進行循環時,用while 語句或repeat語句實現循環要更方便。
while語句的形式為:
while <布爾表達式> do <語句>;
其意義為:當布爾表達式的值為true時,執行do後面的語句。
while語句的執行過程為:
①判斷布爾表達式的值,如果其值為真,執行步驟2,否則執行步驟4;
②執行循環體語句(do後面的語句);
③返回步驟1;
④結束循環,執行while的下一個語句。
說明:這里while和do為保留字,while語句的特點是先判斷,後執行。 當布爾表達式成立時,重復執行do後面的語句(循環體)。

例1 、求恰好使s=1+1/2+1/3+…+1/n的值大於10時n的值。
分析:"恰好使s的值大於10"意思是當表達式s的前n-1項的和小於或等於10,而加上了第n項後s的值大於10。從數學角度,我們很難計算這個n的值。故從第一項開始,當s的值小於或等於10時,就繼續將下一項值累加起來。當s的值超過10時,最後一項的項數即為要求的n。
程序如下:
var
s : real;
n : integer;{n表示項數}
begin
s:=0.0;n:=0;
while s<=10 do{當s的值還未超過10時}
begin
n:=n+1;{項數加1}
s:=s+1/n;{將下一項值累加到s}
end;
writlen('n=',n);{輸出結果}
end.

例2、求兩個正整數m和n的最大公約數。
分析:求兩個正整數的最大公約數採用的輾轉相除法求解。以下是輾轉的演算法:
分別用m,n,r表示被除數、除數、余數。
①求m/n的余數r.
②若r=0,則n為最大公約數.若r≠0,執行第③步.
③將n的值放在m中,將r的值放在n中.
④返回重新執行第①步。
程序如下:
program ex4_4;
var m,n,a,b,r:integer;
begin
write('Input m,n:');
readln(m,n);
a:=m;b:=n;r:=a mod b;
while r<>0 do
begin
a:=b;b:=r;
r:=a mod b;
end;
writeln('The greatest common divide is:',b:8);
end.

二、直到循環(REPEAT-until語句)

用while語句可以實現"當型循環",用repeat-until 語句可以實現"直到型循環"。repeat-until語句的含義是:"重復執行循環,直到指定的條件為真時為止"。
直到循環語句的一般形式:
Repeat
<語句1>;
:
<語句n>;
until <布爾表達式>;
其中Repeat、until是Pascal保留字,repeat與until之間的所有語句稱為循環體。
說明:
①repeat語句的特點是:先執行循環,後判斷結束條件,因而至少要執行一次循環體。
②repeat-until是一個整體,它是一個(構造型)語句,不要誤認為repeat是一個語句, until是另一個語句。
③repeat語句在布爾表達式的值為真時不再執行循環體,且循環體可以是若干個語句,不需用begin和end把它們包起來, repeat 和until已經起了begin和end的作用。while循環和repeat循環是可以相互轉化的。
對於例2中求兩個正整數的最大公約數,程序可用repeat-until循環實現如下:
var
m,n,a,b,r : integer;
begin
write('Input m,n=');
readln(m,n);
a:=m;b:=n;
repeat
r:=a mod b;
a:=b;b:=r;
until r=0;
writeln('The greatest common divide is',a);
end.
以上我們已介紹了三種循環語句。一般說來,用for 循環比較簡明,只要能用for循環,就盡量作用for循環。只在無法使用for循環時才用while循環和repeat-until循環, 而且 while 循環和repeat-until循環是可以互相替代的。for 循環在大多數場合也能用whiel和repeat-until循環來代替。一般for循環用於有確定次數循環,而while和repeat-until循環用於未確定循環次數的循環。
當一個循環的循環體中又包含循環結構程序時,我們就稱之為循環嵌套。
三、循環結構程序設計

例3 求1!+2!+…+10!的值。
分析:這個問題是求10自然數的階乘之和,可以用for 循環來實現。程序結構如下:
for n:=1 to 10 do
begin
①N!的值àt
②累加N!的值t
end
顯然,通過10次的循環可求出1!,2!…,10!,並同時累加起來, 可求得S的值。而求T=N!,又可以用一個for循環來實現:
t=1;
for j:=1 to n do
t:=t*j;
因此,整個程序為:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;
for n:=1 to 10 do
begin
t:=1;
for j:=1 to n do
t:=t*j;
S:=S+t;
end;
writeln('s=',s:0:0);
end.
以上的程序是一個二重的for循環嵌套。這是比較好想的方法,但實際上對於求n!,我們可以根據求出的(n-1)!乘上n即可得到,而無需重新從1再累乘到n。
程序可改為:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;t:=1;
for n:=1 to 10 do
begin
t:=t*n;
S:=S+t;
end;
writeln('s=',s:0:0);
end.
顯然第二個程序的效率要比第一個高得多。第一程序要進行1+2+…+10=55次循環,而第二程序進行10次循環。如題目中求的是1!+2!+…+1000!,則兩個程序的效率區別更明顯。

例4 一個炊事員上街采購,用500元錢買了90隻雞, 其中母雞一隻15元,公雞一隻10元,小雞一隻5元,正好把錢買完。問母雞、公雞、小雞各買多少只?
分析:設母雞I只,公雞J只,則小雞為90-I-J只,則15*I+ 10* J+(90-I-J)*5=500,顯然一個方程求兩個未知數是不能直接求解。必須組合出所有可能的i,j值,看是否滿足條件。這里I的值可以是0到33,J的值可以0到50。
源程序如下:
programr ex4_6;
var i,j,k:integer;
begin
for i:=1 to 5 do
for j:=1 to 8 do
begin
k:=90-i-j;
if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5);
end;
end.

例5、求100-200之間的所有素數。
分析:我們可對100-200之間的每一整數進行判斷,判斷它是否為素數,是則輸出。而對於任意整數i,根據素數定義,我們從2開始,到 ,找i的第一個約數。若找到第一個約數,則i必然不是素數。否則i為素數。
源程序如下:
var
i : integer;
x : integer;
begin
for i:=100 to 200 do
begin
x:=2;
while (x<=trunc(sqrt(i)))and(i mod x<>0)do
begin
x:=x+1;
end;
if x>trunc(sqrt(i)) then write(i:8);
end;
end.

❽ 用vs2008和ivf11進行c和fortran的混合編程,出現lnk2019錯誤

看fortran代碼,有沒有定義的變數或是纖橡消有些變數在某個部位寫錯了,這毀知需要你重新檢查一遍,細心一點找如培出來改了就ok了

❾ 最近在搞C\C++ 和匯編語言 的混合編程,如何講2者在編譯環境中連接起來。

詳細的官方資料見masm
programmer's
guide
中的第12章
混合語言編程,網上有pdf版本,但有一些版本的無法顯示圖片,好好的看一下吧。
----------------------------------------
混合編程允許你把微軟Basic、C、C++和FORTRAN的長處與匯編語言常式聯合起來。這些語言中的任何一種都可以調用MASM常式,你也可以在匯編程序里調用這些語言中的任何一種。這實際上使混合語言程序可以使用所有高級語言庫的常式。
MASM
6.1提供的混合語言特徵類似於高級語言里提供的特徵。例如,你可以使用INVOKE直接調用高級語言過程,匯編器為你處理參數傳遞的細節。你也可以使用H2INC把C頭文件翻譯為MASM的include文件,這在第20章的Environment
and
Tools里解釋。
MASM
6.1的混合語言特徵沒有廢棄舊的定義混合語言介面的方法。在大多數情形下,使用較早版本的MASM編寫的混合語言程序可以在MASM
6.1里正確地匯編和連接(為了解更多的信息,見附錄A)。
本章解釋了如何編寫高級語言模塊可以調用的匯編常式,MASM如何調用高級語言常式。你應該已經理解你希望聯合的語言,應該知道如何使用這些語言編寫、編譯和連接多模塊程序。
本章僅覆蓋了C、C++、Basic和FORTRAN的匯編語言介面,沒有覆蓋高級語言間的混合編程。此處的重點是微軟版本的C、C++、Basic和FORTRAN,但相同的原則適用於其他語言和編譯器。本章使用的許多技巧使用了第7章里的關於使用匯編語言編寫過程,以及第8章的多模塊編程的資料進行解釋。

❿ 如何在C語言中調用FORTRAN生成的DLL里的函數

C語言和Fortran混合編程藉助於Fortran生成的DLL進行(採用C默認的傳址方式進行函數參數傳遞)方法和實例:
1.Fortran
生成DLL
新建Fortran
DLL程序test1.f
添加如下代碼:
! test1.f90

! FUNCTIONS/SUBROUTINES
exported from test1.dll:
! test1 -
subroutine
!示例沒有返回值的子常式
subroutine
test1(a,b)
! Expose subroutine test1 to
users of this DLL

!DEC$ ATTRIBUTES
C,DLLEXPORT::test1
! Variables
! Body of
test1
integer a,b
integer sum
sum=a+b
return
end subroutine
test1
!示例有返回值的整數四則運算
!兩數相加
function
add(a,b)
implicit none
!DEC$ ATTRIBUTES
C,DLLEXPORT::add
integer
a,b,add
add=a+b
return
end
!兩數相族備李減
function
abstract(a,b)
implicit none
!DEC$ ATTRIBUTES
C,DLLEXPORT::abstract
integer
a,b,abstract
abstract=a-b
return
end
!兩數相乘
function
multiply(a,b)
implicit none
!DEC$ ATTRIBUTES
C,DLLEXPORT::multiply
integer
a,b,multiply
multiply=a*b
return
end
!兩數相兆遲除
(需要添加考慮被除數是否為0以及能否整除的判斷)
function
divided(a,b)
implicit none
!DEC$ ATTRIBUTES
C,DLLEXPORT::divided
integer
a,b,divided
divided=a/滾轎b
return
end
編譯後生成test1.dll,test1.obj等文件。其中這兩個文件是我們在VC中調用所需要的。

閱讀全文

與fortranc混合編程相關的資料

熱點內容
美國銀行加密市場 瀏覽:382
我的世界伺服器如何tp玩家 瀏覽:24
app下載統計怎麼找 瀏覽:262
荔枝app怎麼看適合自己的發型 瀏覽:369
魔獸世界client文件夾 瀏覽:539
解壓音樂輕松入睡 瀏覽:270
c盤文件夾卡頓怎麼辦 瀏覽:448
增量調制編解碼實驗數據 瀏覽:761
電流采樣信號進單片機 瀏覽:189
編程教育課程收費 瀏覽:415
伺服器的氣怎麼寫 瀏覽:395
怎麼刪除授時伺服器地址 瀏覽:143
android基礎組件 瀏覽:666
建興app怎麼變成黑色了 瀏覽:51
文件壓縮包如何加密文件 瀏覽:183
2010提出的演算法 瀏覽:674
冰櫃壓縮機的壽命 瀏覽:105
辦公室采訪程序員 瀏覽:569
美橙雲伺服器購買 瀏覽:754
漢語詞典pdf下載 瀏覽:353