//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も見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
C++デバックエラーについて詳しく教えてください。
C言語・C++・C#
-
バッファとは何ですか
C言語・C++・C#
-
エラーの原因は?「この関数の定義が見つかりません」
C言語・C++・C#
-
-
4
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
5
Debug Assertion Failed?
C言語・C++・C#
-
6
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
7
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
8
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
9
エディットボックスの入力制限について
C言語・C++・C#
-
10
画面を強制的に再描画させる方法
C言語・C++・C#
-
11
C2146を回避するにはどうしたら良いのでしょうか
C言語・C++・C#
-
12
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
13
「fatal error C1189」を回避するには?
C言語・C++・C#
-
14
long型の定数の末尾にLを付ける意味
C言語・C++・C#
-
15
LINK : fatal error LNK1104について
C言語・C++・C#
-
16
【C++/CLI】コンボボックスの値を取得したい
C言語・C++・C#
-
17
【C++/CLI.NET】コンボボックスの値の設定・取得
C言語・C++・C#
-
18
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
19
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
20
例えばはe.g.?それともex.?
英語
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
init関数の意味
-
CWnd::EnableWindow()の扱い方
-
ポインタ変数のサイズについて...
-
c言語で任意のファイルから読み...
-
ファイルポインタのヘッダーフ...
-
連結リスト 要素の入れ替え
-
#define NULL ((void *)0) の弊害
-
自分のIID_IUnKnown取得について
-
LPSTR型の初期化について
-
c言語のポインタについて初心者...
-
クラスの参照渡しとメンバ変数...
-
Cで作成したDLL関数をVBから呼...
-
VC6でALTを作成して、VB6やC#で...
-
メモリのアドレスからの値の取...
-
ハンドル、アドレス、ポインタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
ハンドルはポインタか
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
Cで作成したDLL関数をVBから呼...
-
popenした子プロセスのプロセス...
-
c言語で任意のファイルから読み...
-
[excel vba] マウスポインタの...
-
パスからファイル名を抽出
-
プーさんのマウスポインタを教...
-
基本アルゴリズムの『返す』の...
おすすめ情報