質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

1163閲覧

変数の配列に代入したいです

ain4425

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/10/17 12:52

編集2016/10/17 13:59

a[0][6]には0を代入して、a[8][5]には1を最終的に代入したいです。しかし現段階で、プログラムを実行させると止まってしまいます。main関数は省略させていただきます。変数で構成された配列(a[s][t]など)には、sやyが代入されていないのでしょうか。よくわかりませんので教えていただけると幸いです。宜しくお願い致します。

C

1/* 抜粋です */ 2 3456int AAA(int x,int s){ 7 s=x; 8 return s; 9} 10 11int BBB(int y,int t){ 12 t=y; 13 return t; 14} 15 16void CCC(int s,int t){ 17 a[s][t]=0; 18} 19 20void DDD(int x,int y){ 21 a[x][y]=1; 22} 232425

先ほどの抜粋のもとのコードです。15×15の四角く並んだ0の、真ん中一番下がスタート位置で、1としています。そこから1か2か3か4を入力して真ん中一番上の座標まで辿りついたら(真ん中一番上が1になったら)終了というプログラムを組んだつもりでした。先ほどの0を代入する部分は、移動後のもといた場所を0とするためです。このプログラムを動かすには、たぶんCopyxとCopyyが問題だと思いますので、教えていただけると幸いです。よろしくお願いします。1で上、2で左、3で右、4で下に行きます。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4int a[15][15]; 5 6void Explain1(); 7void Initialize1(int x,int y); 8void Initialize2(); 9void Output1(int x,int y); 10int Input(int b); 11int Copyx(int x,int s); 12int Copyy(int y,int t); 13int Calculatex(int b,int x); 14int Calculatey(int b,int y); 15void Beforemove(int s,int t); 16void Aftermove(int x,int y); 17void Output2(int x,int y); 18void Finish(); 19 20int main(){ 21 int x; 22 int y; 23 int b=0; 24 int s,t; 25 26 Explain1(); 27 Initialize1(x,y); 28 Initialize2(); 29 Output1(x,y); 30 while(a[0][7]==0){ //ゴールにたどり着くまでループ 31 Input(b); 32 Copyx(x,s); 33 Copyy(y,t); 34 Calculatex(b,x); 35 Calculatey(b,y); 36 Beforemove(s,t); 37 Aftermove(x,y); 38 Output2(x,y); 39 } 40 Finish(); 41 return 0; 42 } 43 44void Explain1(){ 45 printf("ゴールを目指すゲームです\n"); 46} 47 48void Initialize1(int x,int y){ //座標平面の初期化 49 for(x=0; x<15; x++){ 50 for(y=0; y<15; y++){ 51 a[x][y]=0; 52 } 53 } 54} 55 56void Initialize2(){ //最初の位置である真ん中一番下に1を置く 57 a[14][7]=1; 58} 59 60void Output1(int x,int y){ //Initialize1の出力。マス出力 61 for(x=0; x<15; x++){ 62 for(y=0; y<15; y++){ 63 printf("%d ",a[x][y]); 64 } 65 printf("\n"); 66 } 67} 68 69int Input(int b){ //移動方向、またキャンセルの選択、1~5の整数の選別 70 while(1){ 71 scanf("%d",&b); 72 if((b==1)||(b==2)||(b==3)||(b==4)){ 73 break; 74 } 75 else{ 76 printf("1から4の整数を入力して下さい\n"); 77 } 78 } 79 return b; 80} 81 82int Copyx(int x,int s){ //x座標のコピー 83 s=x; 84 return s; 85} 86 87int Copyy(int y,int t){ //y座標のコピー 88 t=y; 89 return t; 90} 91 92int Calculatex(int b,int x){ //Inputの選択によるx方向に進む座標の計算 93 switch(b) 94 { 95 case 1: 96 if(x==0){ 97 printf("これより上には進めません\n"); 98 break; 99 } 100 else{ 101 x++; 102 break; 103 } 104 case 4: 105 if(x==14){ 106 printf("これより下には進めません\n"); 107 break; 108 } 109 else{ 110 x--; 111 break; 112 } 113 default: 114 break; 115 } 116 return x; 117} 118 119int Calculatey(int b,int y){ //Inputの選択によるy方向に進む座標の計算 120 switch(b) 121 { 122 case 2: 123 if(y==0){ 124 printf("これより左には進めません\n"); 125 break; 126 } 127 else 128 y--; 129 break; 130 case 3: 131 if(y==14){ 132 printf("これより右には進めません\n"); 133 break; 134 } 135 else 136 y++; 137 break; 138 default: 139 break; 140 } 141 return y; 142} 143/* 144void Beforemove(int s,int t){ //移動後への座標変換 145 a[s][t]=0; 146} 147*//* 148void Aftermove(int x,int y){ //移動後への座標変換 149 a[x][y]=1; 150} 151*/ 152void Output2(int x,int y){ //Initialize1の出力。マス出力 153 for(x=0; x<15; x++){ 154 for(y=0; y<15; y++){ 155 printf("%d ",a[x][y]); 156 } 157 printf("\n"); 158 } 159} 160 161void Finish(){ 162 printf("到着です\n"); 163}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

Initialize1、Output1の引数が不要
Copyx、Copyyの引数x、y、s、tは未初期化のため、値が入っていません
(不定、つまり何が入るか分かりませんよ。まあ、おおよそ0が入ることが多いみたいですが)
Calculatex、Calculateyの引数x、yも同様に未初期化
Beforemoveの引数s、tも同様に未初期化
Aftermove、Output2の引数x、yも未初期化
といろいろ問題がありますが、

↓ここからが重要↓
まず、各種関数にて、戻り値を何も受け取っていないので、
戻り値を返している関数が全て意味を成していません。
グローバル変数を変更するa[][]の配列のみいじくっているだけです。

また、関数の引数と呼び元の変数名が同じだから、同じものだと考えているようですが、
別物なので呼び元の変数の値を変更しているつもりでも、変更されません。

C言語の本をよく読みなおしてみてください
関数引数、戻り値のところが良いと思います

投稿2016/10/18 00:30

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ain4425

2016/10/18 06:55

もう一度勉強しなおします。ありがとうございました
guest

0

指摘箇所が多すぎて、この部分をこう直す、みたいなアドバイスはできませんが…。
気づいた点を挙げておきます(他の回答者との重複あり)
・関数が戻り値を返しているのに呼び出し元で受け取っていない
・main関数に定義している変数を初期化せずに使っている
・関数の引数がポインタ型ではないので、実質意味のない関数がある(Copyx,Copyy)

総じて学習のポイントを挙げると、
・変数のスコープ
・関数の使い方
・ポインタ
ここらを改めて学習された方が良いと思います。

投稿2016/10/18 00:18

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

while(a[0][7]==0){ //ゴールにたどり着くまでループ
Input(b);
Copyx(x,s);
Copyy(y,t);
Calculatex(b,x);
Calculatey(b,y);
Beforemove(s,t);
Aftermove(x,y);
Output2(x,y);
}

まず関数の使い方からして怪しいです。

これらの多くの関数は戻り値で値を返していますが、これを受け取っていません。また、引数を渡す意味がないです。(仮引数をローカル変数として使っているようですが、実引数に影響はありません)

関数の引数と戻り値の仕組みあたりから勉強しなおしてください。

投稿2016/10/17 14:37

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問のコードは下記と全く同じです。

C

1int AAA(int x_a,int s_a){ 2 s_a=x_a; 3 return s_a; 4} 5 6int BBB(int y_b,int t_b){ 7 t_b=y_b; 8 return t_b; 9} 10 11void CCC(int s_c,int t_c){ 12 a[s_c][t_c]=0; 13} 14 15void DDD(int x_d,int y_d){ 16 a[x_d][y_d]=1; 17}

AAA()BBB()無意味であることCCC()DDD()の動作に一切関わらないことがわかると思います。

なお、どう直せば良いのかは、省略しているCCC()DDD()を呼び出している部分が不明であり、全体的に何をしたいのかがわからないため、私にもわかりません。少なくともCCC()DDD()の呼び出し部分を書いてください。

投稿2016/10/17 13:53

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ain4425

2016/10/17 13:56

回答ありがとうございます。先ほど質問のコード欄を更新したのでよろしくお願いします。
guest

0

a[10][10]がグローバル変数ならば、main関数等、呼び出し元で以下の二行を呼べばいいはずですよ。

CCC(0,6);
DDD(8,5);

ちなみにAAAやBBBは意味がわかりません。

投稿2016/10/17 12:59

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ain4425

2016/10/17 13:09

回答ありがとうございます。a[10][10]はグローバル変数としました。今回x,yのセットをs,tにAAA,BBBでそれぞれ配列として代入して、x,yのセットの値を変えて比べようと思ったのですが、数が途中変わることもあるため、直打ちは控えたいのですが、、。すみません、説明が下手で、、
HogeAnimalLover

2016/10/17 13:18

失礼ながら、全く意味がわかりません。まず第一に、AAAとBBBは副作用(戻り値を返す以外の動作)がありません。また、戻り値は第一引数そのものですので、計算する意味もありません。つまり、全く意味をなしていません。
ain4425

2016/10/17 13:30

すみません、大切なことを忘れていました。BBBとCCCの間にはもう一つ関数がありまして、そこでxとyの値が全く異なるものに更新されます。なので、元のxとyを残しておくためにsとtに移すという動作をAAAとBBBでやったつもりでした。 それでもとのxとy(後のsとt)からなるはずだったaの配列を0とし、更新後のxとyからなるa配列を1としたいです。
HogeAnimalLover

2016/10/17 13:37

どのような意図があるかよくわかりませんが、いずれにしてもAAAとBBBは全く意味をなしていません。副作用がなく、グローバル変数を変更する機能をもっていません。つまり、呼び出しても何も変わりません。ちなみにグローバル変数が(配列a以外にも)存在するならば先に説明してもらわないと話が進まないです。
ain4425

2016/10/17 13:57

何度もすみません。先ほど元のコードを載せましたので、できれば教えていただきたいです。申し訳ありません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問