ページ 1 / 1
ポインタと配列の問題で困ってます
Posted: 2012年6月12日(火) 22:47
by KAJI
はじめまして、プログラミング初心者のKAJIです。さっそくですが質問します。
まず、下記が問題の内容です。
N個の要素を持つ整数型配列xに、適当なデータを初期化で代入し、その後、そのデータを配列yには順方向、配列zには逆方向にポインタを用いて代入し、最後に配列x,y,zの要素を出力しなさい。この時、配列の要素の個数Nは、マクロ名定義で7と与えること。
・・・という問題で、自分が作ったプログラムが下記です。
コード:
#include<stdio.h>
int main(void)
{
#define N 7;
int x[7] = {2,5,7,1,14,6,3}, y[7], z[7], i;
int *a, *b, *c;
for(i=0;i<7;i++)
{
x[i]=y[i];
z[8-i]=x[i];
}
a=x;
for(i=0;i<7;i++)
{
printf("x[%d]=%d \n", i, *a);
a++;
}
b=y;
for(i=0;i<7;i++)
{
printf("y[%d]=%d \n", i, *b);
b++;
}
c=z;
for(i=0;i<7;i++)
{
printf("z[%d]=%d \n", i, *c);
c--;
}
return(0);
}
エラーはありませんでしたが、デバックするとおかしな数値になってしまいます。どこが間違っているのか、教えて下さい。
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月12日(火) 22:56
by h2so5
11行目で配列の範囲外にアクセスしていますね。
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月12日(火) 22:56
by box
ふつうは、こういう場所に書きません。関数の外に書くのが一般的でありましょう。
最後のセミコロンは、必要ですか?
せっかくdefineしたNを全く使っていませんね。
以降のコードで頻繁に登場する7という数値を直接書かなくていいように、
Nを使うのではないでしょうか。
左辺と右辺の関係は正しいですか?
このコードでは、初期化していないy[]の値で、せっかく初期化したx[]の値を
上書きしてしまっているように見えます。
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月12日(火) 23:53
by KAJI
コード:
#include<stdio.h>
int main(void)
{
#define N
int x[7] = {2,5,7,1,14,6,3}, y[7], z[7], i;
int *a, *b, *c;
for(i=0;i<7;i++)
{
x[i];
}
a=x;
for(i=0;i<7;i++)
{
printf("x[%d]=%d \n", i, *a);
a++;
}
b=y;
for(i=0;i<7;i++)
{
printf("y[%d]=%d \n", i, *b);
b++;
}
c=z;
for(i=0;i<7;i++)
{
printf("z[%d]=%d \n", i, *c);
c--;
}
return(0);
}
返信ありがとうございます。指摘されたところを修正しました。xの値は正常に出てきましたが、ここから配列yを順方向、配列zを逆方向にしたいのですが、どうすればいいでしょうか?
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月13日(水) 00:26
by box
まあ、どうしてもそこに書きたい、というのであれば止めはしませんが、
「マクロ名定義で7と与えること」という仕様はどこへ行ったのでしょうか。
以降のコードで頻繁に現われる「7」の扱いについても。
私の先ほどの回答をよくお読みになりましたか?
KAJI さんが書きました:
配列yを順方向、配列zを逆方向にしたいのですが、どうすればいいでしょうか?
手でその操作をするとき、どういう風にしますか?
xの何番目をyの何番目に入れようとしますか?そして、
xの何番目をzの何番目に入れようとしますか?
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月14日(木) 01:07
by KAJI
コード:
#include<stdio.h>
#define N 7
int main(void)
{
int x[7] = {2,5,7,1,14,6,3}, y[7], z[7], i;
int *a, *b, *c;
for(i=0;i<7;i++)
{
x[i];
y[i]=x[i];
z[6-i]=x[i];
}
a=x;
for(i=0;i<7;i++)
{
printf("x[%d]=%d \n", i, *a);
a++;
}
b=y;
for(i=0;i<7;i++)
{
printf("y[%d]=%d \n", i, *b);
b++;
}
c=z;
for(i=0;i<7;i++)
{
printf("z[%d]=%d \n", i, *c);
c++;
}
return(0);
}
これでよろしいでしょうか?
デバックするとエラーもでませんし、数値もおかしくありません。
どこかおかしいコードはないですか?
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月14日(木) 01:55
by とっち
動作としては問題ありません
しかし12行目の
はどういう意図で書いたのでしょうか?
あとこのコードでは3行目の
が意味ないですよね?
これは例えば今は7ですがこれを10にしたいとします。
KAJIさんのコードだと7行目のx[7]だとか10行目のfor文の7だとかを
全部10にしなければなりませんよね?
しかし、#defineをうまく使うと直すのは
3行目の
の部分だけでよくなります。
もうひとつ、問題はポインタを用いて代入し、要素を出力しなさいとありますが、
このコードだと出力にポインタを使っていますがいいんでしょうか?
(まぁ大丈夫ならいいんですけど・・・)
Re: ポインタと配列の問題で困ってます
Posted: 2012年6月14日(木) 10:08
by non
ここ
コード:
for(i=0;i<7;i++)
{
x[i];
y[i]=x[i];
z[6-i]=x[i];
}
ポインタを使って代入しないと、及第点はもらえないでしょうね。