2012-04-29 10 views
0

私はStudentの配列を持っています。私は配列の長さを100に設定しましたが、100個の有効なStudentオブジェクトがありません。配列全体を繰り返し処理し、すべての有効なStudentオブジェクトを取得してから、Studentオブジェクトを持たない配列セルに移動すると停止したいと考えています。オブジェクト配列内で最後に使用された要素を見つけよう

最後の生徒の後にNULLを配列セルに入れてみて、if (queriedStudents[i])if(queriedStudents[i] != NULL)をチェックしてみましたが、どちらもうまくいきませんでした。

私の配列の使用済み部分の終わりを見つける最良の方法は何ですか?

Student *Welcome::queryStudents(int *queries) { 
    int query = 0; 
    Student *matchedStudents[100]; 
    int matchedPos = 0; 
    while (queries[query] > 0) { 
     for (int i = 0; i < numStudents; i++) { 
      if (allStudents[i]->id == queries[query]) { 
       matchedStudents[matchedPos] = allStudents[i]; 
       matchedPos++; 
      } 
     } 

     query++; 
    } 
    matchedStudents[matchedPos] = NULL; 

    return *matchedStudents; 
} 

そして、私のコードチャンクは、各Studentの値をプリントアウトしようとしている:あなたは大きな問題を持っている

 int i = 0; 
     while (i < 100) { 
      if (queriedStudents[i]) { 
       cout << "ID:\t" << queriedStudents[i]->id << endl; 
       cout << "Name:\t" << queriedStudents[i]->name << endl; 
       cout << "Addr.:\t" << queriedStudents[i]->address << endl; 
       cout << "Phone:\t" << queriedStudents[i]->phone << endl; 
      } else { 
       i = 100; 
      } 
      i++; 
     } 
+5

可能であれば、配列の代わりに 'std :: vector'を使用します。これは、配列に含まれるオブジェクトの数を追跡します。 –

+2

あなたの配列にポインタが含まれている場合、NULLを使って説明したものは、ポインタを追加する前にNULLを使って配列を初期化している限り動作します。これにより、各アイテムの新規/削除を手動で処理する必要がなくなります。ジェリーは言ったように、ベクターはこれを避け、あなたが実際に使っているものだけを保存するのに良い選択です。もう一つの選択肢として、何らかの理由でvectorを使用できない場合は、Studentオブジェクトに 'valid'メンバを追加することができます。これは、デフォルトでfalseに初期化され、オブジェクトに実際のデータが存在する場合にのみtrueに設定されます。 –

+1

@RetiredNinja:よいコメント、より良い答え。投稿する! – greg

答えて

3

。配列matchedStudentsを関数queryStudentsのスタックに宣言します。その関数から制御が外れると、配列は範囲外に渡ります。後で(配列の最初の要素だった)ポインタを使用してそれを使用しようとすると、割り当てられていないメモリが混乱してしまいます。これは、ほとんどの場合、未定義の動作につながります。あなたが最後に住んでいたときから所有者を変えた家を訪れているかのようです。何が変わったのかは分かりません。目を閉じたままさまようと、困ってしまうかもしれません。

Student **Welcome::queryStudents(int *queries) { 
    Student **matchedStudents = new *Student[100]; 
    ... 
    return matchedStudents; 
} 

または参照でそれを渡します:あなたは、ヒープ上の配列を宣言することができます

いずれかの方法で

void Welcome::queryStudents(int *queries, Student **&matchedStudents) { 
    ... 
} 

を、あなたはその後の終わりを示す方法の問題に取り組むことができます有効なポインタ。あなたの方法は実現可能ですが、@ JerryCoffinが指摘したように、std::vectorが利用可能であることに注意してください。配列は苦痛であり、STLコンテナ(vectorなど)は、あなたのためにこれらの汚い細部を処理するために作られました。最近、配列を使って作業することは、教育学以外の目的はほとんどありません。コンセプトを理解できるようになるまでそれを試してから、より高度なコンテナを使用してください。

+0

それは私がどこにいるのかかなり正確です。これは今学期の私のクラスの最初の課題であり、私の最大の問題はJavaとAS3からC++への切り替えです。私がコンセプトを落とすと、私は続けていくつもりです。 –

関連する問題