2012-04-17 24 views
1

私はC++の初心者ですが、ダイナミックメモリを使っていくつかの基本オブジェクトを作成しようとしています。 メソッドにint引数を渡していますが、グローバル変数の値が変更されています。私は新しいオブジェクトのためにメモリを割り当てる方法と関係があると思います。他の方法でコンパイルすることはできません。Segフォールト - メソッドに変数を渡すとグローバル値が変化する

int main() { 
    int inp; 
    CRectangle rectb (2,2); 
    cout << "enter number of items to add" << endl; 
    cin >> inp; // let's say inp = 7 
    rectb.addItemsArray(inp); 
    cout << "inp after adding items: " << inp << endl; // inp is now 1. 
} 

ヘッダファイル:

class CRectangle { 
    int width; 
    int height; 
    item *items[]; // SOLUTION: change this line to "item *items" 
    int input; 

public: 
     CRectangle (int,int); 
     int addItemsArray(int); 
     int area() { return (width*height); } 
     int get_items(int); 

}; 

- と -

class item { 
    int foo; 
    char bar; 
public: 
    //SOLUTION add "item();" here (a default constructor declaration without arguments) 
    item (int, char); 
    int get_foo(); 
    char get_bar(); 
}; 

方法:

int CRectangle::addItemsArray(int in) { 
    cout << "value of in at begginning:" << in << endl; //in = 7 
    int i; 
    i = 0; 
    //SOLUTION: add "items = new item[in];" on this line. 
    while (i < in) { 
     items[i] = new item(1, 'z'); //SOLUTION: change this line to "items[i] = item(1, 'z');" 
     i++; 
    } 
    cout << "value of in at end " << in << endl; //in = 7 
    return 1; 
} 

は時々私はバスエラーやワンセグ障害を取得します。場合によっては、2または3のような低い数値では期待通りに動作しますが、必ずしもそうではありません。

ご協力いただければ幸いです。

編集(CRectangleのコンストラクタ):

CRectangle::CRectangle (int a, int b) { 
    width = a; 
    height = b; 
} 

(アイテムのコンストラクタ):

/* SOLUTION add default item constuctor 
item::item() { 
    foo = 0; 
    bar = 'a'; 
} 
*/ 

item::item(int arg, char arg2) { 
    foo = arg; 
    bar = arg2; 
} 
+0

を使うのでしょうか? – Erwald

+0

ええ、それは 'items'をどのように初期化するか見る必要があります。 (なぜ、あなたにはこのようなことをする 'vector'のようなものを使用していませんか?) –

+0

クラスの残りのコードがないと、何が間違っているのかを知ることは難しいです。しかし、私の最初の推測はあなたのアイテム配列に関連しています。新しいアイテムへのポインタを記録するスペースを(再)割り当てますか? – atk

答えて

1

あなたがアイテムの配列を作成するのを忘れように見えます...

動的割り当て配列を定義しました(項目* items [100]ではなく項目* items [])。あなたは、配列を使用する前に、アイテムを保持するためのメモリを割り当てる必要があります:

items = new item[100]; 

と最後に

delete [] items; 

でそれを削除することを忘れていけません。 ;)

、代わりの

int i; 
i = 0; 
while (i < in) { 
    items[i] = new item(1, 'z'); 
    i++; 
} 

あなたCrectangleコンストラクタの実装を投稿できる私は

for (int i=0; i<in; i++) 
{ 
    items[i] = new item(1, 'z'); 
} 
+0

「items = new item [100];」を追加しました。 CRectangleコンストラクタに渡しますが、それはコンパイルされません。アイテム宣言に "item * items [100]"を追加すると、実行時にメモリを割り当てようとしています。アレイの過大評価(100)を常に割り当てる必要がありますか? – user1034772

+0

/*** OPに自分のソリューションを編集しました。 *** /それは基本的にあなたのソリューションの修正版、DirkMausFです。 Tx。 – user1034772

4

問題は、あなたがitemsに入れポインタのための任意のストレージが割り当てられていないことです。

std::vector<item*> items; 

item *items[]; 

をし、その後でそれに項目を追加します:私は変更することをお勧め

items.push_back(new item(1, 'z')); 
+0

また、簡単にするために、 'std :: vector items'と' items。push_back(item(1、 'z')); '。 –

+0

ポストに感謝します。文字列とベクトルのような便利なツールを使い始める前に、他のクラスを使わずにネイティブなやり方を学ぶために、ベクトルの使用を避けました。 – user1034772

関連する問題