
//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;
}
No.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で使用しなくても動作すると思います。
では、頑張って見て下さい。
たびたびありがとうございます。
意味もなんとなく解ってきました。
ちょっときれいなソースコードになりました。
ありがとうございました。
#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;
}
No.2
- 回答日時:
#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;
}
回答ありがとうございました。
遅くなりましてすみません。
一応できたのですが、意味は解っていません。
ポインタのポインタのところです。
#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;
}
No.1
- 回答日時:
ローカル変数の初期値は不定の為以下のように
初期化しないと
InputData関数の if(Dat==NULL)は条件が一致せず、
Data領域をnewしないと思われますけど・・・
int main()
{
DATA *Data = NULL ;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C++デバックエラーについて詳しく教えてください。
C言語・C++・C#
-
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
Debug Assertion Failed?
C言語・C++・C#
-
-
4
どんなプログラムを書いても指定されたファイルが見つかりません。と出てきます。どうやったら解決しますか
C言語・C++・C#
-
5
ハンドルされていない例外が発生しました
C言語・C++・C#
-
6
バッファとは何ですか
C言語・C++・C#
-
7
外部シンボル ~~"は未解決ですというエラーが直らない"
C言語・C++・C#
-
8
エディットボックスの入力制限について
C言語・C++・C#
-
9
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
10
初級者の質問――time_tについて
C言語・C++・C#
-
11
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
12
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
13
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
14
error C2143: 構文エラー : ';' が '{' の前にありません。
C言語・C++・C#
-
15
C2146を回避するにはどうしたら良いのでしょうか
C言語・C++・C#
-
16
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
17
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
18
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
19
多重定義が起きている?--lnk2005エラー:VC++
C言語・C++・C#
-
20
配列の要素数に変数を入れたいときには
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
コンストラクタでnewを失敗した...
-
セグメントエラー
-
メモリのアドレスからの値の取...
-
init関数の意味
-
単方向リスト
-
Run-Time Check Failure #3とい...
-
基本アルゴリズムの『返す』の...
-
参照型で受け取った引数をポイ...
-
fopne で失敗する原因
-
ポインタについて
-
戻り値で構造体を返すことは可...
-
自作DLLの引数について、ポイン...
-
NULLとブランクの違い
-
CImage GetBitsメソッドについて
-
お絵かきソフトにUNDO、REDOを...
-
【C言語】戻り値が構造体の関数
-
C言語 ポインタと配列の違い...
-
プーさんのマウスポインタを教...
-
C++で関数ポインタから関数名を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
セグメントエラー
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
参照型で受け取った引数をポイ...
-
トリプルポインタが必須!とな...
-
ハンドルはポインタか
-
LPSTR型の初期化について
-
ポインターの使用法や利点
-
ポインタについて
-
c言語で任意のファイルから読み...
-
基本アルゴリズムの『返す』の...
-
コンストラクタでnewを失敗した...
-
ハンドル、アドレス、ポインタ...
-
アプリを32bitから64bit移行
-
デバイスハンドルとは?
-
NULLとブランクの違い
おすすめ情報