ファイル作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sakamoto
記事: 6
登録日時: 9年前

ファイル作成

#1

投稿記事 by sakamoto » 9年前

乱数を使用し問題ファイルの生成プログラムを作成したいのですがファイルについてですが問題ファイルは一行目に問題サイズ、二行目以降に係数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;
}

box
記事: 2002
登録日時: 14年前

Re: ファイル作成

#2

投稿記事 by box » 9年前

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

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイル作成

#3

投稿記事 by みけCAT » 9年前

box さんが書きました:ちなみに、連立方程式を解く問題だとすると、xやyやzなどの係数を乱数で発生させている以上、
物理的に解けないケースが存在します。
n変数で式もn個なので、解が無数にあることはあっても、解がないことはないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sakamoto
記事: 6
登録日時: 9年前

Re: ファイル作成

#4

投稿記事 by sakamoto » 9年前

コンパイル時のエラーです。


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

sakamoto
記事: 6
登録日時: 9年前

Re: ファイル作成

#5

投稿記事 by sakamoto » 9年前

このようなエラーメッセージがでました

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイル作成

#6

投稿記事 by みけCAT » 9年前

  • コードをcodeタグで囲まずに貼り付けている
  • string.hとmath.hをインクルードするべきなのに、していない
  • void houteiと書くべき所が、void_houteiとなっている
  • initiate、multmtrx、outsyseqが使用されているのに、宣言も定義もされていない
  • argcの値をチェックせずにargvの要素にアクセスしている
  • argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
  • fopen関数の戻り値をチェックしていない
  • malloc関数の戻り値をチェックしていない
という所が間違いですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sakamoto
記事: 6
登録日時: 9年前

Re: ファイル作成

#7

投稿記事 by sakamoto » 9年前

kkkkkmまり
最後に編集したユーザー sakamoto on 2015年12月20日(日) 20:35 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイル作成

#8

投稿記事 by みけCAT » 9年前

sakamoto さんが書きました:以下のプログラムをコンパイルすると
Segmentation fault: 11
とエラーが出ます。
どこのソースがおかしいのでしょうか
コンパイルしただけでSegmentation faultが出るということは、どう考えてもコンパイラのソースがおかしいのでしょう。
(アセンブラやリンカかもしれませんが)
Wandboxでは正常にコンパイルできました。
オフトピック
  • コードをcodeタグで囲まずに貼り付けている
  • argcの値をチェックせずにargvの要素にアクセスしている
  • argv[2]をそのままfopen関数に渡せばいいはずなのに無駄にfnamにコピーし、無駄にバッファオーバーランのリスクを生んでいる
  • fopen関数の戻り値をチェックしていない
  • malloc関数の戻り値をチェックしていない
という所が改善されていないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

sakamoto
記事: 6
登録日時: 9年前

Re: ファイル作成

#9

投稿記事 by sakamoto » 9年前

自分なりに試しましたが成功しないので正しいソースコードを教えていただけないでしょうか

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ファイル作成

#10

投稿記事 by みけCAT » 9年前

sakamoto さんが書きました:自分なりに試しましたが成功しないので正しいソースコードを教えていただけないでしょうか
コンパイラを作成する課題ですか?
GCC Releases - GNU Project - Free Software Foundation (FSF)からGCCのソースコードがダウンロードできます。
※GCCのライセンスはGPLであり、派生物もGPLにしなければならないなどの制約があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: ファイル作成

#11

投稿記事 by box » 9年前

sakamoto さんが書きました:

コード:

    srand(10000);
毎回同じ結果を得てしまって、あまりおもしろくない感じがします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る