蛙の井戸見聞記 Pretty frog in a well who knows nothing of the great web ocean!

~~ 好奇心は猫をも殺す Curiosity Kills the Cat ~~ ♪欲しいモノ・食べたいモノ・ネットで集めた情報と日々の記録の倉庫♪ Logging my life... Since 2003.12  

追加

  • 動的確保(nrutil.h)で確保した配列をsubroutineに渡す場合、temporaryに作ったvector配列に代入して引き渡す必要がある模様
  • ここでは、vectorで確保した1次元配列に2次元配列を放り込んで引き渡している。
  • 2次元配列 matrix(x1,x2,y1,y2)で確保した配列を1次元配列vector(0,(y2-y1+1)*(x2-x1+1))で確保した配列に入れ込む際
    • vectorA[(i-x1)+(j-y1-1)*(i-x1)]=matrixB[i][j] for i=x1,x2 and j=y1,y2
#include <stdio.h>
#include "nrutil.h"

int main (int argc, const char * argv[]) {
	int i,j,x1,y1,x2,y2,d1,d2;
	double **a,b,**c,*tmp;
	
	x1=1;
	x2=3;
	y1=1;
	y2=3;
	d1=x2-x1+1;
	d2=y2-y1+1;
	
	a=matrix(x1,x2,y1,y2);
	c=matrix(x1,x2,y1,y2);
//	tmp=matrix(0,d1-1,0,d2-1);
	tmp=vector(0,d1*d2-1);
    // insert code here...
	printf("-------------------\n");
    printf("Hello, World! from C \n");	
	
	printf("set the variable b and matrix a[3][3]\n");
	b=999.0;
	printf("real numnber b=%f\n",b);
	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			a[i][j]=(double)(i*j+j*j+j);
			printf("%d.%d: [%f]\t",i,j,a[i][j]);
		}
		printf("\n");
	}
	printf("-------------------\n");
	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			tmp[(i-x1)*d1+(j-y1)]=a[i][j];
//			printf("%f\t",a[i][j]);
		}
	}
//	printf("\n");
/*	for(i=0;i<=d1*d2-1;i++){
		printf("%f ",tmp[i]);
	}
	printf("\n");
 */
	test_();
	test2_(&d1,&d2,tmp,&b);
/*	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			a[i][j]=tmp[(i-x1)*d1+(j-y1)];
		}
	}
 */
	printf("-------------------\n");
	
	printf("Convert from a[i][j] to c[j][i] \n",b);
	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			c[i][j]=a[j][i];
			printf("%f\t",c[i][j]);
		}
		printf("\n");
	}
	
	printf("-------------------\n");
	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			tmp[(i-x1)*d1+(j-y1)]=c[i][j];
		}
	}
	test_();
	test2_(&d1,&d2,tmp,&b);
/*	for(i=x1;i<=x2;i++){
		for(j=y1;j<=y2;j++){
			c[i][j]=tmp[(i-x1)*d1+(j-y1)];
		}
	}
 */
	
	printf("-------------------\n");
	
    return 0;
}
      subroutine test
       write(*,*)'Hello from Fortran'	   
       return
       end
!
	   subroutine test2(d1,d2,aa,b)
	   INTEGER d1,d2
	   DOUBLE PRECISION aa(d1,d2)
	   DOUBLE PRECISION b
!	   
       INTEGER i,j
       write(*,*) 'b =',b
!	   
       write(*,*)'matrix'	  
       do 10 i=1,d1
       write(*,*) (aa(i,j),j=1,d2)
10     continue
	   return
	   end

参考記事:http://macwiki.sourceforge.jp/wiki/index.php/Xcode

ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ

ニューメリカルレシピ・イン・シー 日本語版―C言語による数値計算のレシピ