牛、豚、鶏、どれか一つ食べられなくなるとしたら?

//Run-Time Check Failure #3 - The variable 'Data' is being used without being defined.
//というエラーが出ます。どうしたらいいですか?
//プログラムの内容は、数値を格納するときに、二分木構造で格納していくというものです。
//多分違うような気がしますが、、
//よろしくお願いします。
#include<stdio.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA *Dat,int num)
{
if(Dat==NULL){Dat=new DATA;Dat->Number=num;return;}
if(Dat->Number<num)
{
Dat->Large=new DATA;
Dat=Dat->Large;
InputData(Dat,num);
}
else if(Dat->Number>num)
{
Dat->Small=new DATA;
Dat=Dat->Small;
InputData(Dat,num);
}
return;
}
int main()
{
DATA *Data;
InputData(Data,20);//<-ここでエラーが出ます。
InputData(Data,10);
InputData(Data,30);
return 0;
}

A 回答 (3件)

とりあえず、題名のエラーに付いてですが、


それは、mainの中での初期値を設定していない為に、
変数に不定値が入っていた為に起こった現象です。

で、#2に付いての質問ですが、まずは、main関数での宣言の
DATA *Data ;
は、アドレスを格納する変数と言うことです。

また、InputData関数の引数の
DATA **Datに付いては
アドレスを格納する変数のアドレスを引数とするという事です。

ですから、質問時のInputDataの引数の
DATA *Datでは
Datと言う変数のアドレスを受け取ると言うことで
アドレスを格納する変数では無く、実体(値)を格納する変数となります。

で、#2のようにDATA **Datとすると *Datのアドレスを
受け取ると言うことになり、アドレスを格納する
変数と言うことに成ります。
(引数で記述するのはあくまでも変数宣言と同等です。)

以上が今回のエラー及びプログラムの間違いです。
(説明が下手で申し訳ありませんm(_ _)m)

詳しいアドレス及びポインタに付いては、C言語の
書籍にポインタに付いて記述されていると思いますので
探してみてください。

でも、ポインタに付いて詳しい説明をしている書籍って
・・・本1冊分になるような気がする(汗

それと、余計なアドバイスに成りますが、
ローカル変数とグローバル変数の違いもお勉強されると
良いかもしれませんね。
ローカル変数は、宣言するだけでは初期値は不定とかね。(だから、必ず初期化が必要なんです。)
そうすれば、今回のエラーの意味もすぐにわかると思います。

これも、余計な事かもしれませんが、#2の
お礼の部分に記述してあるプログラムに付いてですが、
せっかくですから、InputDataの中でデータと
データの間に挿入すると処理を追加すれば、
DATA *Top;
DATA *TopTmp;
をmainで使用しなくても動作すると思います。

では、頑張って見て下さい。
    • good
    • 0
この回答へのお礼

たびたびありがとうございます。
意味もなんとなく解ってきました。
ちょっときれいなソースコードになりました。
ありがとうございました。
#include<stdio.h>
struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
DATA *InputData(DATA **Dat,int num)
{
if((*Dat)==NULL)
{
(*Dat)=new DATA;
(*Dat)->Number=num;
(*Dat)->Large=NULL;
(*Dat)->Small=NULL;
return (*Dat);
}
if((*Dat)->Number<num)
{
InputData(&(*Dat)->Large,num);
}
else if((*Dat)->Number>num)
{
InputData(&(*Dat)->Small,num);
}
return (*Dat);

}
void ShowData(DATA *Dat)
{
if(Dat==NULL){return;}
ShowData(Dat->Small);
printf("%d ",Dat->Number);
ShowData(Dat->Large);
}
int main()
{
DATA *Data;
Data=NULL;
Data=InputData(&Data,10);
InputData(&Data,5);
InputData(&Data,15);
InputData(&Data,-20);
InputData(&Data,3);
InputData(&Data,8);
InputData(&Data,-50);
ShowData(Data);
getchar();
return 0;
}

お礼日時:2005/01/23 06:32

#1です。


多分#1を直しても意図した動作には成らないと思います。
多分、意図した動作にするには下記の様にしないと・・
領域確保の部分でおかしくなると思います。

後は、ソースを追って何が違うか考えてみてください。
ヒントは、ポインタの使い方です。

#include<stdio.h>
#include<string.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA **Dat,int num)
{
if(*Dat==NULL){
*Dat=new DATA;
memset( *Dat, '\0', sizeof( DATA )) ;
(*Dat)->Number=num;
return;
}
if((*Dat)->Number<num)
{
InputData(&((*Dat)->Large),num);
}
else if((*Dat)->Number>num)
{
InputData(&((*Dat)->Small),num);
}
return;
}
int main()
{
DATA *Data = NULL ;
InputData(&Data,20);
InputData(&Data,10);
InputData(&Data,30);
return 0;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
遅くなりましてすみません。
一応できたのですが、意味は解っていません。
ポインタのポインタのところです。
#include<stdio.h>
#include<string.h>

struct DATA
{
DATA *Small;
DATA *Large;
int Number;
};
void InputData(DATA **Dat,int num)
{
if(*Dat==NULL)
{
*Dat=new DATA;
memset( *Dat, '\0', sizeof( DATA )) ;
(*Dat)->Number=num;
return;
}
if((*Dat)->Number<num)
{
InputData(&((*Dat)->Large),num);
}
else if((*Dat)->Number>num)
{
InputData(&((*Dat)->Small),num);
}
return;
}
void ShowData(DATA **Dat)
{
DATA **Tmp;
Tmp = Dat;
while (*Tmp)
{
ShowData(&(*Tmp)->Small);
printf("%d ",(*Tmp)->Number);
(*Tmp)=(*Tmp)->Large;
}
}
int main()
{
DATA *Data = NULL ;
InputData(&Data,20);
DATA *Top;
DATA *TopTmp;
TopTmp=Top=Data;
InputData(&Top,10);
Top=TopTmp;
InputData(&Top,30);
Top=TopTmp;
InputData(&Top,5);
Top=TopTmp;
InputData(&Top,8);
Top=TopTmp;
InputData(&Top,50);
Top=TopTmp;
InputData(&Top,1000);
Top=TopTmp;
InputData(&Top,-100);
Top=TopTmp;
ShowData(&Top);
getchar();
return 0;
}

お礼日時:2005/01/23 00:01

ローカル変数の初期値は不定の為以下のように


初期化しないと
InputData関数の if(Dat==NULL)は条件が一致せず、
Data領域をnewしないと思われますけど・・・

int main()
{
DATA *Data = NULL ;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A