ページ 11

ポインタと配列の問題で困ってます

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
KAJI さんが書きました:

コード:

#define N 7;
ふつうは、こういう場所に書きません。関数の外に書くのが一般的でありましょう。
最後のセミコロンは、必要ですか?
せっかくdefineしたNを全く使っていませんね。
以降のコードで頻繁に登場する7という数値を直接書かなくていいように、
Nを使うのではないでしょうか。
KAJI さんが書きました:

コード:

		x[i]=y[i];
左辺と右辺の関係は正しいですか?
このコードでは、初期化していない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
KAJI さんが書きました:

コード:

#define N
まあ、どうしてもそこに書きたい、というのであれば止めはしませんが、
「マクロ名定義で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行目の

コード:

x[i];
はどういう意図で書いたのでしょうか?

あとこのコードでは3行目の

コード:

#define N 7
が意味ないですよね?
これは例えば今は7ですがこれを10にしたいとします。
KAJIさんのコードだと7行目のx[7]だとか10行目のfor文の7だとかを
全部10にしなければなりませんよね?
しかし、#defineをうまく使うと直すのは
3行目の

コード:

#define N 7
の部分だけでよくなります。

もうひとつ、問題はポインタを用いて代入し、要素を出力しなさいとありますが、
このコードだと出力にポインタを使っていますがいいんでしょうか?
(まぁ大丈夫ならいいんですけど・・・)

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];
    }
ポインタを使って代入しないと、及第点はもらえないでしょうね。