Run-Time Check Failure #3エラーの解決方法

このQ&Aのポイント
  • C言語のプログラムでRun-Time Check Failure #3エラーが発生しました。
  • このエラーは、変数'Data'が定義されていないまま使用されていることが原因です。
  • 解決するためには、'Data'を適切に定義して初期化する必要があります。
回答を見る
  • ベストアンサー

Run-Time Check Failure #3というエラーが出ます。

//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; }

質問者が選んだベストアンサー

  • ベストアンサー
  • PS-biba
  • ベストアンサー率66% (4/6)
回答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で使用しなくても動作すると思います。 では、頑張って見て下さい。

HokUebun
質問者

お礼

たびたびありがとうございます。 意味もなんとなく解ってきました。 ちょっときれいなソースコードになりました。 ありがとうございました。 #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; }

その他の回答 (2)

  • PS-biba
  • ベストアンサー率66% (4/6)
回答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; }

HokUebun
質問者

お礼

回答ありがとうございました。 遅くなりましてすみません。 一応できたのですが、意味は解っていません。 ポインタのポインタのところです。 #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; }

  • PS-biba
  • ベストアンサー率66% (4/6)
回答No.1

ローカル変数の初期値は不定の為以下のように 初期化しないと InputData関数の if(Dat==NULL)は条件が一致せず、 Data領域をnewしないと思われますけど・・・ int main() { DATA *Data = NULL ;

関連するQ&A

  • Run-Time Check Failure #3 と表示されてしまうことについて

    初歩的な質問で申し訳ありません。 Visual Studio C++にて、入力された値を基に最短(最小値)を求めていくプログラムを作成しているのですが、 ”Run-Time Check Failure #3 - The variable 'x' is being used   without being defined.” と表示されて、コマンドプロンプトが実行されません。 なぜこうなってしまうのですか? 参考までに下記に作成したソースコードを示します。 初心者ゆえ書き方がしっかりとできておらず、大変わかりにくいソースかとは思いますが、助言をいただければ幸いです。 #include "stdafx.h" #include "stdlib.h" #define MAX_LINE 256 #define MIN_DATA 3 int _tmain(int argc, _TCHAR* argv[]) { char buf[MAX_LINE]; int i,x,y,z,min_data; int data[MIN_DATA] = {x,y,z}; printf("Sからaまでの距離を入力して下しい。\n"); gets(buf); /*キーボードから値を入力*/ x = atoi(buf); printf("a=%dです。\n",x); printf("Sからbまでの距離を入力して下しい。\n"); gets(buf);/*キーボードから値を入力*/ y = atoi(buf); printf("b=%dです。\n",y); printf("Sからcまでの距離を入力して下しい。\n"); gets(buf);/*キーボードから値を入力*/ z = atoi(buf); printf("c=%dです。\n",z); printf("並べ替えると\n"); min_data = data[30];/*入力された値を降順で並べ最小値を表示*/ for (i = 0; i < MIN_DATA; i++) { if (min_data > data[i]) { min_data = data[i]; } } printf("最短は %d\n", min_data); printf("Enterで終了"); return (0); }

  • コンパイルエラー

    前に質問したものですが、ちょっとソースをいじりました。 ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 コンパイルできて実行できました。 でもエンキューとデキューが実行されてません。 次のソースのうちどこを変えたらいいか教えてください #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[NUMBER]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],q->que[q->front++]); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); }

  • 文が指定されていませんエラーについて

    public class Stack2 { private static int[] stack = new int[50]; private static int ip = -1; //スタックポインター, -1ならデーターなし public static int push ( int inData ) { // データー格納 if (ip == (stack.length - 1)) { System.out.println(\"スタックがいっぱいです\"); } else { stack[++ip] = inData; } } public static int pop ( ) { // データー取り出し if ( ip < 0 ) { System.out.println (\"スタックにデーターがありません\"); return -2147483648; } else { return stack[ip]; } } } 「Stack2.java:10:return 文が指定されていません」コンバイルエラーになります。 どのようにデバックすれば良いのか教えてください。

  • ポインタを引数に渡してメモリ領域をとる

    C++でアプリケーションを作っています。 メモリ領域を動的に確保するコードを書いているところなのですが、 int *pr; // ポインタ kakuho(pr,100); // 新たにメモリ領域int100個分確保し、先頭番地をprに返す関数 というコードを作りたいのですが、 kakuho(int *pr,int num){ pr=new int[num]; return; } このようなプログラムを書いてVisual C++.NETでコンパイルすると、コンパイルは成功するのですが、実行時に Run-Time Check Failure #3 - The variable 'pr' is being used without being defined. このメッセージの意図することがよくつかめぬまま、ここで開発が止まっています。 どういう意味なのか、また、解決するにはどのようにしたらよいか教えてください。

  • c言語の関数について

    .#include<stdio.h> int input_number(void); int main(void) { int num; int total = 0; while(){ num = input_number(); if(num == 0){ break; } total = total + input_number(); } printf("¥n合計値は%dです¥n", total); return 0; } int input_number(void) { int num; printf("数値を入力してください: "); scanf("%d", &num); return num; } 個人でcを勉強しております。 このプログラムで間違っているところを教えていただけませんでしょうか? 苦戦して困っております。できれば勉強法も教えてていただきたいです。 どうか宜しくお願いします。

  • カスタムコンポーネントのプロパティ

    いつもお世話になっております。 Java(swing)でカスタムコンポーネントを作成する 勉強をしています。 以下のようなラベルを敬称するコントロールを作成しました。 作成したラベルのプロパティにて fontSizeに0または1または2を入力するとフォントサイズが 変更するようにしましが、 プロパティで0,1,2のように数字を入力するのではなく リスト選択(SMALL,MEDIUM,LARGE)にて選択させるには どのようにしたらよいでしょうか? よろしくお願いします。 public class TestJLabel extends JLabel { public static final int SMALL = 0; public static final int MEDIUM = 1; public static final int LARGE = 2; private int size = SMALL; public int getFontSize() { return this.size; } public void setFontSize(int size) { this.size = size; if (size == SMALL){ this.setFont(new Font("MS ゴシック", Font.PLAIN, 10)); } else if (size == MEDIUM){ this.setFont(new Font("MS ゴシック", Font.PLAIN, 18)); } else { this.setFont(new Font("MS ゴシック", Font.PLAIN, 36)); } } }

  • エラーが出ます

    エラーが出ますがどこを直したらいいかわかりません。 できれば手直しお願い致します。 import java.io.*; import java.util.*; pubic class A23_exec { public static void main(String args[]) { try { A23_StrArray strAry = new A23_StrArray(); while(true) { //処理Noの入力を促す System.out.println("----------処理No?----------"); String inputData = input(); //終了処理 if(inputData.equals("99")) { System.out.println("終了"); break; } //追加(ADD)処理 else if(inputData.equals("01")) { System.out.println("追加内容?"); inputData = input();//コマンドラインからの入力 strAry.add(inputData); } //上書き処理 else if(inputData.equals("02")) { System.out.println("上書き内容?"); inputData = input();//コマンドラインからの入力 strAry.set(1, inputData); System.out.println(strAry.toString()); } //要素の取得処理 else if(inputData.equals("03")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 System.out.println(strAry.get(1)); } //要素のクリア処理 else if(inputData.equals("04")) { System.out.println("クリア"); inputData = input();//コマンドラインからの入力 strAry.clear(); } //全ての要素の配列処理 else if(inputData.equals("05")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 System.out.println(strAry.getAll()); } //要素数の取得 else if(inputData.equals("06")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 System.out.println(strAry.getIndex()); } //昇順処理 else if(inputData.equals("07")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.sort(strAry.ASC_SORT); } //降順処理 else if(inputData.equals("08")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.sort(strAry.DESC_SORT); } //読み込み処理 else if(inputData.equals("09")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.readFile(inputData); } //読み込みの追記処理 else if(inputData.equals("10")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.readFile(inputData); } //読み込み上書き処理 else if(inputData.equals("11")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.readFile(inputData, true); } //書き込み処理 else if(inputData.equals("12")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.writeFile(inputData, false); } //書き込みの追記処理 else if(inputData.equals("13")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.writeFile(inputData, true); } //書き込みの上書き処理 else if(inputData.equals("14")) { System.out.println("取得内容?"); inputData = input();//コマンドラインからの入力 strAry.writeFile(inputData, false); } } } catch(Exception e) { System.out.println("e"); } } /** * コマンドラインからの入力を受け取り、文字列として戻す * @param:indexインデックス * @return:取得した要素 */ private static String input() { //入力用オブジェクト BufferedReader cinBuff = new BufferedReader(new InputStreamReader(System.in)); //コンソールからの文字入力 try { //入力用オブジェクトが文字入力を受付、それをStringクラスに代入 return cinBuff.readLine(); } catch(IOException e) { System.out.println("IOExceptionエラー発生!!"); } } }

  • エラーのチェックについて

    1~10の数字以外が出たら、再入力を促すようにしたいのですが、上手くいかないので教えてください。 int main(void) { char buf[MAX], moji[MAX]; int n, num; printf("1から10の番号を入力してください:"); while (1) { fgets(buf, MAX, stdin); // 文字列の読み込み n = sscanf(buf, "%d%s", &num, moji); // 文字列から変換 if (num >= 1 && num <= 10 && n == 1) { // 範囲外のエラーチェック break; // 正なら終了 } else { // 間違っていたら入力し直し printf("1から10の番号を入力してください:"); } } 以上のようにして、aや11, ctrlキー+zを入力してEnterを押したときは良いのですが、aの後に続けてctrlキー+zを入力してEnterを押したらelseのprintfがずっと出力され続けてしまいます。それ以外に自分で試した入力の中にはエラーは出ませんでした。ctrlキー+zのことを良く理解していないということもあるのかもしれません。

  • FLASHの出力エラーについて

    FLASHの出力エラーの原因がわかりません。 プレビューを押したとき ArgumentError: Error #2004: パラメータの 1 つが無効です。 at flash.display::Graphics/drawRect() at _fla::MainTimeline/xClick() とでてしまいます。 詳しい方、ご教授お願い致します。 ↓アクションスクリプトです add_btn.addEventListener(MouseEvent.CLICK, xClick); function xClick(evt) { var num1:Number = Number(in1_txt.text); var num2:Number = Number(in2_txt.text); var h:Number; if (num1 < 18) { h = 60; } else if ((num1 >= 18) && (num1 < 20)) { h = 50; } else if ((num1 >= 20) && (num1 < 23)){ h = 40; } var black:Number; if (num1 < 18) { black = (0xb0c4de); } else if ((num1 >= 18) && (num1 < 20)) { black = (0x8e9db2); } else if ((num1 >= 20) && (num1 < 23)) { black = (0x66707f); } else if ((num1 >= 23) && (num1 < 26)) { black = (0x232933); } else if(num1 > 25) { black = (0x232933); } var iro:Number; if (num1 < 18) { iro = 0.3;; } else if ((num1 >= 18) && (num1 < 20)) { iro = 0.4; } else if ((num1 >= 20) && (num1 < 23)){ iro = 0.5; }else if (num1 >50){ iro = 1.0; } var color:Number; if ((num2 >= 18) && (num2 <=25)){ color = (Math.random() * 0xffffff); } else if ( (num2 >=40) && (num2 <= 50)) { color = (0x999966); } else if(num1 > 50){ color = (0x996633); } else { color = (Math.random() * 0xffffff); } var k:Number; if ((num1 >= 23) && (num1 < 25)) { var mae:Shape=new Shape(); mae.graphics.beginFill(color); mae.alpha = 0.5; mae.graphics.drawRect(645 ,410, 310, 30); mae.graphics.endFill(); addChild(mae); for( y = 455 ; y <= 770 ; y = y + 255 ) { var ye:Shape=new Shape(); ye.graphics.beginFill(black); ye.graphics.drawRect(645 ,y, 310, 35); ye.graphics.endFill(); addChild(ye); } for( y = 505 ; y <= 700 ; y = y + 55 ) { var shima:Shape=new Shape(); shima.graphics.beginFill(color); shima.alpha = 0.5; shima.graphics.drawRect(645 ,y, 310, 28); shima.graphics.endFill(); addChild(shima); } } var m:Number; if (num1 >= 25) { var bod:Shape=new Shape(); bod.graphics.beginFill(color); bod.alpha = 0.5; bod.graphics.drawRect(645 ,410, 310, 10); bod.graphics.drawRect(645 ,490, 310, 10); bod.graphics.drawRect(645 ,660, 310, 20); bod.graphics.drawRect(645 ,685, 310, 5); bod.graphics.endFill(); addChild(bod); for( y = 430 ; y <= 700 ; y = y + 265 ) { var rec:Shape=new Shape(); rec.graphics.beginFill(black); rec.graphics.drawRect(645 ,y, 310, 50); rec.graphics.endFill(); addChild(rec); } for( y = 500 ; y <= 655 ; y = y + 40 ) { var ran:Shape=new Shape(); ran.graphics.beginFill(color); ran.alpha = 0.5; ran.graphics.drawRect(645 ,y, 310, Math.random()*30); ran.graphics.endFill(); addChild(ran); } }

  • C言語 二分木探索

    今、int型の二分木にデータを追加する関数(引数は二分木へのポインタと追加する値、追加されたノードへのポインタを返す)をつくろうとしてます。 以前リストにデータを追加する関数をつくったのでそれを変更してつくろうとしているのですが途中までいってつまってしまいました。 つくりかたを教えてください。 よろしくお願いします! struct BinaryTreeNode{ int data; struct BinaryTreeNode *l_next; struct BinaryTreeNode *r_next; }; struct BinaryTree{ int node_num; struct BinaryTreeNode *root; }; BinaryTreeNode *BinaryTreeNodeAlloc(void) { BinaryTreeNode *node; node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode)); if (node == NULL) { return (NULL); } node->l_next = NULL; node->r_next = NULL; return (node); } BinaryTreeNode *BinaryTreeDataAdd(BinaryTree *list, int x) { BinaryTreeNode *ptr; BinaryTreeNode *prev; BinaryTreeNode *new_node; ptr = list->root; prev = NULL; while (ptr) {       ←?? if (ptr->data < x) { prev = ptr; ptr = ptr->next; } else if (ptr->data == x) { return (NULL); } else { new_node = BinaryTreeNodeAlloc(); if (new_node == NULL) { exit (0);                ←?? } new_node->data = x; new_node->next = ptr; if (prev != NULL) { prev->next = new_node; } else { list->head = new_node; } list->node_num++; return (new_node); } } new_node = BinaryTreeNodeAlloc(); if (new_node == NULL) { exit (0); } new_node->data = x; new_node->r_next = NULL; new_node->l_next = NULL; if (prev != NULL) { prev->next = new_node; } else { list->head = new_node; } list->node_num++; return (new_node); }

専門家に質問してみよう