ページ 11

プログラムの構造と誤り

Posted: 2008年11月15日(土) 17:21
by girisya
struct world{
float x,float y,float z
};
struct list
{
struct world w;
struct list *ptr;
};

mai(){
struct listl[4];
unsigned char c=1,mx=4,my=2,mz=1;
for(i=0;i<4;i++,c<<1)
{
l.w.x=float(c&mx);
l.w.y=float(c&my);
l.w.z=float(c&mz);
l.ptr=&l[i+1];
}
}

というプログラムがあるんですが2つ質問したいんです。
①このプログラムで作成されるデータ構造の名称
②プログラム中に、ある誤りが含まれている。どう直せばいいか。
です。

このプログラムが何を意味しているのかもわかりません。
よろしくお願いします!

Re:プログラムの構造と誤り

Posted: 2008年11月15日(土) 17:39
by Dixq (管理人)
こんにちは。
プログラムコードはタグを使って投稿して下さいね。
詳しくは規約をご覧下さい。

あと、このコードは自分でコンパイルしてみましたか?

mai()

という関数は、main()関数のことですか?
変数がどこで宣言されているかもわかりませんし、
まずはコンパイルの通る形にして見ましょう。

コンパイルの通る形に出来ないなら、コンパイルした時に表示されるエラーメッセージを投稿して下さい。

これは誰かから渡されたコードですか?

Re:プログラムの構造と誤り

Posted: 2008年11月15日(土) 17:57
by non
とりあえずエラーはなくしてみました。
ついでに格納したものを表示しました。
#include <stdio.h>
struct world{ 
	float x;
	float y;
	float z; 
}; 
struct list{ 
	struct world w; 
	struct list *ptr; 
}; 
	
int main(void)
{ 
	struct list l[4]; 
	unsigned char c=1,mx=4,my=2,mz=1; 
	int i;
	for(i=0;i<4;i++,c<<=1) { 
		l.w.x=(float)(c & mx); 
		l.w.y=(float)(c & my); 
		l.w.z=(float)(c & mz); 
		l.ptr=&l[i+1]; 
	} 
	for(i=0;i<4;i++)
		printf("%f %f %f %p\n",l.w.x,l.w.y,l.w.z,l.ptr);		
	return 0;
}

で、これは何か・・・?って、それってクイズ?
バイト型のものをfloatに入れて配列なのにリスト構造にしてます。
意味があるとは思えません。

Re:プログラムの構造と誤り

Posted: 2008年11月15日(土) 18:37
by box
最初の for ループで、i が 3 のときに l[4] という配列定義外の領域にアクセスしている点が問題かもしれません。
リスト構造を使った下手な実例である、というのは、non さんのご指摘と同じです。

Re:プログラムの構造と誤り

Posted: 2008年11月15日(土) 21:48
by conio
①このプログラムで作成されるデータ構造の名称
⇒"構造体"ではないでしょうか?

②プログラム中に、ある誤りが含まれている。どう直せばいいか。
パッと見ただけでも、つづりの間違い等が見受けられます。
 mai()
listl[4];
など。

C言語歴、C言語の理解がどのくらいなのか分からないので何ともいえませんが、
コンパイルはしてみましたか?
とりあえずコンパイルしてみて、エラーが出たら修正し、エラーがどうしても
取れなかった場合、その時に詳しいエラーの内容などについて質問してみてはどうでしょう?

>>このプログラムが何を意味しているのかもわかりません。
もし、"構造体"、"ポインタ"、"配列"自体が何なのか分からない場合、
まず参考書で学習してからの方がいいと思います。
全く理解して無いのに、答えだけ聞いても意味が無い(全然理解出来ない)かと思います。

Re:プログラムの構造と誤り

Posted: 2008年11月16日(日) 17:17
by girisya
タグを使わずに投稿してしまいすみませんでした。
回答ありがとうございます。

では1番の答えとしては「構造体」でいいのでしょうか?
コンパイルしてみると、
: 関数 `main' 内:
: `i' が宣言されていません (この関数内で最初に利用)
: (未宣言の各変数については、それが最初に現われたそれぞれの関数
: に対して一度だけ報告されます。)
: 構文解析エラー が "float" の前にあります
: 構文解析エラー が "float" の前にあります
: 構文解析エラー が "float" の前にあります
とでます。

l[4]の部分をどのように変えたらこのエラーはとれるのでしょうか?
何度も質問してしまいすみません。
よろしくお願いします。

Re:プログラムの構造と誤り

Posted: 2008年11月16日(日) 17:34
by non
エラーをなくして、載せているのに、なんで?
後、何をどうして欲しいの?
1番の答えはリスト構造かもね。

Re:プログラムの構造と誤り

Posted: 2008年11月16日(日) 18:19
by non
>l[4]の部分をどのように変えたらこのエラーはとれるのでしょうか?
この部分を忘れてました。失礼しました。

エラーにはならないと思いますので、無理に直さなくても良いというのが私の考えです。
なぜなら、このプログラムの意味(目的)が理解できないからです。
配列のl[4]がないときに、どこをアドレスは指しているのか調べようというプログラムかもしれないじゃないですか。だから、私のプログラムではアドレスを表示しました。

Re:プログラムの構造と誤り

Posted: 2008年11月16日(日) 18:49
by girisya
目的としては、このプログラムで作成されるデータ構造l[4]に格納される3次元点を結んだ直線群を図示することです。
エラーをなくしていただいたプログラムを実行した結果ということですね!
具体的にどこをどう直せばいいというのがいまいちわからなかったので…
至らない点がたくさんありすみませんでした。
ありがとうございました。