2012-04-13 10 views
-1

私は人を追跡する課題を持っています。今のところ、私はcrud操作を行う必要があります。 私は動的配列にアクセスしようとすると、人のidのゲッターが動作しますが、人の電話のものは "セグメンテーションフォールト"を返し、人の名前のものは何も表示しません。セグメンテーションフォルトとゲッターの問題

//the main.cpp test that gives the following error 
Controller ctrl(repp,repa,valp,vala); 
ctrl.addPerson(1,"Name","0744000000","Adress");  
ctrl.show(); 

//controller show method, repp - instance of repository in controler 
void Controller::show() 
{ 
    repp->show(); 
} 

//repository show method, which doesn't work 
void PersonInMemoryRepository::show() 
{ 
    for(int i=0; i < pers.getSize(); i++) 
     cout<<pers.get(i)->getName()<<endl; 
} 

//getById method in repository 
const Person* PersonInMemoryRepository::getById(int id) 
{ 
for (int i = 0; i < pers.getSize(); i++) 
    { 
    if (pers.get(i)->getId() == id) { 
     return pers.get(i); 
            } 
} 
return NULL; 
} 

//the Person class 
class Person 
{ 
public: 
Person(int i, string n, string p, string a); 
const string& getName() const { 
    return name; 
} 
const string& getPhone() const { 
    return phone; 
} 
const string& getAdress() const { 
    return adress; 
    } 
int getId() const { 
    return id; 
} 
    ~Person(); 
private: 
    int id; 
string name; 
string phone; 
string adress; 
}; 
//pers.get(i) 
template<typename Element> 
Element DynamicArray<Element>::get(int poz) { 
return elems[poz]; 
} 

ありがとうございます。

更新:それが行頭にあるとき< getName(); 。 pers.get(i)はうまく動作し、Person *型のベクトルで、デバッガで逆参照すると正しい値を持ちますが、 - > getName()に "無効な番号0の繰り返し"と表示されます。

+4

あなたは「セグメンテーション違反」(またはそのことについてはクラッシュのいずれかのタイプ)を取得するときに、あなたが最初にすべきことをしていますデバッガでアプリケーションを実行します。これにより、クラッシュの位置を特定するのに役立ちます。また、変数を調べて何が原因かを調べるのに役立ちます。 –

+0

コードを理解するのは難しいが、あまりにも多くのギャップがある。 – vid

+0

最初に失敗したときは、セグメンテーションフォールト(またはそのタイプのクラッシュ)が発生したときに2番目にすべきことは、送信ボタンを押す前にコードを適切にインデントすることです。 –

答えて

0

あなたが表示するコードは、segの原因を突き止めるには不十分です。失敗。私が推測するのは、elemsコンテナにoverindexしていることでしょう(pers.getSize()が間違った値を返すかもしれません)

+0

pers.getSize()は正しい値を返します。とにかく、pers.get(i) - > getId()、正しいid(int)を返すので、正しい場所を指していると思います。たぶん私はgettersを宣言する方法は問題になる可能性がありますか? 。私はいくつかの方法を試しましたが、どれもうまくいきません – vladCovaliov

+0

有効なインデックスのみを 'pers'にアクセスすることが確実であれば、私が考えることができる残った唯一の可能性は、あなたが' pers'のデータを破壊する他の配列にオーバーインデックスすることです。 – Attila

+0

私はすべてのコードをアップロードする方法がありますか、誰かが私を助けますか? 。インデックス作成に影響する可能性のある他の配列やメソッドはありません。それはちょうど追加とショーです。 – vladCovaliov

1

標準がほとんどのコンテナのコンテナであると仮定すると、サイズ関数は、コンテナの要素アクセスがゼロから始まる間に、カウントを開始する要素の数のサイズの結果を返します。これは、コンテナのサイズから1つ減算する必要があるすべての要素に正しくアクセスすることを意味します。この仮定が真である場合

ループのための正しいコードは次のとおりです。

for (int i = 0; i < pers.getSize()-1; i++)