乱数を使用し問題ファイルの生成プログラムを作成したいのですがファイルについてですが問題ファイルは一行目に問題サイズ、二行目以降に係数a。さらに右辺に定数bを。
解ファイルは一行目に問題サイズ、二行目以降に解xをだすプログラムです。
ですが以下のプログラムではエラーになってしまいます。どこがちがうのでしょうか
#include<stdio.h>
#include<stdlib.h>
double randf(void);
void keisub(int n,double *a,double *x);
void uhenb(int n,double *a,double *x,double *b);
void houtei(FILE *fo,int n,double *a,double *x,double *b);
int main(int argc,char *argv[]){
int n;
double *a;
double *b;
double *x;
char fnam[80];
FILE *fo;
n = atoi(argv[1]);
a = (double*)malloc(sizeof(double)*n*n);
b = (double*)malloc(sizeof(double)*n);
x = (double*)malloc(sizeof(double)*n);
strcpy(fnam,argv[2]);
fo = fopen(fnam,"w");
srand(1234);
initiate(n,a,x);
multmtrx(n,a,x,b);
outsyseq(fo,n,a,x,b);
fclose( fo );
return 0;
}
double randf(void) {
double rn;
rn = 2.0*((double)rand()/RAND_MAX-0.5);
return rn;
}
void keisub(int n,double *a,double *x){
int i,j;
for(i=0;i<n;i++) {
for(j=i;j<n;j++) {
a[n*j+i] = a[n*i+j] = randf();
}
x = (int)(99*randf());
}
for(i=0;i<n;i++) {
a[n*i+i] = fabs(a[n*i+i]);
for(j=0;j<n;j++) {
if(j!=i) {
a[n*i+i] += fabs(a[n*i+j]);
}
}
}
return;
}
void uhenb(int n,double *a,double *x,double *b)
{
int i,j;
for(i=0;i<n;i++) {
b = 0.;
for(j=0;j<n;j++) {
b += a[n*i+j]*x[j];
}
}
return;
}
void_houtei(FILE *fo,int n,double *a,double *x,double *b)
{
int i,j;
fprintf(fo,"%d\n",n);
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
fprintf(fo," %10f",a[n*i+j]);
} fprintf(fo," %12f",b);
fprintf(fo,"\n");
}
for(j=0;j<n;j++) {
fprintf(fo,"_%10f",x[j]);
} fprintf(fo,"\n");
return;
}
ファイル作成
Re: ファイル作成
問題ファイルって何ですか?連立方程式か何かを解きたいのですか?sakamoto さんが書きました:乱数を使用し問題ファイルの生成プログラムを作成したいのですが
何をしたときにどんなエラーが出るのですか?詳しく教えてください。sakamoto さんが書きました: ですが以下のプログラムではエラーになってしまいます。どこがちがうのでしょうか
コンパイル時のエラーなのか実行時のエラーなのか、どんなエラーメッセージが出るのか、
といったような具体的な情報が必要です。
ちなみに、連立方程式を解く問題だとすると、xやyやzなどの係数を乱数で発生させている以上、
物理的に解けないケースが存在します。だからエラーが出ている、というようなことはありませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ファイル作成
n変数で式もn個なので、解が無数にあることはあっても、解がないことはないと思います。box さんが書きました:ちなみに、連立方程式を解く問題だとすると、xやyやzなどの係数を乱数で発生させている以上、
物理的に解けないケースが存在します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ファイル作成
コンパイル時のエラーです。
問題ファイルというのはこのファイルを使用して、
ガウスの法とヤコビ法の求解時間を比べたいのに使用します
問題ファイルというのはこのファイルを使用して、
ガウスの法とヤコビ法の求解時間を比べたいのに使用します
Re: ファイル作成
このようなエラーメッセージがでました
cc rei.c -o rei
rei.c:21:5: warning: implicitly declaring library function 'strcpy' with type
'char *(char *, const char *)'
strcpy(fnam,argv[2]);
^
rei.c:21:5: note: include the header <string.h> or explicitly provide a
declaration for 'strcpy'
rei.c:26:5: warning: implicit declaration of function 'gluten' is invalid in C99
[-Wimplicit-function-declaration]
gluten(fo,n,a,x,b);
^
rei.c:47:20: warning: implicitly declaring library function 'fabs' with type
'double (double)'
a[n*i+i] = fabs(a[n*i+i]);
^
rei.c:47:20: note: include the header <math.h> or explicitly provide a
declaration for 'fabs'
rei.c:69:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
void_houtei(FILE *fo,int n,double *a,double *x,double *b)
^
rei.c:84:5: error: non-void function 'void_houtei' should return a value
[-Wreturn-type]
return;
^
4 warnings and 1 error generated.
make: *** [rei] Error 1
cc rei.c -o rei
rei.c:21:5: warning: implicitly declaring library function 'strcpy' with type
'char *(char *, const char *)'
strcpy(fnam,argv[2]);
^
rei.c:21:5: note: include the header <string.h> or explicitly provide a
declaration for 'strcpy'
rei.c:26:5: warning: implicit declaration of function 'gluten' is invalid in C99
[-Wimplicit-function-declaration]
gluten(fo,n,a,x,b);
^
rei.c:47:20: warning: implicitly declaring library function 'fabs' with type
'double (double)'
a[n*i+i] = fabs(a[n*i+i]);
^
rei.c:47:20: note: include the header <math.h> or explicitly provide a
declaration for 'fabs'
rei.c:69:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
void_houtei(FILE *fo,int n,double *a,double *x,double *b)
^
rei.c:84:5: error: non-void function 'void_houtei' should return a value
[-Wreturn-type]
return;
^
4 warnings and 1 error generated.
make: *** [rei] Error 1
Re: ファイル作成
- コードをcodeタグで囲まずに貼り付けている
- string.hとmath.hをインクルードするべきなのに、していない
- void houteiと書くべき所が、void_houteiとなっている
- initiate、multmtrx、outsyseqが使用されているのに、宣言も定義もされていない
- argcの値をチェックせずにargvの要素にアクセスしている
- argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
- fopen関数の戻り値をチェックしていない
- malloc関数の戻り値をチェックしていない
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ファイル作成
コンパイルしただけでSegmentation faultが出るということは、どう考えてもコンパイラのソースがおかしいのでしょう。sakamoto さんが書きました:以下のプログラムをコンパイルすると
Segmentation fault: 11
とエラーが出ます。
どこのソースがおかしいのでしょうか
(アセンブラやリンカかもしれませんが)
Wandboxでは正常にコンパイルできました。
オフトピック
- コードをcodeタグで囲まずに貼り付けている
- argcの値をチェックせずにargvの要素にアクセスしている
- argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
- fopen関数の戻り値をチェックしていない
- malloc関数の戻り値をチェックしていない
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ファイル作成
コンパイラを作成する課題ですか?sakamoto さんが書きました:自分なりに試しましたが成功しないので正しいソースコードを教えていただけないでしょうか
GCC Releases - GNU Project - Free Software Foundation (FSF)からGCCのソースコードがダウンロードできます。
※GCCのライセンスはGPLであり、派生物もGPLにしなければならないなどの制約があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ファイル作成
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。