ページ 11

ファイル作成

Posted: 2015年12月19日(土) 01:30
by sakamoto
乱数を使用し問題ファイルの生成プログラムを作成したいのですがファイルについてですが問題ファイルは一行目に問題サイズ、二行目以降に係数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: ファイル作成

Posted: 2015年12月19日(土) 02:56
by box
sakamoto さんが書きました:乱数を使用し問題ファイルの生成プログラムを作成したいのですが
問題ファイルって何ですか?連立方程式か何かを解きたいのですか?
sakamoto さんが書きました: ですが以下のプログラムではエラーになってしまいます。どこがちがうのでしょうか
何をしたときにどんなエラーが出るのですか?詳しく教えてください。
コンパイル時のエラーなのか実行時のエラーなのか、どんなエラーメッセージが出るのか、
といったような具体的な情報が必要です。

ちなみに、連立方程式を解く問題だとすると、xやyやzなどの係数を乱数で発生させている以上、
物理的に解けないケースが存在します。だからエラーが出ている、というようなことはありませんか?

Re: ファイル作成

Posted: 2015年12月19日(土) 07:47
by みけCAT
box さんが書きました:ちなみに、連立方程式を解く問題だとすると、xやyやzなどの係数を乱数で発生させている以上、
物理的に解けないケースが存在します。
n変数で式もn個なので、解が無数にあることはあっても、解がないことはないと思います。

Re: ファイル作成

Posted: 2015年12月19日(土) 10:31
by sakamoto
コンパイル時のエラーです。


問題ファイルというのはこのファイルを使用して、
ガウスの法とヤコビ法の求解時間を比べたいのに使用します

Re: ファイル作成

Posted: 2015年12月19日(土) 15:09
by sakamoto
このようなエラーメッセージがでました

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: ファイル作成

Posted: 2015年12月19日(土) 17:27
by みけCAT
  • コードをcodeタグで囲まずに貼り付けている
  • string.hとmath.hをインクルードするべきなのに、していない
  • void houteiと書くべき所が、void_houteiとなっている
  • initiate、multmtrx、outsyseqが使用されているのに、宣言も定義もされていない
  • argcの値をチェックせずにargvの要素にアクセスしている
  • argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
  • fopen関数の戻り値をチェックしていない
  • malloc関数の戻り値をチェックしていない
という所が間違いですね。

Re: ファイル作成

Posted: 2015年12月20日(日) 17:55
by sakamoto
kkkkkmまり

Re: ファイル作成

Posted: 2015年12月20日(日) 18:03
by みけCAT
sakamoto さんが書きました:以下のプログラムをコンパイルすると
Segmentation fault: 11
とエラーが出ます。
どこのソースがおかしいのでしょうか
コンパイルしただけでSegmentation faultが出るということは、どう考えてもコンパイラのソースがおかしいのでしょう。
(アセンブラやリンカかもしれませんが)
Wandboxでは正常にコンパイルできました。
オフトピック
  • コードをcodeタグで囲まずに貼り付けている
  • argcの値をチェックせずにargvの要素にアクセスしている
  • argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
  • fopen関数の戻り値をチェックしていない
  • malloc関数の戻り値をチェックしていない
という所が改善されていないですね。

Re: ファイル作成

Posted: 2015年12月20日(日) 18:45
by sakamoto
自分なりに試しましたが成功しないので正しいソースコードを教えていただけないでしょうか

Re: ファイル作成

Posted: 2015年12月20日(日) 18:54
by みけCAT
sakamoto さんが書きました:自分なりに試しましたが成功しないので正しいソースコードを教えていただけないでしょうか
コンパイラを作成する課題ですか?
GCC Releases - GNU Project - Free Software Foundation (FSF)からGCCのソースコードがダウンロードできます。
※GCCのライセンスはGPLであり、派生物もGPLにしなければならないなどの制約があります。

Re: ファイル作成

Posted: 2015年12月20日(日) 19:11
by box
sakamoto さんが書きました:

コード:

    srand(10000);
毎回同じ結果を得てしまって、あまりおもしろくない感じがします。