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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KAJI

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

#1

投稿記事 by KAJI » 13年前

はじめまして、プログラミング初心者の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);
}
エラーはありませんでしたが、デバックするとおかしな数値になってしまいます。どこが間違っているのか、教えて下さい。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 13年前

11行目で配列の範囲外にアクセスしていますね。

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

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

#3

投稿記事 by box » 13年前

KAJI さんが書きました:

コード:

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

コード:

		x[i]=y[i];
左辺と右辺の関係は正しいですか?
このコードでは、初期化していないy[]の値で、せっかく初期化したx[]の値を
上書きしてしまっているように見えます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

KAJI

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

#4

投稿記事 by KAJI » 13年前

コード:

#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を逆方向にしたいのですが、どうすればいいでしょうか?

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

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

#5

投稿記事 by box » 13年前

KAJI さんが書きました:

コード:

#define N
まあ、どうしてもそこに書きたい、というのであれば止めはしませんが、
「マクロ名定義で7と与えること」という仕様はどこへ行ったのでしょうか。
以降のコードで頻繁に現われる「7」の扱いについても。
私の先ほどの回答をよくお読みになりましたか?
KAJI さんが書きました: 配列yを順方向、配列zを逆方向にしたいのですが、どうすればいいでしょうか?
手でその操作をするとき、どういう風にしますか?
xの何番目をyの何番目に入れようとしますか?そして、
xの何番目をzの何番目に入れようとしますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

KAJI

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

#6

投稿記事 by KAJI » 13年前

コード:

#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);
}
これでよろしいでしょうか?
デバックするとエラーもでませんし、数値もおかしくありません。
どこかおかしいコードはないですか?

とっち
記事: 56
登録日時: 13年前
住所: 岡山

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

#7

投稿記事 by とっち » 13年前

動作としては問題ありません

しかし12行目の

コード:

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

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

コード:

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

コード:

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

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

non
記事: 1097
登録日時: 14年前

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

#8

投稿記事 by non » 13年前

ここ

コード:

   for(i=0;i<7;i++)
    {
        x[i];
        y[i]=x[i];
        z[6-i]=x[i];
    }
ポインタを使って代入しないと、及第点はもらえないでしょうね。
non

閉鎖

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