ページ 1 / 1
学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 12:26
by matunon
皆様お願いします!
作成環境は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の配列に値を格納できていない?)
直した方が良い点などもありましたらお願いします!
少し長文になってしまいましたがご教授お願いいたします。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 13:08
by usao
とりあえず問題文すら見てませんが
ファイルを開いては閉じるという行為をループで繰り返すのは何か間違っているような気がしますね.
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 13:15
by matunon
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);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 15:22
by みけCAT
fscanfとfprintfで、%lとなっているところを%ldに修正するべきだと思います。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 15:42
by matunon
みけCAT さんが書きました:fscanfとfprintfで、%lとなっているところを%ldに修正するべきだと思います。
修正してみました。
一番初めのレスのコードを修正しました。
ただ、まだうまく行きません・・・・。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 15:44
by みけCAT
・input関数の115行目で、scの値を増やしています。
・main関数の220行目で、scanfの識別子とポインタの型が合っていません。
以上の2点、アクセス違反や誤動作の原因になりそうな場所が見つかりました。
また、6~9行目のプロトタイプ宣言と実際の関数の型が違うのも気になります。
参考として、手元のコンパイラでコンパイルした結果を貼っておきます。
task.cppは、No: 1のコード(修正前)のsave関数とchange関数をNo: 3のコードに差し替えたものです。
task.cpp
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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;
int tmp;
if(*sc<=10){
printf("データ入力画面です\n");
printf("Yellowの値を0~255までで入力してください:");
scanf("%d",&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("%d",&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("%d",&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("%d",&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("%d",&tmp);
if(tmp>=1 && tmp<=3){
data_input = data_input|(tmp<<30);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%l",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,"%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);
}
/*********************************
機能: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("%l",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);
}
コンパイラのメッセージ
► スポイラーを表示
コード:
YUKI.N>g++ -Wall -Wextra -o task.exe task.cpp
task.cpp:4:0: warning: ignoring #pragma warning [-Wunknown-pragmas]
#pragma warning ( disable : 4996 )
^
task.cpp: In function 'int input(long int*, int*)':
task.cpp:112:31: warning: conversion lacks type at end of format [-Wformat=]
printf("%l",data_input);
^
task.cpp:112:31: warning: too many arguments for format [-Wformat-extra-args]
task.cpp:115:14: warning: value computed is not used [-Wunused-value]
*sc++;
^
task.cpp: In function 'int save(long int*, int)':
task.cpp:137:37: warning: unknown conversion type character ',' in format [-Wfor
mat=]
fprintf(fp,"%l,",data[i]);
^
task.cpp:137:37: warning: too many arguments for format [-Wformat-extra-args]
task.cpp: In function 'int change(long int*, long int (*)[10], int)':
task.cpp:164:31: warning: unknown conversion type character ',' in format [-Wfor
mat=]
fscanf(fp,"%l,",&l);
^
task.cpp:164:31: warning: too many arguments for format [-Wformat-extra-args]
task.cpp:153:9: warning: variable 'Red' set but not used [-Wunused-but-set-varia
ble]
int Red,Green,Yellow;
^
task.cpp:153:13: warning: variable 'Green' set but not used [-Wunused-but-set-va
riable]
int Red,Green,Yellow;
^
task.cpp:153:19: warning: variable 'Yellow' set but not used [-Wunused-but-set-v
ariable]
int Red,Green,Yellow;
^
task.cpp:154:9: warning: variable 'Sound' set but not used [-Wunused-but-set-var
iable]
int Sound;
^
task.cpp: At global scope:
task.cpp:149:5: warning: unused parameter 'data' [-Wunused-parameter]
int change(long *data,long (*data_b)[10],int sc){
^
task.cpp: In function 'int disp(long int (*)[10], int)':
task.cpp:197:37: warning: conversion lacks type at end of format [-Wformat=]
printf("%l",data_b[j][i]);
^
task.cpp:197:37: warning: too many arguments for format [-Wformat-extra-args]
task.cpp: In function 'int main()':
task.cpp:218:16: warning: unknown escape sequence: '\216' [enabled by default]
printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
^
task.cpp:220:25: warning: format '%d' expects argument of type 'int*', but argum
ent 2 has type 'char*' [-Wformat=]
scanf("%d",&menu);
^
task.cpp: In function 'int input(long int*, int*)':
task.cpp:61:40: warning: 'data_input' may be used uninitialized in this function
[-Wmaybe-uninitialized]
data_input = data_input|tmp;
^
YUKI.N>g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 15:51
by みけCAT
必要のない記事の編集は控えていただけるとありがたいです。
今回の場合、新しいコードは普通に返信で書けばいいと思うのですが、何かそうできない理由がありますか?
フォーラムルール さんが書きました:3. 禁止行為について
以下の行為を禁止行為として定めます。
(略)
[C言語何でも質問掲示板でのみ適用される事項]
(略)
記事の内容を無暗に変更する行為
(以下略)
(
http://dixq.net/board/board.html)
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:03
by matunon
みけCAT さんが書きました:必要のない記事の編集は控えていただけるとありがたいです。
今回の場合、新しいコードは普通に返信で書けばいいと思うのですが、何かそうできない理由がありますか?
フォーラムルール さんが書きました:3. 禁止行為について
以下の行為を禁止行為として定めます。
(略)
[C言語何でも質問掲示板でのみ適用される事項]
(略)
記事の内容を無暗に変更する行為
(以下略)
(
http://dixq.net/board/board.html)
すいません。来たばかりなものでこっちの方が見やすいかもと思ってしまいました。
今後気をつけます。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:26
by matunon
色々修正してみました。
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);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:35
by usao
>上位桁の1の大群がなぜ入ってきているのかわからない状況です。
unsigned な値を signed として表示しているからではないでしょうか.
そのようにまともに動いているかどうかを変数を実際に表示等してみてデバッグしていくと良いですね.
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:36
by みけCAT
matunon さんが書きました:上位桁の1の大群がなぜ入ってきているのかわからない状況です。
「1の大群」はどのようなプログラム/方法で表示していますか?
おそらく、その表示方法の仕様だと思います。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:52
by matunon
usao さんが書きました:>上位桁の1の大群がなぜ入ってきているのかわからない状況です。
unsigned な値を signed として表示しているからではないでしょうか.
そのようにまともに動いているかどうかを変数を実際に表示等してみてデバッグしていくと良いですね.
返信有難うございます。
コードの通りunsigned型で指定したつもりだったのですが・・・・・・
どうすればunsigned型に戻せるでしょうか?
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 16:53
by matunon
みけCAT さんが書きました:matunon さんが書きました:上位桁の1の大群がなぜ入ってきているのかわからない状況です。
「1の大群」はどのようなプログラム/方法で表示していますか?
おそらく、その表示方法の仕様だと思います。
返信有難うございます。
プログラムはコードの通りになります。
方法はVisualStudioにてコマンドプロンプトで表示しています。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 17:07
by みけCAT
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)
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 17:22
by matunon
%luに直したところ数値の表示は正しい形になりました。
ありがとうございます。
この調子で行けるかと思い、実行してみたのですが・・・・・・
PI.txtに入っている値は3489660927,でした。
なので表示もうまくいくと思ったのですが、プロンプトに表示されたのは最初に0の大群で、その後によくわからない数列、また0の大群と表示されて強制終了となります。
以下、修正したコードです。
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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("%lu\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("%lu\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("%lu\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("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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,"%lu,",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;
unsigned long l;
unsigned 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,"%lu,",&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("%l",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);
}
すいません。
お願いします。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 17:26
by みけCAT
とりあえず、disp関数で使用しているprintfに渡している書式が間違っています。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 17:29
by みけCAT
input関数で使用している変数data_inputの初期化もするべきです。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 17:42
by みけCAT
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
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 18:13
by matunon
disp関数のprintf関数の書式を%lから%ldに変えました。見逃してましたすいません。
input関数のdata_inputを変数宣言部にて初期化しました。
以上のようにしたところ、-符号のついた数字が大量に現れるようになりました。
その後強制終了します。
以下コード
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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 = 0;
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("%lu\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("%lu\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("%lu\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("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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,"%lu,",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;
unsigned long l;
unsigned 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,"%lu,",&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);
}
お願いします!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 18:20
by みけCAT
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>
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 18:22
by みけCAT
より少ない手順での再現例です。
コード:
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>
原因は調査中です。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 18:24
by matunon
すいません。ありがとうございます!
自分の方でもがんばってみます。
最終的に頼りきりになってしまいそうですが・・・・・・
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 18:31
by みけCAT
・176行目で配列の確保された領域の範囲外にアクセスしています。
・178行目でのRepeatの値は高々3なので、data_b[13]には値が代入されません。
その結果、disp関数内のrの値が不定になり、運が悪いとアクセス違反になります。
(運がいいとrが負の値になり、アクセス違反にならずにすみます)
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:07
by matunon
返信有難うございます。
よく考えたら2次元配列data_dispに入るのは最大で255なのでint型に変えました。
そうして実行したところ、結果は1111111111111が表示されました。
Repeat変数がたかだか3なので入らないと言うのはint型にして確保する領域を狭くするというのでは根本的な解決にはならないのでしょうか?
また、32bitのunsigned long型を16bit右シフトしただけのつもりだったのですが、領域外になってしまったのはなぜなのでしょうか?
質問多くてすいません。
お願いします。
以下修正?してみたコード
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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 = 0;
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("%lu\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("%lu\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("%lu\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("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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,"%lu,",data[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(unsigned long *data,int (*data_b)[10],int sc){
int i,j,t;
unsigned long l;
unsigned 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,"%lu,",&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[13][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(int (*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("%d",data_b[j][i]);
}
}
return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
unsigned long data_tmp[10];
int 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);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:11
by みけCAT
change関数で使用するシフトの幅が間違っている上、
せっかく取得したRed,Green,Yellow,Soundのデータを全く使わず、ただ捨てています。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:13
by みけCAT
matunon さんが書きました:Repeat変数がたかだか3なので入らないと言うのはint型にして確保する領域を狭くするというのでは根本的な解決にはならないのでしょうか?
なりません。まず「何の」根本的解決の話ですか?
matunon さんが書きました:また、32bitのunsigned long型を16bit右シフトしただけのつもりだったのですが、領域外になってしまったのはなぜなのでしょうか?
「32bitのunsigned long型を16bit右シフト」するコードは見当たりません。
領域外になったのは、直接的にはdisp関数のjの値が大きすぎる値になったからです。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:30
by matunon
返信有難うございます!
とりあえず出来ました!ただ、シフトの幅のことが今ひとつ理解できていないです。
すいませんが、ヒントだけでも・・・・。
とりあえず表示に成功したコードを以下に・・・・・
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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 = 0;
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("%lu\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("%lu\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("%lu\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("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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,"%lu,",data[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(unsigned long *data,int (*data_b)[10],int sc){
int i,j,t;
unsigned long l;
unsigned 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,"%lu,",&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[13][i] = Repeat;
data_b[0][i] = data_num;
for(j=0;j<Repeat;j++){
t = j * 4;
data_b[t+1][i] = Sound;
data_b[t+2][i] = Green;
data_b[t+3][i] = Red;
data_b[t+4][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(int (*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("%d\n",data_b[j][i]);
}
}
return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
unsigned long data_tmp[10];
int 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);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:43
by matunon
ビットシフトについてです。
x = 1111;
x>>2; /* 11 */
x>>1; /* 1 */
というふうにシフトされた値を保持しているわけではなく、
x = 1111;
x>>2; /* 11 */
x>>1; /* 111 */
といった感じにその都度取得したい桁までシフトしなければならないのでしょうか?
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 19:47
by box
変数save_countの使い方は本当に適切かな?と思います。
ファイルポインターfpがNULLかどうかをループの中で毎回チェックするのは
本当に必要なのかな?と思います。
また、氏名などの個人情報をネットにさらすのはやめる方がよいでしょう。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:02
by matunon
box さんが書きました:変数save_countの使い方は本当に適切かな?と思います。
ファイルポインターfpがNULLかどうかをループの中で毎回チェックするのは
本当に必要なのかな?と思います。
また、氏名などの個人情報をネットにさらすのはやめる方がよいでしょう。
あああああ気をつけてたのにwwご指摘ありがとうございます。
念のためですが、他人のソースではありません。説得力がネット上では皆無ですが。
save_countの使いドコロはいまだに迷ってます。
熟練の方ならどの位置に置くのでしょうか?
そもそもsave_countを用いている理由が保持しているデータの総数を知ることなのですが、そういうのを調べる技法?みたいなものはあるのでしょうか?
前々からこのような課題が出ると、まずこのsave_count変数を作っていたのですが他にもやり方ありそうだなーとは思って入るのですが・・・・・・。
ファイルポインタがNULLというのはファイルが存在するかどうかということなんですね。
指摘されて初めて詳しく調べました。
確かに何度もファイルが存在するか調べるのはおかしいですよね。修正します。
ありがとうございます!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:02
by みけCAT
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++のコードとは異なります
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:05
by みけCAT
matunon さんが書きました:save_countの使いドコロはいまだに迷ってます。
熟練の方ならどの位置に置くのでしょうか?
そもそもsave_countを用いている理由が保持しているデータの総数を知ることなのですが、そういうのを調べる技法?みたいなものはあるのでしょうか?
前々からこのような課題が出ると、まずこのsave_count変数を作っていたのですが他にもやり方ありそうだなーとは思って入るのですが・・・・・・。
データの配列とsave_countをまとめて構造体にし、各関数にその構造体のポインタを渡せばいいと思います。
matunon さんが書きました:ファイルポインタがNULLというのはファイルが存在するかどうかということなんですね。
違います。
C言語のfopenで返されるファイルポインタがNULLというのは、「ファイルのオープンに失敗した」という意味です。
例えば、ファイルが存在してもパーミッションが適切でなければ、ファイルのオープンに失敗する可能性があります。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:06
by matunon
コードをboxさんの指摘どおりに修正してみました。
ただsave_countの位置はかわってません。
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#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 = 0;
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("%lu\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("%lu\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("%lu\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("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<sc;i++){
fprintf(fp,"%lu,",data[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(unsigned long *data,int (*data_b)[10],int sc){
int i,j,t;
unsigned long l;
unsigned long data_tmp;
int Red,Green,Yellow;
int Sound;
int Repeat;
int data_num;
FILE *fp;
fp = fopen("PI.txt","r");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<sc;i++){
fscanf(fp,"%lu,",&l);
data_tmp = l;
Yellow = data_tmp & 255;
Red = (data_tmp>>8) & 255;
Green = (data_tmp>>16) & 255;
Sound = (data_tmp>>24) & 15;
Repeat = (data_tmp>>30) & 3;
data_num = i+1;
data_b[13][i] = Repeat;
data_b[0][i] = data_num;
for(j=0;j<Repeat;j++){
t = j * 4;
data_b[t+1][i] = Sound;
data_b[t+2][i] = Green;
data_b[t+3][i] = Red;
data_b[t+4][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(int (*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("%d\n",data_b[j][i]);
}
}
return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
unsigned long data_tmp[10];
int 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);
}
お願いします!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:09
by matunon
返信ありがとうございます!
構造体・・・・・・せっかくです!チャレンジしてみます!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:10
by みけCAT
何をお願いされたのかがよくわかりませんが、とりあえずコンパイラの出力した警告メッセージを貼ります。
コード:
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が使用されていません。不要ではないですか?(未実装の可能性も考えられます)
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:29
by matunon
返信有難うございます!
2~5番目:tmpはunsigned long型なので常に正です。
確かに・・・・・・。よく考えればわかることだっただけに悔しいですね。
6番目:引数dataが使用されていません。不要ではないですか?(未実装の可能性も考えられます)
よく見たら使われていませんでした。
コンパイラが違うだけでこんなに指摘してくれる内容が違うんですね。
びっくりしました。
指摘ありがとうございます。
以下修正したコードです。
► スポイラーを表示
コード:
/*********************************
所属:沼津技術専門校
製作:松浦 展久
*********************************/
/* 標準入出力用ヘッダファイルのインクルード */
#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 = 0;
unsigned long tmp;
if(sc<=10){
printf("データ入力画面です\n");
printf("Yellowの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_input = data_input|tmp;
printf("%lu\n",data_input);
tmp = 0;
}
else{
printf("0~255までの整数を入力してください!\n");
tmp = 0;
}
printf("\n");
printf("Redの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_input = data_input|(tmp<<8);
printf("%lu\n",data_input);
tmp = 0;
}
else{
printf("0~255までの整数を入力してください!\n");
tmp = 0;
}
printf("\n");
printf("Greenの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_input = data_input|(tmp<<16);
printf("%lu\n",data_input);
tmp = 0;
}
else{
printf("0~255までの整数を入力してください!\n");
tmp = 0;
}
printf("\n");
printf("Soundの値を0~15までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=15){
data_input = data_input|(tmp<<24);
printf("%lu\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("%lu\n",data_input);
tmp = 0;
}
else{
printf("1~3までの整数を入力してください!\n");
tmp = 0;
}
printf("%lu",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");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<sc;i++){
fprintf(fp,"%lu,",data[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(int (*data_b)[10],int sc){
int i,j,t;
unsigned long data_tmp;
int Red,Green,Yellow;
int Sound;
int Repeat;
int data_num;
FILE *fp;
fp = fopen("PI.txt","r");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<sc;i++){
fscanf(fp,"%lu,",&data_tmp);
Yellow = data_tmp & 255;
Red = (data_tmp>>8) & 255;
Green = (data_tmp>>16) & 255;
Sound = (data_tmp>>24) & 15;
Repeat = (data_tmp>>30) & 3;
data_num = i+1;
data_b[13][i] = Repeat;
data_b[0][i] = data_num;
for(j=0;j<Repeat;j++){
t = j * 4;
data_b[t+1][i] = Sound;
data_b[t+2][i] = Green;
data_b[t+3][i] = Red;
data_b[t+4][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(int (*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("%d\n",data_b[j][i]);
}
}
return(0);
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
unsigned long data_tmp[10];
int 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_disp,save_count);
break;
case 4 :disp(data_disp,save_count);
break;
default :break;
}
}
return(0);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 20:44
by みけCAT
main関数の変数data_tmpが使用されていません。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 21:06
by box
みけCAT さんが書きました:
コード:
x = 1111;
x>>=2; /* x = 11 */
x>>=1; /* x = 1 */
※ここではxの値を2進数で表現しており、C++のコードとは異なります
そういうコメントを付けるより、とりあえずちゃんと動くであろう書き方を示す方が
よほどためになるのではないでしょうか。
x
を
せんひゃくじゅういち
と誤解してしまいかねない表現ではなく。
また、1ビット右へシフトした結果が1になるっていうのもちょっとどうかな、と。
質問者さんがますます混乱をきたしてしまいそうです。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月18日(火) 21:34
by matunon
>>boxさん
返信有難うございます!
確かに・・・・・。
今後気をつけます!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 19:58
by matunon
構造体を用いましてやってみました!
ただinput関数のところでif文が同じことを何度も書いています。
なんとかしたいのですが・・・・・。
以下コードです。
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#include<stdio.h>
/* 警告C4996を出さない */
#pragma warning ( disable : 4996 )
/* 入出力用データの構造体 */
typedef struct{
int save_count;
int data_disp[14][10];
unsigned long data_input[10];
}save_t;
/* プロトタイプ宣言 */
int input(save_t *data);
int save(save_t *data);
int change(save_t *data);
int disp(save_t *data);
/*********************************
機能: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(save_t *data){
unsigned long data_tmp = 0;
unsigned long tmp;
if((*data).save_count < 10){
printf("データ入力画面です\n");
printf("Yellowの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_tmp = data_tmp|tmp;
tmp = 0;
printf("\n");
printf("Redの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_tmp = data_tmp|(tmp<<8);
tmp = 0;
printf("\n");
printf("Greenの値を0~255までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=255){
data_tmp = data_tmp|(tmp<<16);
tmp = 0;
printf("\n");
printf("Soundの値を0~15までで入力してください:");
scanf("%ld",&tmp);
if(tmp<=15){
data_tmp = data_tmp|(tmp<<24);
tmp = 0;
printf("\n");
printf("繰り返す回数を1~3までで入力してください:");
scanf("%ld",&tmp);
if(tmp>=1 && tmp<=3){
data_tmp = data_tmp|(tmp<<30);
tmp = 0;
(*data).data_input[(*data).save_count] = data_tmp;
(*data).save_count ++;
}
else{
printf("指定された整数を入力してください!\n");
data_tmp = 0;
tmp = 0;
}
}
else{
printf("指定された整数を入力してください!\n");
data_tmp = 0;
tmp = 0;
}
}
else{
printf("指定された整数を入力してください!\n");
data_tmp = 0;
tmp = 0;
}
}
else{
printf("指定された整数を入力してください!\n");
data_tmp = 0;
tmp = 0;
}
}
else{
printf("指定された整数を入力してください!\n");
data_tmp = 0;
tmp = 0;
}
}
else{
printf("ファイルを保存できる限界を超えました。");
}
printf("\n");
return(0);
}
/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(save_t *data){
int i;
FILE *fp;
fp = fopen("PI.txt","w");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fprintf(fp,"%lu,",(*data).data_input[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(save_t *data){
int i,j,t;
unsigned long data_tmp;
int Red,Green,Yellow;
int Sound;
int Repeat;
int data_num;
FILE *fp;
fp = fopen("PI.txt","r");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fscanf(fp,"%lu,",&data_tmp);
Yellow = data_tmp & 255;
Red = (data_tmp>>8) & 255;
Green = (data_tmp>>16) & 255;
Sound = (data_tmp>>24) & 15;
Repeat = (data_tmp>>30) & 3;
data_num = i+1;
(*data).data_disp[13][i] = Repeat;
(*data).data_disp[0][i] = data_num;
for(j=0;j<Repeat;j++){
t = j * 4;
(*data).data_disp[t+1][i] = Sound;
(*data).data_disp[t+2][i] = Green;
(*data).data_disp[t+3][i] = Red;
(*data).data_disp[t+4][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(save_t *data){
int i,j,r;
for(i=0;i<(*data).save_count;i++){
r = (*data).data_disp[13][i];
for(j=0;j<=r*4;j++){
printf("%d\n",(*data).data_disp[j][i]);
}
}
return 0;
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
save_t s = {0,0,0};
while(1)
{
printf("メニュー\n");
printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
printf("メニューの数字を選択し、入力してください:");
scanf("%d",&menu);
printf("\n");
switch(menu)
{
case 1 :input(&s);
break;
case 2 :save(&s);
break;
case 3 :change(&s);
break;
case 4 :disp(&s);
break;
default :break;
}
}
return(0);
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 21:43
by matunon
すいません。
追加の質問です。
今回表示の形を、
コード:
1 2 3
15 125 0
255 125 0
255 125 0
255 125 0
15 0
255 0
255 0
255 0
と言った具合にデータ番号順に横に並べて表示したいと思っています。
配列に値を代入しなかった場合には表示じたいしないようにしたいです。
どうすればいいでしょうか?
お願いします!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 22:15
by かずま
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;
}
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 22:18
by matunon
返信ありがとうございます!
解読してみます!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 22:41
by matunon
scanf("%lu", &tmp) != 1
これだとどういう意味になるんでしょう?
scanfで取得した値が1でない時、またはscanfで値を取得したかどうかってことでしょうか?
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 22:47
by みけCAT
matunon さんが書きました:scanf("%lu", &tmp) != 1
これだとどういう意味になるんでしょう?
scanfで取得した値が1でない時、またはscanfで値を取得したかどうかってことでしょうか?
「標準入力からunsigned long型の値をtmpに読み込もうとし、
1項目読み込めたら真、それ以外(不正な文字があり読み込めない、または入力の終わり)なら偽を返す」という意味になります。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月19日(水) 23:24
by matunon
返信有難うございます!
納得出来ました!
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 00:01
by matunon
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#include<stdio.h>
/* 警告C4996を出さない */
#pragma warning ( disable : 4996 )
/* 入出力用データの構造体 */
typedef struct{
int save_count;
int data_disp[13][10];
unsigned long data_input[10];
}save_t;
/* プロトタイプ宣言 */
int input(save_t *data);
int save(save_t *data);
int change(save_t *data);
int disp(save_t *data);
/*********************************
機能: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(save_t *data){
unsigned long data_tmp = 0;
unsigned long tmp;
if((*data).save_count >= 10){
return puts("ファイルを保存できる限界を超えました。"), 1;
}
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;
}
/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(save_t *data){
int i;
FILE *fp;
fp = fopen("PI.txt","w");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fprintf(fp,"%lu,",(*data).data_input[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(save_t *data){
int i;
unsigned long data_tmp;
int Red,Green,Yellow;
int Sound;
int Repeat;
int data_num;
FILE *fp;
fp = fopen("PI.txt","r");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fscanf(fp,"%lu,",&data_tmp);
Yellow = data_tmp & 255;
Red = (data_tmp>>8) & 255;
Green = (data_tmp>>16) & 255;
Sound = (data_tmp>>24) & 15;
Repeat = (data_tmp>>30) & 3;
data_num = i+1;
(*data).data_disp[0][i] = data_num;
if(Repeat == 1){
(*data).data_disp[1][i] = Sound;
(*data).data_disp[2][i] = Green;
(*data).data_disp[3][i] = Red;
(*data).data_disp[4][i] = Yellow;
(*data).data_disp[5][i] = NULL;
(*data).data_disp[6][i] = NULL;
(*data).data_disp[7][i] = NULL;
(*data).data_disp[8][i] = NULL;
(*data).data_disp[9][i] = NULL;
(*data).data_disp[10][i] = NULL;
(*data).data_disp[11][i] = NULL;
(*data).data_disp[12][i] = NULL;
}
if(Repeat == 2){
(*data).data_disp[1][i] = Sound;
(*data).data_disp[2][i] = Green;
(*data).data_disp[3][i] = Red;
(*data).data_disp[4][i] = Yellow;
(*data).data_disp[5][i] = Sound;
(*data).data_disp[6][i] = Green;
(*data).data_disp[7][i] = Red;
(*data).data_disp[8][i] = Yellow;
(*data).data_disp[9][i] = NULL;
(*data).data_disp[10][i] = NULL;
(*data).data_disp[11][i] = NULL;
(*data).data_disp[12][i] = NULL;
}
if(Repeat == 3){
(*data).data_disp[1][i] = Sound;
(*data).data_disp[2][i] = Green;
(*data).data_disp[3][i] = Red;
(*data).data_disp[4][i] = Yellow;
(*data).data_disp[5][i] = Sound;
(*data).data_disp[6][i] = Green;
(*data).data_disp[7][i] = Red;
(*data).data_disp[8][i] = Yellow;
(*data).data_disp[9][i] = Sound;
(*data).data_disp[10][i] = Green;
(*data).data_disp[11][i] = Red;
(*data).data_disp[12][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(save_t *data){
int i,j;
for(i=0;i<13;i++){
for(j=0;j<(*data).save_count;j++){
printf("%3d ",(*data).data_disp[i][j]);
}
printf("\n");
}
return 0;
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
save_t s = {0,0,0};
while(1)
{
printf("メニュー\n");
printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
printf("メニューの数字を選択し、入力してください:");
scanf("%d",&menu);
printf("\n");
switch(menu)
{
case 1 :input(&s);
break;
case 2 :save(&s);
break;
case 3 :change(&s);
break;
case 4 :disp(&s);
break;
default :break;
}
}
return(0);
}
こんな感じなのですが、Change関数の中の(*data).data_disp[5]
= NULL;みたいになっているところすべてに空白を代入して、表示するときなにも表示されないというふうにしたいのですが整数型配列には空白は入れられないのでしょうか?
また、もっといい方法はあるでしょうか?
お願いします。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 00:36
by matunon
かなり強引ですが出来ました!
以下コードです。
► スポイラーを表示
コード:
/* 標準入出力用ヘッダファイルのインクルード */
#include<stdio.h>
/* 警告C4996を出さない */
#pragma warning ( disable : 4996 )
/* 入出力用データの構造体 */
typedef struct{
int save_count;
int data_disp[14][10];
unsigned long data_input[10];
}save_t;
/* プロトタイプ宣言 */
int input(save_t *data);
int save(save_t *data);
int change(save_t *data);
int disp(save_t *data);
/*********************************
機能: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(save_t *data){
unsigned long data_tmp = 0;
unsigned long tmp;
if((*data).save_count >= 10){
return puts("ファイルを保存できる限界を超えました。"), 1;
}
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;
}
/*********************************
機能:binファイルに保持しているデータを保存する
引数:data_input,save_count
戻り値:0
備考:
**********************************/
int save(save_t *data){
int i;
FILE *fp;
fp = fopen("PI.txt","w");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fprintf(fp,"%lu,",(*data).data_input[i]);
}
}
fclose(fp);
return(0);
}
/*********************************
機能:save()で作成したbinファイルからデータを取り出し、表示出来る形式に変換する
引数:data_tmp,data_disp,ssve_count
戻り値:0
備考:
**********************************/
int change(save_t *data){
int i,j,t;
unsigned long data_tmp;
int Red,Green,Yellow;
int Sound;
int Repeat;
int data_num;
FILE *fp;
fp = fopen("PI.txt","r");
if(fp == NULL){
printf("\aファイルをオープンできません。\n");
}
else{
for(i=0;i<(*data).save_count;i++){
fscanf(fp,"%lu,",&data_tmp);
Yellow = data_tmp & 255;
Red = (data_tmp>>8) & 255;
Green = (data_tmp>>16) & 255;
Sound = (data_tmp>>24) & 15;
Repeat = (data_tmp>>30) & 3;
data_num = i+1;
(*data).data_disp[13][i] = Repeat;
(*data).data_disp[0][i] = data_num;
for(j=0;j<Repeat;j++){
t = j * 4;
(*data).data_disp[t+1][i] = Sound;
(*data).data_disp[t+2][i] = Green;
(*data).data_disp[t+3][i] = Red;
(*data).data_disp[t+4][i] = Yellow;
}
}
}
fclose(fp);
return(0);
}
/*********************************
機能:change()で変換したデータを表示する
引数:data_tmp,data_disp,save_count
戻り値:0
備考:
**********************************/
int disp(save_t *data){
int i,j;
for(i=0;i<5;i++){
for(j=0;j<(*data).save_count;j++){
printf("%3d ",(*data).data_disp[i][j]);
}
printf("\n");
}
for(i=5;i<9;i++){
for(j=0;j<(*data).save_count;j++){
if((*data).data_disp[13][j] >= 2){
printf("%3d ",(*data).data_disp[i][j]);
}
else{
printf(" ");
}
}
printf("\n");
}
for(i=9;i<13;i++){
for(j=0;j<(*data).save_count;j++){
if((*data).data_disp[13][j] >= 3){
printf("%3d ",(*data).data_disp[i][j]);
}
else{
printf(" ");
}
}
printf("\n");
}
return 0;
}
/*********************************
機能:メニュー選択
引数:無し
戻り値:0
備考:スイッチ文を用いて目的の機能を選択させる
**********************************/
int main(){
int menu;
save_t s = {0,0,0};
while(1)
{
printf("メニュー\n");
printf("1:データ入力\n2:データ保存\n3:データ変換\n4:データ表示\n");
printf("メニューの数字を選択し、入力してください:");
scanf("%d",&menu);
printf("\n");
switch(menu)
{
case 1 :input(&s);
break;
case 2 :save(&s);
break;
case 3 :change(&s);
break;
case 4 :disp(&s);
break;
default :break;
}
}
return(0);
}
ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
お願いします。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 04:25
by かずま
matunon さんが書きました:
ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
fp が NULL のとき、fclose(fp) を実行してはいけません。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 17:26
by ISLe
アルゴリズム云々以前に、
・各要素を32ビット値(を持つ変数)に書き込む関数あるいはマクロ
・32ビット値(を持つ変数)から各要素を読み出す関数あるいはマクロ
を作って使うようにしたら、このプログラムのしていることがもっと分かりやすくなるのではないでしょうか。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 20:54
by matunon
かずま さんが書きました:matunon さんが書きました:
ここは修正した方がいいじゃんよという箇所ありましたら教えて下さい。
fp が NULL のとき、fclose(fp) を実行してはいけません。
了解です。
途中でreturn 1を返します。
Re: 学校での宿題でコードはかけたのですが正しく動作しません!ご教授をば・・・・
Posted: 2014年3月20日(木) 20:55
by matunon
ISLe さんが書きました:アルゴリズム云々以前に、
・各要素を32ビット値(を持つ変数)に書き込む関数あるいはマクロ
・32ビット値(を持つ変数)から各要素を読み出す関数あるいはマクロ
を作って使うようにしたら、このプログラムのしていることがもっと分かりやすくなるのではないでしょうか。
マクロですか・・・・・。
どこかわかりやすい解説サイト探してやってみます!