メルセンヌ・ツイスタを使用した乱数をファイルに出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ベルジオン

メルセンヌ・ツイスタを使用した乱数をファイルに出力

#1

投稿記事 by ベルジオン » 9年前

こんにちは
C言語でメルセンヌ・ツイスタを利用した乱数をファイルに出力したいのですが
上手く行かず悩んでいます。乱数の要素数は5億個ほど出力したいです。

コード:

#include <stdio.h>
#include <time.h>
#include "MT.h"

int main(void) {
	FILE *fp;

	int i;
	init_genrand((unsigned)time(NULL));

	char *filename = "maxim.txt";

	/* ファイルのオープン */
	if ((fp = fopen(filename, "r")) == NULL) {
		fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
		return(0);
	}

	/* ファイルに文字列を書き込む */
	
	for (i = 0; i<500000000; i++) { fputs("%ld\n genrand_int32()",fp); }

	/* ファイルのクローズ */
	fclose(fp);

}
どうすれば良いのか何もわからないで恐縮ですが、教えていただけると幸いです

yoko
記事: 24
登録日時: 14年前

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#2

投稿記事 by yoko » 9年前

fputsの使い方が間違っています。
というか、この書式で出力したいのならfputsを使うべきではありません。

書き換えるならfprintfを使用して

コード:

fprintf(fp,"%ld\n",genrand_int32());
となります。

※MT.hの内容が書かれていないので、プログラムで使用する関数がMT.hに定義されているものと想定して書いています。
 また、プログラムを実際に実行していないのでまだバグ等あるかもしれません。

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#3

投稿記事 by amehirune » 9年前

オフトピック
5億となると、int型でループカウンタを宣言してたら普通にオーバーフロー起こすような…
unsigned intにしててもギリギリで足りないはずだから、ループは分けておいたほうがいいかも。

コード:

for(int i=0;i<5;i++){
          for(unsigned int j=0;j<1000000000;j++)          処理;
}
…みたいな。
思っただけなのでOffTopicで。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#4

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

amehirune さんが書きました:5億となると、int型でループカウンタを宣言してたら普通にオーバーフロー起こすような…
unsigned intにしててもギリギリで足りないはずだから、ループは分けておいたほうがいいかも。

コード:

for(int i=0;i<5;i++){
          for(unsigned int j=0;j<1000000000;j++)          処理;
}
…みたいな。
32ビット符号付き整数は約21億まで格納できるので、オーバーフローしません。
int型が規格で許される最小の32767までしか格納できない場合はオーバーフローし、
unsigned int型が規格で許される最小の65535までしか格納できない場合はその分け方では意味無いです。
例えば、こうするといいでしょう。

コード:

for(int i=0;i<5;i++){
    for(int j=0;j<10000;j++){
        for(int k=0;k<10000;k++) 処理;
    }
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#5

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

yoko さんが書きました:書き換えるならfprintfを使用して

コード:

fprintf(fp,"%ld\n",genrand_int32());
となります。
メルセンヌツイスタのgenrand_int32()関数の戻り値はunsigned long型なので、%ldではなく%luを使用するべきです。

コード:

fprintf(fp,"%lu\n",genrand_int32());
としてください。
オフトピック
ところで、何のために約5GBもの巨大な出力をしたいんだろう?ファイルシステムやディスクの負荷試験かな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Bull
記事: 149
登録日時: 11年前

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#6

投稿記事 by Bull » 9年前

誰も指摘してないようなので。
ベルジオン さんが書きました:乱数の要素数は5億個ほど出力したいです。

コード:

	/* ファイルのオープン */
	if ((fp = fopen(filename, "r")) == NULL) {
		fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
		return(0);
	}
どうすれば良いのか何もわからないで恐縮ですが、教えていただけると幸いです
これでは出力はできないですね。
"w"を指定して、書込みモードにしないとダメですね。

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#7

投稿記事 by ベルジオン » 9年前

みなさんありがとうございます。

コード:

#include <stdio.h>
#include "MT.h"



int main() {

	FILE *fp;
	int cnt;
	int i;
	init_genrand(10);


	/* Windowsの場合は"test.txt" */
	fp = fopen("test2.txt", "w");
	if (fp == NULL) {
		printf("ファイルオープンエラー\n");
		return -1;
	}

	for (i = 0; i<500000000; i++) { fprintf(fp,"%ld\n", genrand_int32()); }


	fclose(fp);

	return 0;
}

で一応プログラム上書き込むことができました。
5億の乱数を取得したかったのはソーティングアルゴリズムの比較をするためです。
今度はこの外部ファイルから要素を読み込み、配列に入れるという事ができるかどうかがわからないので考えています…。

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#8

投稿記事 by ベルジオン » 9年前

ただ上のソースもググッて出来て「しまった」だけなので、なぜ動くのかの理解が出来ていません…。
なぜ上のソースで動いたのか、この問題点もご教授いただけると幸いです。

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#9

投稿記事 by ベルジオン » 9年前

それと%ldにした理由は、ネット上でそう書けと書かれていたのと、int型のデータとして扱いたかった為です。

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#10

投稿記事 by ベルジオン » 9年前

皆さんのアドバイスを極力反映して作ってみたプログラムです。

コード:

#include <stdio.h>
#include "MT.h"



int main() {

	FILE *fp;
	int cnt;
	int i;
	int j;
	int k;
	init_genrand(10);


	/* Windowsの場合は"test.txt" */
	fp = fopen("test2.txt", "w");
	if (fp == NULL) {
		printf("ファイルオープンエラー\n");
		return -1;
	}

	for ( i = 0; i<5; i++) {
		for (j = 0; j<10000; j++) {
			for (k = 0; k<10000; k++)  fprintf(fp, "%ld\n", genrand_int32());
		}
	}


	fclose(fp);

	return 0;
}


hide

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#11

投稿記事 by hide » 9年前

ご自身がどこまで理解できているのかを書いていただかないと
この短さのソースが全く少しも読めないならば入門書からどうぞくらいしか言えないですよ

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#12

投稿記事 by ベルジオン » 9年前

ある程度の動きは理解しているのですが、複雑なファイル構築となってくると理解が出来ません。
また、これらファイルの要素をそれぞれ配列化することもちょっと考えられない状態です。

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#13

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

ベルジオン さんが書きました:それと%ldにした理由は、ネット上でそう書けと書かれていたのと、int型のデータとして扱いたかった為です。
ネット上の情報が常に正しいとは限りません。
int型のデータとして扱いたければ、キャストして%dを使ってください。
(キャスト先の型が符号付き整数で、それにキャスト元の値が入らない場合の動作はimplementation-definedです)

コード:

fprintf(fp, "%d\n", (int)genrand_int32());
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#14

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

ベルジオン さんが書きました:ある程度の動きは理解しているのですが、複雑なファイル構築となってくると理解が出来ません。[/code]
ここで扱っている、整数をテキストで並べただけの単純なファイル構築なら理解できるのですか?
ベルジオン さんが書きました:また、これらファイルの要素をそれぞれ配列化することもちょっと考えられない状態です。
確かに「要素をそれぞれ配列化する」というのはちょっと考えられないですね。
ファイル全体を配列化する…と言いたいところですが、5億要素あるので1要素が2バイトでも1GB、1要素が4バイトだと2GBとなり、32ビットの環境ではこのような巨大な配列全体をメインメモリに乗せるのはきついでしょう。
まず、ファイルをテキストではなく要素の添字から簡単に位置がわかる1要素のサイズが固定のバイナリ形式にし、
かつファイルを直接配列のように読み書きする、もしくは適当なキャッシュを構築して読み書きする処理(関数)を作ると良いでしょう。
64ビットなら全体をメインメモリに乗せることができるかもしれないですが、よくわかりません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#15

投稿記事 by ベルジオン » 9年前

そうですね…すみません。関数名や動きの大まかな感じなら理解できるのですが
実装となってくるとちょっと考えないとわからないレベルです…申し訳ございません…。

配列に収納したいのは、ソーティングの際に配列の方だとやりやすいと考えているからです。
malloc関数を使えば実行できるかもしれないなどと考えていますが…無謀でしょうか…?

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#16

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

ベルジオン さんが書きました:配列に収納したいのは、ソーティングの際に配列の方だとやりやすいと考えているからです。
malloc関数を使えば実行できるかもしれないなどと考えていますが…無謀でしょうか…?
まずはあなたの環境でできるかどうかやってみてください。

コード:

#include <stdio.h>
#include <stdlib.h>

#define NUM 500000000

int main(void) {
    volatile int *x = malloc(sizeof(int) * NUM);
    int i;
    if (x == NULL) {
        perror("malloc");
        return 1;
    }
    x[0] = 1;
    for (i = 0; i < NUM; i++) {
        x[i] = (x[i - 1] + i) % 1234567;
    }
    printf("%d\n", x[NUM - 1]);
    return 0;
}
ちなみにWandboxIdeone.comではエラーになりました。
ベルジオン さんが書きました:5億の乱数を取得したかったのはソーティングアルゴリズムの比較をするためです。
5億件も使わないと差がでないほど高性能なコンピュータを使っているのですか?
例えば、百万~一千万件くらいではダメですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#17

投稿記事 by ベルジオン » 9年前

コード:

#include <stdio.h>
#include <stdlib.h>
 
#define NUM 500000000
 
int main(void) {
    volatile int *x = malloc(sizeof(int) * NUM);
    int i;
    if (x == NULL) {
        perror("malloc");
        return 1;
    }
    x[0] = 1;
    for (i = 0; i < NUM; i++) {
        x[i] = (x[i - 1] + i) % 1234567;
    }
    printf("%d\n", x[NUM - 1]);
    return 0;
}

こちらのコードは実行が出来ました。
ファイルから要素を読み込み配列に入れるプログラムを書いてみたところ

コード:

#include <stdio.h>

void main()
{
	int i, n;
	float siny[10];
	FILE *fp;
	int *testarray;


	fp = fopen("test2.txt", "r");     /*  読み込みモードでファイルをオープン  */
	if (fp == NULL) {
		printf("ファイルを開くことが出来ませんでした.¥n");
		return;
	}

	for (i = 0; i<5000000; i++) {
		testarray = (int *)malloc(500000 * sizeof(int));
		fscanf(fp, "%f", &(testarray));     /*  1行読む  */
	}

	fclose(fp);

	i = 0;


	for (i = 0; i<i<5000000; i++) {
		printf("%f¥n", siny[i]);
	}
}
コンパイルは通りましたが、実行途中でメモリクラッシュしました。
何が原因なのか掴めません…。

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#18

投稿記事 by ベルジオン » 9年前

みけCAT さんが書きました: 5億件も使わないと差がでないほど高性能なコンピュータを使っているのですか?
例えば、百万~一千万件くらいではダメですか?
なるべく多い数でアルゴリズムの比較をしてみたかっただけす。
百万~五千万件あたりの数なら実行可能でしょうか…?

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#19

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

ベルジオン さんが書きました:こちらのコードは実行が出来ました。
エラーメッセージが表示されましたか?それとも適当な数値が出力されましたか?どっちでもないですか?
ベルジオン さんが書きました:コンパイルは通りましたが、実行途中でメモリクラッシュしました。
何が原因なのか掴めません…。
  • 18行目:現代の多くの環境では、10TBもの領域をメインメモリに、swap領域を含めても確保することはできないでしょう。きちんと確保できたかどうかのチェックが必要です。ここでは戻り値を利用していないので、チェックは不要ですね。
  • 19行目:fscanfの%fはfloat*型の値を要求します。int**型の値を渡すとundefined behaviorになります。
  • 27行目:i<iは常に偽なので0になり、0<5000000は常に真なので無限ループになります。そして、28行目で確保された範囲外への危険なアクセスが発生するでしょう。
  • 28行目:初期化も代入もされていない自動変数の値は不定であり、それを使うのはundefined behaviorです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#20

投稿記事 by ベルジオン » 9年前

みけCAT さんが書きました: エラーメッセージが表示されましたか?それとも適当な数値が出力されましたか?どっちでもないですか?
適当な数値が出力されました。
みけCAT さんが書きました:
  • 18行目:現代の多くの環境では、10TBもの領域をメインメモリに、swap領域を含めても確保することはできないでしょう。きちんと確保できたかどうかのチェックが必要です。ここでは戻り値を利用していないので、チェックは不要ですね。
  • 19行目:fscanfの%fはfloat*型の値を要求します。int**型の値を渡すとundefined behaviorになります。
  • 27行目:i<iは常に偽なので0になり、0<5000000は常に真なので無限ループになります。そして、28行目で確保された範囲外への危険なアクセスが発生するでしょう。
  • 28行目:初期化も代入もされていない自動変数の値は不定であり、それを使うのはundefined behaviorです。
つまり10TBもの容量をメインメモリに確保しようとした上に、値がことなる引数を渡し、領域外のアクセス及び不定な変数を参照しようとしたためにメモリクラッシュが起こったということでしょうか?
これなの問題を解決するには
  • 18:確保領域の変更?
  • 19:変数のキャストを実行
  • 27:i<iではなくi<50000;等に変更
  • 28:配列の初期化を実行
等を行えばいいということでしょうか・・・?

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#21

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

ベルジオン さんが書きました:コンパイルは通りましたが、実行途中でメモリクラッシュしました。
何が原因なのか掴めません…。
18行目の大量確保の試みではクラッシュまでは行かないだろうし、
19行目は有効なポインタを渡し、ポインタ変数にfloat型の値を書き込ませているので、ポインタが4バイトまたは8バイト、float型が4バイトの「普通」の環境ではクラッシュはしないでしょう。
また、28行目で不定の値を読み込んでも、「普通」はデタラメな値が出力されるだけでしょう。

従って、クラッシュの原因は27行目の無限ループでiを十分大きな値にした後、28行目で読み込みが禁止されている(x86のページングならユーザ用の領域でない)またはできない(x86のページングなら物理ページが割り当てられていない)場所を読み込もうとしたことでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#22

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

ベルジオン さんが書きました:18:確保領域の変更?
ループのに、十分な要素数(500000ではなく5000000?)を1回確保してください。
また、自分も忘れてしまいましたが、mallocで確保した領域はfreeで開放するべきでしょう。
ベルジオン さんが書きました:19:変数のキャストを実行
単にキャストするのではなく、最初から正しいデータを渡してください。
int型のデータを読み込むには、%fではなく、%dまたは%iを使わなければなりません。
また、testarrayが先頭を指す配列のi番目の要素へのポインタは、testarray + iと表現できます。
ベルジオン さんが書きました:27:i<iではなくi<50000;等に変更
  • 比較の結果と数値を比較しているのがおかしい
  • i<iをiにしても、比較対象の数値が大きすぎる
のが問題です。
i<(int)(sizeof(siny)/sizeof(siny[0]))とするといいでしょう。
ベルジオン さんが書きました:28:配列の初期化を実行
有効な対処の一つでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#23

投稿記事 by ベルジオン » 9年前

いくつかの点を変更しました

コード:

#include <stdio.h>

void main()
{
	int i, n;
	float siny[5000000];
	FILE *fp;
	int *testarray;


	fp = fopen("test2.txt", "r");     /*  読み込みモードでファイルをオープン  */
	if (fp == NULL) {
		printf("ファイルを開くことが出来ませんでした.¥n");
		return;
	}

	for (i = 0; i<5000000; i++) {
		testarray = (int *)malloc(sizeof(int) * 5000000);
		fscanf(fp, "%f", &(testarray));     /*  1行読む  */
	}

	fclose(fp);

	i = 0;


	for (i = 0; i<5000000; i++) {
		printf("%f¥n", testarray[i]);
	}
}

実行した所Segmentation fault (コアダンプ)が発生しました。
このソースでやりたいことは、test2.txtファイルから要素を配列にいれ、それをprintfを用いて確認を取るという動作です。

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#24

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

ベルジオン さんが書きました:実行した所Segmentation fault (コアダンプ)が発生しました。
スタックオーバーフローの疑いがあります。
float sinyの前にstaticを付けて静的変数にすると、発生しなくなるかもしれません。


こんな巨大な領域はおそらく確保出来ないので、testarrayにNULLが代入され、28行目で無効なポインタをデリファレンスしようとして落ちているのでしょう。
(その前にスタックオーバーフローによってiやfp、testarrayがアクセス出来ない位置に来て、そこにアクセスすることで落ちている可能性も考えられますが)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#25

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

ベルジオン さんが書きました:実行した所Segmentation fault (コアダンプ)が発生しました。
おめでとうごさいます。正常終了するけどなぜか出力が間違っている、みたいなバグに比べて、かなり改善しやすいですよ。
まずはデバッガを用いて、どこで落ちているかを確認するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#26

投稿記事 by ベルジオン » 9年前

mallocを使うとオーバーフローするというニュアンスで受け取ったので、使わないようにソースを書き換えてみました。

コード:

#include <stdio.h>

void main()
{
	int i, n;
	int siny[5000000];
	FILE *fp;


	fp = fopen("test2.txt", "r");     /*  読み込みモードでファイルをオープン  */
	if (fp == NULL) {
		printf("ファイルを開くことが出来ませんでした.¥n");
		return;
	}

	for (i = 0; i<5000000; i++){
		fscanf(fp, "%d", siny[i);     /*  1行読む  */
	}

	fclose(fp);

	i = 0;


	for (i = 0; (int)(sizeof(siny) / sizeof(siny[0])); i++) {
		printf("%f¥n", siny[i]);
	}
}

ただしこれを実行するとsample.c:17:26: エラー: expected ‘]’ before ‘)’ tokenが発生します。
先ほどのコアダンプが発生したところをデバッガを用いて確認したいと思います。

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#27

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

ベルジオン さんが書きました:mallocを使うとオーバーフローするというニュアンスで受け取ったので、
それは誤解です。
ベルジオン さんが書きました:ただしこれを実行するとsample.c:17:26: エラー: expected ‘]’ before ‘)’ tokenが発生します。
これを実行…?Windowsのエクスプローラでファイルを開く操作をする、というような意味でしょうか?
とりあえず、「発生します」で思考停止せずにその程度のコンパイルエラーは自分で直して欲しいです。
エラーメッセージの通り、fscanf(fp, "%d", siny[i);のiと)の前に]を入れればコンパイルは通るでしょう。
(これだけの修正では型の不一致でundefined behaviorになり、アクセス違反になる可能性が高いですが)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#28

投稿記事 by ベルジオン » 9年前

すみません…[だけの場所を指摘されるまで探すことが出来ませんでした。
その点のみ修正した所、コンパイルは通り、実行した所コアダンプが発生しました。
型の不一致…とのことですが、fscanfの部分でしょうか…? デバッカが中々使えないもので…

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#29

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

No: 23のコードを修正してみました。
  • implementation-definedのvoid main()ではなく、標準のint main(void)を使用する。
  • 無駄な領域を確保しない。
  • 書式と型を合わせる。
  • 読み込み先のアドレスを正しく指定する。
  • 無駄な代入処理を削除する。
  • メモリを確保できたか確認する。
  • マジックナンバー(意味が非自明な数字が直接書かれた定数)の使用を避ける。
    特に同じパラメータを複数書くのを避ける。
  • malloc()で確保した領域はfree()で開放する。
  • 使用していない変数は削除する。
  • malloc()やfree()を使うために、それらの関数の宣言を含むstdlib.hをインクルードする。

コード:

#include <stdio.h>
#include <stdlib.h>

#define NUM 5000000

int main(void)
{
	int i;
	FILE *fp;
	float *testarray;

	fp = fopen("test2.txt", "r");     /*  読み込みモードでファイルをオープン  */
	if (fp == NULL) {
		printf("ファイルを開くことが出来ませんでした.¥n");
		return 1;
	}

	testarray = (float *)malloc(sizeof(float) * NUM);
	if (testarray == NULL) {
		printf("メモリを確保することが出来ませんでした.¥n");
		return 1;
	}

	for (i = 0; i<NUM; i++) {
		testarray[i] = 0;     /*  読み込めなかった場合に、値が不定になるのを防ぐ  */
		fscanf(fp, "%f", &testarray[i]);     /*  1行読む  */
	}

	fclose(fp);

	for (i = 0; i<NUM; i++) {
		printf("%f¥n", testarray[i]);
	}

	free(testarray);
	return 0;
}

オフトピック
改行の代わりに¥nを出力するの、面白いですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#30

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

ベルジオン さんが書きました:型の不一致…とのことですが、fscanfの部分でしょうか…?
はい。sinyの要素(siny)ではなく、それを指すポインタ(&siny)を渡さなければいけません。
また、int型の値を出力するには、printfの書式も%fではなく%dを用いるべきでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#31

投稿記事 by ベルジオン » 9年前

ありがとうございます。無事コンパイルすることが出来ました。
しかし、実行するとn43146788.000000¥n3179376896.000000¥nのように、存在しない000000も含めて出力されてしまいます。
改行コードを出力してしまったのでしょうか…?

(¥nはwindowsでも改行できるかと思い使用していました…)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#32

投稿記事 by ベルジオン » 9年前

ベルジオン さんが書きました:ありがとうございます。無事コンパイルすることが出来ました。
しかし、実行するとn43146788.000000¥n3179376896.000000¥nのように、存在しない000000も含めて出力されてしまいます。
改行コードを出力してしまったのでしょうか…?

(¥nはwindowsでも改行できるかと思い使用していました…)
%fでfloat型にしていますから当たり前ですね…

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#33

投稿記事 by ベルジオン » 9年前

ベルジオン さんが書きました:ありがとうございます。無事コンパイルすることが出来ました。
しかし、実行するとn43146788.000000¥n3179376896.000000¥nのように、存在しない000000も含めて出力されてしまいます。
改行コードを出力してしまったのでしょうか…?

(¥nはwindowsでも改行できるかと思い使用していました…)
%fでfloat型にしていますから当たり前ですね…

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

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#34

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

ベルジオン さんが書きました:(¥nはwindowsでも改行できるかと思い使用していました…)
¥nで改行できる環境があるのですか?少なくとも、Windowsのコマンドプロンプトでは改行できません。
ベルジオン さんが書きました:%fでfloat型にしていますから当たり前ですね…
そうですね。%gを使うと改善するかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ベルジオン

Re: メルセンヌ・ツイスタを使用した乱数をファイルに出力

#35

投稿記事 by ベルジオン » 9年前

みけCAT さんが書きました: ¥nで改行できる環境があるのですか?少なくとも、Windowsのコマンドプロンプトでは改行できません。
\nじゃないと出来ないですね…すみません
ありがとうございます。解決にさせていただきます。

閉鎖

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