私は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;
}
を使うのでしょうか? – Erwald
ええ、それは 'items'をどのように初期化するか見る必要があります。 (なぜ、あなたにはこのようなことをする 'vector'のようなものを使用していませんか?) –
クラスの残りのコードがないと、何が間違っているのかを知ることは難しいです。しかし、私の最初の推測はあなたのアイテム配列に関連しています。新しいアイテムへのポインタを記録するスペースを(再)割り当てますか? – atk