学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

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

学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#1

投稿記事 by matunon » 10年前

皆様お願いします!
作成環境はVisualStudio2010C++です。
問題は以下のとおりです。
[album]793[/album]
[album]794[/album]
今のところのコードは以下のとおりです。
usaoさんのアドバイスを元に修正。
みけCATさんのアドバイスを元に修正。

コード:

/* 標準入出力用ヘッダファイルのインクルード */
#include<stdio.h>
/* 警告C4996を出さない */
#pragma warning ( disable : 4996 )
/* プロトタイプ宣言 */
int input();
int save();
int change();
int disp();
/*********************************
機能:data_input中のセットされたビット数を返す
引数:data_input
戻り値:count
備考:
**********************************/
//int count_bits(unsigned long x){
//	int count = 0;
//	while(x){
//		if(x&1U){
//			count++;
//		}
//		x >>= 1;
//	}
//	return(count);
//}
/*********************************
機能:ビット数を返す
引数:無し
戻り値:count_bits()
備考:
**********************************/
//int int_bits(void){
//	return(count_bits(~0U));
//}
/*********************************
機能:ビット内容を表示
引数:data_input
戻り値:無し
備考:
**********************************/
//void print_bits(unsigned long x){
//	int i;
//	for(i=int_bits()-1;i>=0;i--){
//		putchar(((x >> i) & 1U) ? '1' : '0');
//	}
//}
/*********************************
機能:data_inputにビット単位でデータを代入していく
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int input(long *data,int *sc){
	long data_input;
	long tmp;
	if(*sc<=10){
		printf("データ入力画面です\n");
		printf("Yellowの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if((tmp>=0) && (tmp<=255)){
			data_input = data_input|tmp;
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Redの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if((tmp>=0) && tmp<=255){
			data_input = data_input|(tmp<<8);
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Greenの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=0 && tmp<=255){
			data_input = data_input|(tmp<<16);
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Soundの値を0~15までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=0 && tmp<=15){
			data_input = data_input|(tmp<<24);
			tmp = 0;
		}
		else{
			printf("0~15までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("繰り返す回数を1~3までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=1 && tmp<=3){
			data_input = data_input|(tmp<<30);
			tmp = 0;
		}
		else{
			printf("1~3までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("%ld",data_input);
		printf("\n");
		data[*sc] = data_input;
		*sc++;
	}
	else{
		printf("ファイルを保存できる限界を超えました。");
	}
	return(0);
}
/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(long *data,int sc){
	int i;
	FILE *fp;
	fp = fopen("PI.txt","w");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fprintf(fp,"%ld,",data[i]);
		}
	}
	fclose(fp);
	return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(long *data,long (*data_b)[10],int sc){
	int i,j,t;
	long l;
	long data_tmp;
	int Red,Green,Yellow;
	int Sound;
	int Repeat;
	int data_num;
	FILE *fp;
	fp = fopen("PI.txt","r");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fscanf(fp,"%ld,",&l);
			data_tmp = l;
			Yellow = data_tmp & 255;
			Red = (data_tmp>>8) & 255;
			Green = (data_tmp>>8) & 255;
			Sound = (data_tmp>>8) & 15;
			Repeat = (data_tmp>>6) & 3;
			data_num = i+1;
			data_b[14][i] = Repeat;
			data_b[0][i] = data_num;
			for(j=0;j<Repeat;j++){
				t = j * 4;
				data_b[t+1][i] = data_num;
				data_b[t+2][i] = data_num;
				data_b[t+3][i] = data_num;
				data_b[t+4][i] = data_num;
			}
		}
	}
	fclose(fp);
	return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(long (*data_b)[10],int sc){
	int i,j,r;
	for(i=0;i<sc;i++){
		r = data_b[13][i];
		for(j=0;j<=r*4;j++){
			printf("%ld",data_b[j][i]);
		}
	}
	return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
	char menu = 0;
	long data_tmp[10];
	long data_disp[14][10];
	long data_input[10];
	int save_count = 0;

	while(1)
	{
		printf("メニュー\n");
		printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
		printf("メニューの数字を選択し、入力してください:");
		scanf("%d",&menu);
		printf("\n");

		switch(menu)
		{
			case 1 :input(data_input,&save_count);
					break;
			case 2 :save(data_input,save_count);
					break;
			case 3 :change(data_tmp,data_disp,save_count);
					break;
			case 4 :disp(data_disp,save_count);
					break;
			default :break;
		}
	}
	return(0);
}
このコードでエラーは出ませんが、動作しません。(ファイルへの入出力がされていない。そもそも*dataの配列に値を格納できていない?)
直した方が良い点などもありましたらお願いします!
少し長文になってしまいましたがご教授お願いいたします。
最後に編集したユーザー matunon on 2014年3月18日(火) 15:43 [ 編集 1 回目 ]

アバター
usao
記事: 1889
登録日時: 11年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#2

投稿記事 by usao » 10年前

とりあえず問題文すら見てませんが
ファイルを開いては閉じるという行為をループで繰り返すのは何か間違っているような気がしますね.

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#3

投稿記事 by matunon » 10年前

usao さんが書きました:とりあえず問題文すら見てませんが
ファイルを開いては閉じるという行為をループで繰り返すのは何か間違っているような気がしますね.
ファイルの開閉をfor文の外でやるべきということでしょうか?
修正しました
まだ、正しく動作しません。
おこがましいお願いではありますが、引き続きお願いします。

コード:

/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(long *data,int sc){
	int i;
	FILE *fp;
	fp = fopen("PI.txt","w");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fprintf(fp,"%l,",data[i]);
		}
	}
	fclose(fp);
	return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(long *data,long (*data_b)[10],int sc){
	int i,j,t;
	long l;
	long data_tmp;
	int Red,Green,Yellow;
	int Sound;
	int Repeat;
	int data_num;
	FILE *fp;
	fp = fopen("PI.txt","r");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fscanf(fp,"%l,",&l);
			data_tmp = l;
			Yellow = data_tmp & 255;
			Red = (data_tmp>>8) & 255;
			Green = (data_tmp>>8) & 255;
			Sound = (data_tmp>>8) & 15;
			Repeat = (data_tmp>>6) & 3;
			data_num = i+1;
			data_b[14][i] = Repeat;
			data_b[0][i] = data_num;
			for(j=0;j<Repeat;j++){
				t = j * 4;
				data_b[t+1][i] = data_num;
				data_b[t+2][i] = data_num;
				data_b[t+3][i] = data_num;
				data_b[t+4][i] = data_num;
			}
		}
	}
	fclose(fp);
	return(0);
}

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#4

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

fscanfとfprintfで、%lとなっているところを%ldに修正するべきだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#5

投稿記事 by matunon » 10年前

みけCAT さんが書きました:fscanfとfprintfで、%lとなっているところを%ldに修正するべきだと思います。
修正してみました。
一番初めのレスのコードを修正しました。
ただ、まだうまく行きません・・・・。

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#6

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

・input関数の115行目で、scの値を増やしています。
・main関数の220行目で、scanfの識別子とポインタの型が合っていません。
以上の2点、アクセス違反や誤動作の原因になりそうな場所が見つかりました。

また、6~9行目のプロトタイプ宣言と実際の関数の型が違うのも気になります。

参考として、手元のコンパイラでコンパイルした結果を貼っておきます。
task.cppは、No: 1のコード(修正前)のsave関数とchange関数をNo: 3のコードに差し替えたものです。

task.cpp
► スポイラーを表示
コンパイラのメッセージ
► スポイラーを表示
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#7

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

必要のない記事の編集は控えていただけるとありがたいです。
今回の場合、新しいコードは普通に返信で書けばいいと思うのですが、何かそうできない理由がありますか?
フォーラムルール さんが書きました:3. 禁止行為について

以下の行為を禁止行為として定めます。
(略)
[C言語何でも質問掲示板でのみ適用される事項]
(略)
記事の内容を無暗に変更する行為
(以下略)
(http://dixq.net/board/board.html)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#8

投稿記事 by matunon » 10年前

みけCAT さんが書きました:必要のない記事の編集は控えていただけるとありがたいです。
今回の場合、新しいコードは普通に返信で書けばいいと思うのですが、何かそうできない理由がありますか?
フォーラムルール さんが書きました:3. 禁止行為について

以下の行為を禁止行為として定めます。
(略)
[C言語何でも質問掲示板でのみ適用される事項]
(略)
記事の内容を無暗に変更する行為
(以下略)
(http://dixq.net/board/board.html)
すいません。来たばかりなものでこっちの方が見やすいかもと思ってしまいました。
今後気をつけます。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#9

投稿記事 by matunon » 10年前

色々修正してみました。
input関数内にてprintf関数を用いて値を見てみたのですが(すべて最大値で実験)
Yellowの値を入力した時点で255(11111111)
Redの値を入力した時点で65535(1111111111111111)
Greenの値を入力した時点で16777215(111111111111111111111111)
Soundの値を入力した時点で268435455(1111111111111111111111111111)
ここまでは自分の思ったとおりに代入できているのですが、繰り返しの回数を代入すると、
-805306369(11111111111111111111111111111111 11001111111111111111111111111111)
となってしまいます。上位桁の1の大群がなぜ入ってきているのかわからない状況です。
修正したコードは以下になります。

コード:

/* 標準入出力用ヘッダファイルのインクルード */
#include<stdio.h>
/* 警告C4996を出さない */
#pragma warning ( disable : 4996 )
/* プロトタイプ宣言 */
int input(unsigned long *,int);
int save(unsigned long *,int);
int change(unsigned long *,long *,int);
int disp(long *,int);
/*********************************
機能:data_input中のセットされたビット数を返す
引数:data_input
戻り値:count
備考:
**********************************/
//int count_bits(unsigned long x){
//	int count = 0;
//	while(x){
//		if(x&1U){
//			count++;
//		}
//		x >>= 1;
//	}
//	return(count);
//}
/*********************************
機能:ビット数を返す
引数:無し
戻り値:count_bits()
備考:
**********************************/
//int int_bits(void){
//	return(count_bits(~0U));
//}
/*********************************
機能:ビット内容を表示
引数:data_input
戻り値:無し
備考:
**********************************/
//void print_bits(unsigned long x){
//	int i;
//	for(i=int_bits()-1;i>=0;i--){
//		putchar(((x >> i) & 1U) ? '1' : '0');
//	}
//}
/*********************************
機能:data_inputにビット単位でデータを代入していく
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int input(unsigned long *data,int sc){
	unsigned long data_input;
	unsigned long tmp;
	if(sc<=10){
		printf("データ入力画面です\n");
		printf("Yellowの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if((tmp>=0) && (tmp<=255)){
			data_input = data_input|tmp;
			printf("%ld\n",data_input);
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Redの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if((tmp>=0) && tmp<=255){
			data_input = data_input|(tmp<<8);
			printf("%ld\n",data_input);
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Greenの値を0~255までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=0 && tmp<=255){
			data_input = data_input|(tmp<<16);
			printf("%ld\n",data_input);
			tmp = 0;
		}
		else{
			printf("0~255までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("Soundの値を0~15までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=0 && tmp<=15){
			data_input = data_input|(tmp<<24);
			printf("%ld\n",data_input);
			tmp = 0;
		}
		else{
			printf("0~15までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("\n");
		printf("繰り返す回数を1~3までで入力してください:");
		scanf("%ld",&tmp);
		if(tmp>=1 && tmp<=3){
			data_input = data_input|(tmp<<30);
			printf("%ld\n",data_input);
			tmp = 0;
		}
		else{
			printf("1~3までの整数を入力してください!\n");
			tmp = 0;
		}
		printf("%ld",data_input);
		printf("\n");
		data[sc] = data_input;
	}
	else{
		printf("ファイルを保存できる限界を超えました。");
	}
	return(0);
}
/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(unsigned long *data,int sc){
	int i;
	FILE *fp;
	fp = fopen("PI.txt","w");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fprintf(fp,"%ld,",data[i]);
		}
	}
	fclose(fp);
	return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(unsigned long *data,long (*data_b)[10],int sc){
	int i,j,t;
	long l;
	long data_tmp;
	int Red,Green,Yellow;
	int Sound;
	int Repeat;
	int data_num;
	FILE *fp;
	fp = fopen("PI.txt","r");
	for(i=0;i<sc;i++){
		if(fp == NULL){
			printf("\aファイルをオープンできません。\n");
		}
		else{
			fscanf(fp,"%ld,",&l);
			data_tmp = l;
			Yellow = data_tmp & 255;
			Red = (data_tmp>>8) & 255;
			Green = (data_tmp>>8) & 255;
			Sound = (data_tmp>>8) & 15;
			Repeat = (data_tmp>>6) & 3;
			data_num = i+1;
			data_b[14][i] = Repeat;
			data_b[0][i] = data_num;
			for(j=0;j<Repeat;j++){
				t = j * 4;
				data_b[t+1][i] = data_num;
				data_b[t+2][i] = data_num;
				data_b[t+3][i] = data_num;
				data_b[t+4][i] = data_num;
			}
		}
	}
	fclose(fp);
	return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(long (*data_b)[10],int sc){
	int i,j,r;
	for(i=0;i<sc;i++){
		r = data_b[13][i];
		for(j=0;j<=r*4;j++){
			printf("%ld",data_b[j][i]);
		}
	}
	return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
	int menu;
	unsigned long data_tmp[10];
	long data_disp[14][10];
	unsigned long data_input[10];
	int save_count = 0;

	while(1)
	{
		printf("メニュー\n");
		printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
		printf("メニューの数字を選択し、入力してください:");
		scanf("%d",&menu);
		printf("\n");

		switch(menu)
		{
			case 1 :input(data_input,save_count);
					save_count++;
					break;
			case 2 :save(data_input,save_count);
					break;
			case 3 :change(data_tmp,data_disp,save_count);
					break;
			case 4 :disp(data_disp,save_count);
					break;
			default :break;
		}
	}
	return(0);
}

アバター
usao
記事: 1889
登録日時: 11年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#10

投稿記事 by usao » 10年前

>上位桁の1の大群がなぜ入ってきているのかわからない状況です。
unsigned な値を signed として表示しているからではないでしょうか.

そのようにまともに動いているかどうかを変数を実際に表示等してみてデバッグしていくと良いですね.

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#11

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

matunon さんが書きました:上位桁の1の大群がなぜ入ってきているのかわからない状況です。
「1の大群」はどのようなプログラム/方法で表示していますか?
おそらく、その表示方法の仕様だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#12

投稿記事 by matunon » 10年前

usao さんが書きました:>上位桁の1の大群がなぜ入ってきているのかわからない状況です。
unsigned な値を signed として表示しているからではないでしょうか.

そのようにまともに動いているかどうかを変数を実際に表示等してみてデバッグしていくと良いですね.
返信有難うございます。
コードの通りunsigned型で指定したつもりだったのですが・・・・・・
どうすればunsigned型に戻せるでしょうか?

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#13

投稿記事 by matunon » 10年前

みけCAT さんが書きました:
matunon さんが書きました:上位桁の1の大群がなぜ入ってきているのかわからない状況です。
「1の大群」はどのようなプログラム/方法で表示していますか?
おそらく、その表示方法の仕様だと思います。
返信有難うございます。
プログラムはコードの通りになります。
方法はVisualStudioにてコマンドプロンプトで表示しています。

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#14

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

matunon さんが書きました:色々修正してみました。
input関数内にてprintf関数を用いて値を見てみたのですが(すべて最大値で実験)
Yellowの値を入力した時点で255(11111111)
Redの値を入力した時点で65535(1111111111111111)
Greenの値を入力した時点で16777215(111111111111111111111111)
Soundの値を入力した時点で268435455(1111111111111111111111111111)
ここまでは自分の思ったとおりに代入できているのですが、繰り返しの回数を代入すると、
-805306369(11111111111111111111111111111111 11001111111111111111111111111111)
となってしまいます。
matunon さんが書きました:プログラムはコードの通りになります。
方法はVisualStudioにてコマンドプロンプトで表示しています。
gcc、VCともに、No: 9のコードでは再現できませんでした。
1の大群は表示されませんし、全然違った数値になっています。
数値が違うのは、data_inputが初期化されていないからだと思います。

gcc 4.8.1での結果の例

コード:

データ入力画面です
Yellowの値を0~255までで入力してください:255
1981823743

Redの値を0~255までで入力してください:255
1981874175

Greenの値を0~255までで入力してください:255
1996488703

Soundの値を0~15までで入力してください:15
2147483647

繰り返す回数を1~3までで入力してください:3
-1
-1
VC2008での結果の例

コード:

データ入力画面です
Yellowの値を0~255までで入力してください:255
1466694655

Redの値を0~255までで入力してください:255
1466695679

Greenの値を0~255までで入力してください:255
1476395007

Soundの値を0~15までで入力してください:15
1610612735

繰り返す回数を1~3までで入力してください:3
-536870913
-536870913
matunon さんが書きました:コードの通りunsigned型で指定したつもりだったのですが・・・・・・
どうすればunsigned型に戻せるでしょうか?
%ldのかわりに%luを用いてください。
単語と記号 (苦C)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#15

投稿記事 by matunon » 10年前

%luに直したところ数値の表示は正しい形になりました。
ありがとうございます。
この調子で行けるかと思い、実行してみたのですが・・・・・・
PI.txtに入っている値は3489660927,でした。
なので表示もうまくいくと思ったのですが、プロンプトに表示されたのは最初に0の大群で、その後によくわからない数列、また0の大群と表示されて強制終了となります。
以下、修正したコードです。
► スポイラーを表示
すいません。
お願いします。
最後に編集したユーザー matunon on 2014年3月18日(火) 19:55 [ 編集 1 回目 ]

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#16

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

とりあえず、disp関数で使用しているprintfに渡している書式が間違っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#17

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

input関数で使用している変数data_inputの初期化もするべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#18

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

matunon さんが書きました:%luに直したところ数値の表示は正しい形になりました。
ありがとうございます。
この調子で行けるかと思い、実行してみたのですが・・・・・・
PI.txtに入っている値は3489660927,でした。
なので表示もうまくいくと思ったのですが、プロンプトに表示されたのは最初に0の大群で、その後によくわからない数列、また0の大群と表示されて強制終了となります。
手元のVC2008では再現できませんでした。
表示を実行しても、何も表示されずに終了します。
行った操作(入力)を教えていただけますか?

実行結果

コード:

YUKI.N>cl task.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

task.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:task.exe
task.obj

YUKI.N>cat PI.txt
3489660927,
YUKI.N>task.exe
メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:3

メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:4

メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:^C
YUKI.N>
環境
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#19

投稿記事 by matunon » 10年前

disp関数のprintf関数の書式を%lから%ldに変えました。見逃してましたすいません。
input関数のdata_inputを変数宣言部にて初期化しました。
以上のようにしたところ、-符号のついた数字が大量に現れるようになりました。
その後強制終了します。
以下コード
► スポイラーを表示
お願いします!

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#20

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

gccでは再現しませんでしたが、VC2008での強制終了の再現に成功しました。
とりあえずメモとして実行結果の例を貼ります。

コード:

YUKI.N>cl task.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

task.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:task.exe
task.obj

YUKI.N>task
メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:1

データ入力画面です
Yellowの値を0~255までで入力してください:255
255

Redの値を0~255までで入力してください:255
65535

Greenの値を0~255までで入力してください:255
16777215

Soundの値を0~15までで入力してください:15
268435455

繰り返す回数を1~3までで入力してください:3
3489660927
3489660927
メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:2

メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:4

4213839メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:3

メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:4

142106880119277327274582753675660294276881395-1006632764293954002936012812871929
36012812448881244976-80530636912450640214734848002147348480000000004240041945120
19694040961024006400000000000000000000000000000000000000000000000000000000000000
0000000000000000000000
YUKI.N>
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#21

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

より少ない手順での再現例です。

コード:

YUKI.N>task
メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:1

データ入力画面です
Yellowの値を0~255までで入力してください:255
255

Redの値を0~255までで入力してください:255
65535

Greenの値を0~255までで入力してください:255
16777215

Soundの値を0~15までで入力してください:15
268435455

繰り返す回数を1~3までで入力してください:3
3489660927
3489660927
メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:3

メニュー
1:データ入力
2:データ保存
3:データ変換
4:データ表示
メニューの数字を選択し、入力してください:4

142106880119277327274582753675660294276881395-1006632764234971602346188812871923
46188812448881244976-80530636912450640214734848002147348480000000004240041945120
19694040961024006400000000000000000000000000000000000000000000000000000000000000
0000000000000000000000
YUKI.N>
原因は調査中です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#22

投稿記事 by matunon » 10年前

すいません。ありがとうございます!
自分の方でもがんばってみます。
最終的に頼りきりになってしまいそうですが・・・・・・

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#23

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

・176行目で配列の確保された領域の範囲外にアクセスしています。
・178行目でのRepeatの値は高々3なので、data_b[13]には値が代入されません。
 その結果、disp関数内のrの値が不定になり、運が悪いとアクセス違反になります。
 (運がいいとrが負の値になり、アクセス違反にならずにすみます)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#24

投稿記事 by matunon » 10年前

返信有難うございます。
よく考えたら2次元配列data_dispに入るのは最大で255なのでint型に変えました。
そうして実行したところ、結果は1111111111111が表示されました。
Repeat変数がたかだか3なので入らないと言うのはint型にして確保する領域を狭くするというのでは根本的な解決にはならないのでしょうか?
また、32bitのunsigned long型を16bit右シフトしただけのつもりだったのですが、領域外になってしまったのはなぜなのでしょうか?
質問多くてすいません。
お願いします。
以下修正?してみたコード
► スポイラーを表示
最後に編集したユーザー matunon on 2014年3月18日(火) 19:54 [ 編集 1 回目 ]

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#25

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

change関数で使用するシフトの幅が間違っている上、
せっかく取得したRed,Green,Yellow,Soundのデータを全く使わず、ただ捨てています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#26

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

matunon さんが書きました:Repeat変数がたかだか3なので入らないと言うのはint型にして確保する領域を狭くするというのでは根本的な解決にはならないのでしょうか?
なりません。まず「何の」根本的解決の話ですか?
matunon さんが書きました:また、32bitのunsigned long型を16bit右シフトしただけのつもりだったのですが、領域外になってしまったのはなぜなのでしょうか?
「32bitのunsigned long型を16bit右シフト」するコードは見当たりません。
領域外になったのは、直接的にはdisp関数のjの値が大きすぎる値になったからです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#27

投稿記事 by matunon » 10年前

返信有難うございます!
とりあえず出来ました!ただ、シフトの幅のことが今ひとつ理解できていないです。
すいませんが、ヒントだけでも・・・・。
とりあえず表示に成功したコードを以下に・・・・・
► スポイラーを表示
最後に編集したユーザー matunon on 2014年3月18日(火) 19:55 [ 編集 1 回目 ]

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#28

投稿記事 by matunon » 10年前

ビットシフトについてです。
x = 1111;
x>>2; /* 11 */
x>>1; /* 1 */
というふうにシフトされた値を保持しているわけではなく、
x = 1111;
x>>2; /* 11 */
x>>1; /* 111 */
といった感じにその都度取得したい桁までシフトしなければならないのでしょうか?

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#29

投稿記事 by box » 10年前

変数save_countの使い方は本当に適切かな?と思います。

ファイルポインターfpがNULLかどうかをループの中で毎回チェックするのは
本当に必要なのかな?と思います。

また、氏名などの個人情報をネットにさらすのはやめる方がよいでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#30

投稿記事 by matunon » 10年前

box さんが書きました:変数save_countの使い方は本当に適切かな?と思います。

ファイルポインターfpがNULLかどうかをループの中で毎回チェックするのは
本当に必要なのかな?と思います。

また、氏名などの個人情報をネットにさらすのはやめる方がよいでしょう。
あああああ気をつけてたのにwwご指摘ありがとうございます。
念のためですが、他人のソースではありません。説得力がネット上では皆無ですが。

save_countの使いドコロはいまだに迷ってます。
熟練の方ならどの位置に置くのでしょうか?
そもそもsave_countを用いている理由が保持しているデータの総数を知ることなのですが、そういうのを調べる技法?みたいなものはあるのでしょうか?
前々からこのような課題が出ると、まずこのsave_count変数を作っていたのですが他にもやり方ありそうだなーとは思って入るのですが・・・・・・。

ファイルポインタがNULLというのはファイルが存在するかどうかということなんですね。
指摘されて初めて詳しく調べました。
確かに何度もファイルが存在するか調べるのはおかしいですよね。修正します。

ありがとうございます!

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#31

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

matunon さんが書きました:ビットシフトについてです。
x = 1111;
x>>2; /* 11 */
x>>1; /* 1 */
というふうにシフトされた値を保持しているわけではなく、
x = 1111;
x>>2; /* 11 */
x>>1; /* 111 */
といった感じにその都度取得したい桁までシフトしなければならないのでしょうか?
はい。
シフトされた値を保持したい場合は、>>=演算子や<<=演算子が使えます。

コード:

x = 1111;
x>>=2; /* x = 11 */
x>>=1; /* x = 1 */
※ここではxの値を2進数で表現しており、C++のコードとは異なります
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#32

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

matunon さんが書きました:save_countの使いドコロはいまだに迷ってます。
熟練の方ならどの位置に置くのでしょうか?
そもそもsave_countを用いている理由が保持しているデータの総数を知ることなのですが、そういうのを調べる技法?みたいなものはあるのでしょうか?
前々からこのような課題が出ると、まずこのsave_count変数を作っていたのですが他にもやり方ありそうだなーとは思って入るのですが・・・・・・。
データの配列とsave_countをまとめて構造体にし、各関数にその構造体のポインタを渡せばいいと思います。
matunon さんが書きました:ファイルポインタがNULLというのはファイルが存在するかどうかということなんですね。
違います。
C言語のfopenで返されるファイルポインタがNULLというのは、「ファイルのオープンに失敗した」という意味です。
例えば、ファイルが存在してもパーミッションが適切でなければ、ファイルのオープンに失敗する可能性があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#33

投稿記事 by matunon » 10年前

コードをboxさんの指摘どおりに修正してみました。
ただsave_countの位置はかわってません。
► スポイラーを表示
お願いします!

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#34

投稿記事 by matunon » 10年前

返信ありがとうございます!
構造体・・・・・・せっかくです!チャレンジしてみます!

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#35

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

何をお願いされたのかがよくわかりませんが、とりあえずコンパイラの出力した警告メッセージを貼ります。

コード:

YUKI.N>g++ -Wall -Wextra -g3 -o raw_rev9 raw_rev9.cpp -finput-charset=cp932 -fex
ec-charset=cp932
raw_rev9.cpp:4:0: warning: ignoring #pragma warning  [-Wunknown-pragmas]
 #pragma warning ( disable : 4996 )
 ^
raw_rev9.cpp: In function 'int input(long unsigned int*, int)':
raw_rev9.cpp:60:18: warning: comparison of unsigned expression >= 0 is always tr
ue [-Wtype-limits]
         if((tmp>=0) && (tmp<=255)){
                  ^
raw_rev9.cpp:72:18: warning: comparison of unsigned expression >= 0 is always tr
ue [-Wtype-limits]
         if((tmp>=0) && tmp<=255){
                  ^
raw_rev9.cpp:84:17: warning: comparison of unsigned expression >= 0 is always tr
ue [-Wtype-limits]
         if(tmp>=0 && tmp<=255){
                 ^
raw_rev9.cpp:96:17: warning: comparison of unsigned expression >= 0 is always tr
ue [-Wtype-limits]
         if(tmp>=0 && tmp<=15){
                 ^
raw_rev9.cpp: At global scope:
raw_rev9.cpp:153:5: warning: unused parameter 'data' [-Wunused-parameter]
 int change(unsigned long *data,int (*data_b)[10],int sc){
     ^

YUKI.N>
1番目:コンパイラの違いによるものです。無視していいです。
2~5番目:tmpはunsigned long型なので常に正です。
6番目:引数dataが使用されていません。不要ではないですか?(未実装の可能性も考えられます)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#36

投稿記事 by matunon » 10年前

返信有難うございます!

2~5番目:tmpはunsigned long型なので常に正です。
確かに・・・・・・。よく考えればわかることだっただけに悔しいですね。

6番目:引数dataが使用されていません。不要ではないですか?(未実装の可能性も考えられます)
よく見たら使われていませんでした。

コンパイラが違うだけでこんなに指摘してくれる内容が違うんですね。
びっくりしました。
指摘ありがとうございます。
以下修正したコードです。
► スポイラーを表示

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#37

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

main関数の変数data_tmpが使用されていません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#38

投稿記事 by box » 10年前

みけCAT さんが書きました:

コード:

x = 1111;
x>>=2; /* x = 11 */
x>>=1; /* x = 1 */
※ここではxの値を2進数で表現しており、C++のコードとは異なります
そういうコメントを付けるより、とりあえずちゃんと動くであろう書き方を示す方が
よほどためになるのではないでしょうか。
x

せんひゃくじゅういち
と誤解してしまいかねない表現ではなく。
また、1ビット右へシフトした結果が1になるっていうのもちょっとどうかな、と。

質問者さんがますます混乱をきたしてしまいそうです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#39

投稿記事 by matunon » 10年前

>>boxさん
返信有難うございます!
確かに・・・・・。
今後気をつけます!

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#40

投稿記事 by matunon » 10年前

構造体を用いましてやってみました!
ただinput関数のところでif文が同じことを何度も書いています。
なんとかしたいのですが・・・・・。
以下コードです。
► スポイラーを表示

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#41

投稿記事 by matunon » 10年前

すいません。
追加の質問です。
今回表示の形を、

コード:

1       2     3
15  125  0
255   125  0
255   125  0
255   125  0
15            0
255          0
255          0
255          0
と言った具合にデータ番号順に横に並べて表示したいと思っています。
配列に値を代入しなかった場合には表示じたいしないようにしたいです。
どうすればいいでしょうか?
お願いします!

かずま

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#42

投稿記事 by かずま » 10年前

matunon さんが書きました: ただinput関数のところでif文が同じことを何度も書いています。
なんとかしたいのですが・・・・・。
これも同じことを何度も書いていますが、短くはなります。

コード:

int input(save_t *data)
{
    unsigned long data_tmp, tmp;
    if (data->save_count >= 10)
        return puts("ファイルを保存できる限界を超えました。"), 1;
    puts("データ入力画面です");
    do {
        printf("Yellowの値を0~255までで入力してください:");
        if (scanf("%lu", &tmp) != 1 || tmp > 255) break;
        data_tmp = tmp;
        printf("Redの値を0~255までで入力してください:");
        if (scanf("%lu", &tmp) != 1 || tmp > 255) break;
        data_tmp |= tmp << 8;
        printf("Greenの値を0~255までで入力してください:");
        if (scanf("%lu", &tmp) != 1 || tmp > 255) break;
        data_tmp |= tmp << 16;
        printf("Soundの値を0~15までで入力してください:");
        if (scanf("%lu", &tmp) != 1 || tmp > 15)  break;
        data_tmp |= tmp << 24;
        printf("繰り返す回数を1~3までで入力してください:");
        if (scanf("%lu", &tmp) != 1 || tmp < 1 || tmp > 3) break;
        data->data_input[data->save_count] = data_tmp | tmp << 30;
        data->save_count++;
        putchar('\n');
        return 0;
    } while (0);
    scanf("%*[^\n]");
    puts("指定された整数を入力してください!");
    return 1;
}

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#43

投稿記事 by matunon » 10年前

返信ありがとうございます!
解読してみます!

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#44

投稿記事 by matunon » 10年前

scanf("%lu", &tmp) != 1 
これだとどういう意味になるんでしょう?
scanfで取得した値が1でない時、またはscanfで値を取得したかどうかってことでしょうか?

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

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#45

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

matunon さんが書きました:scanf("%lu", &tmp) != 1 
これだとどういう意味になるんでしょう?
scanfで取得した値が1でない時、またはscanfで値を取得したかどうかってことでしょうか?
「標準入力からunsigned long型の値をtmpに読み込もうとし、
1項目読み込めたら真、それ以外(不正な文字があり読み込めない、または入力の終わり)なら偽を返す」という意味になります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)


matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#47

投稿記事 by matunon » 10年前

► スポイラーを表示
こんな感じなのですが、Change関数の中の(*data).data_disp[5] = NULL;みたいになっているところすべてに空白を代入して、表示するときなにも表示されないというふうにしたいのですが整数型配列には空白は入れられないのでしょうか?
また、もっといい方法はあるでしょうか?
お願いします。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#48

投稿記事 by matunon » 10年前

かなり強引ですが出来ました!
以下コードです。
► スポイラーを表示
ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
お願いします。

かずま

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#49

投稿記事 by かずま » 10年前

matunon さんが書きました: ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
fp が NULL のとき、fclose(fp) を実行してはいけません。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#50

投稿記事 by ISLe » 10年前

アルゴリズム云々以前に、
・各要素を32ビット値(を持つ変数)に書き込む関数あるいはマクロ
・32ビット値(を持つ変数)から各要素を読み出す関数あるいはマクロ
を作って使うようにしたら、このプログラムのしていることがもっと分かりやすくなるのではないでしょうか。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#51

投稿記事 by matunon » 10年前

かずま さんが書きました:
matunon さんが書きました: ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
fp が NULL のとき、fclose(fp) を実行してはいけません。
了解です。
途中でreturn 1を返します。

matunon
記事: 64
登録日時: 10年前

Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・

#52

投稿記事 by matunon » 10年前

ISLe さんが書きました:アルゴリズム云々以前に、
・各要素を32ビット値(を持つ変数)に書き込む関数あるいはマクロ
・32ビット値(を持つ変数)から各要素を読み出す関数あるいはマクロ
を作って使うようにしたら、このプログラムのしていることがもっと分かりやすくなるのではないでしょうか。
マクロですか・・・・・。
どこかわかりやすい解説サイト探してやってみます!

閉鎖

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