
//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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- MySQL MYSQL エラー 2 2022/10/18 11:37
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- UNIX・Linux Linuxについて質問です。 以下のような設定をしたMakefileを作成するにはどう記述すればよい 1 2023/02/03 20:10
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
何回やってもうまくいかないことは?
みなさんには、何回やってもうまくいかないことはありますか?
-
あなたの「プチ贅沢」はなんですか?
お仕事や勉強などを頑張った自分へのご褒美としてやっている「プチ贅沢」があったら教えてください。
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C++デバックエラーについて詳しく教えてください。
C言語・C++・C#
-
Debug Assertion Failed?
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
C言語 配列の長さの上限
C言語・C++・C#
-
7
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
8
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
9
バッファとは何ですか
C言語・C++・C#
-
10
初級者の質問――time_tについて
C言語・C++・C#
-
11
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
12
【C++/CLI】コンボボックスの値を取得したい
C言語・C++・C#
-
13
間接操作のレベルとは
C言語・C++・C#
-
14
【C++/CLI.NET】コンボボックスの値の設定・取得
C言語・C++・C#
-
15
CString から LPCTSTRの型に変換
C言語・C++・C#
-
16
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
17
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
18
画面を強制的に再描画させる方法
C言語・C++・C#
-
19
「fatal error C1189」を回避するには?
C言語・C++・C#
-
20
DWORDの実際の型は何でしょうか
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
ExcelVBAでのkernel32(64bit)
-
CImage GetBitsメソッドについて
-
NULLとブランクの違い
-
init関数の意味
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
アプリを32bitから64bit移行
-
参照型で受け取った引数をポイ...
-
無効なポインタ操作のエラー
-
popenした子プロセスのプロセス...
-
Voidポインタで受け取った変数...
-
【なぜポインタを使うのか】
-
ハンドルはポインタか
-
関数内、ファイルのstatic変数
-
デバイスハンドルとは?
-
C++で関数ポインタから関数名を...
-
ASPでACCESSマクロのNZ関...
-
パスからファイル名を抽出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
アプリを32bitから64bit移行
-
c言語で任意のファイルから読み...
-
関数ポインタの利点
-
コンストラクタでnewを失敗した...
-
C++で関数ポインタから関数名を...
-
ポインタについて
-
ハンドルはポインタか
-
基本アルゴリズムの『返す』の...
-
無効なポインタ操作のエラー
-
関数にポインタを渡して動的確...
-
[C言語] NULLは必ず0(番地)です...
おすすめ情報