私は最初、私はデバッガへのアクセス権を持っていないと私は私の電卓で、C++進乗算セグメンテーションフォールト
現在、私のエディタとしてnanoを使用していますと言ってみましょう、私はレンガに対して私の頭を叩いています壁(セグメンテーションフォルト)。私は自分の問題点を発見するために私の指針を通そうとしましたが、私の経験/知識の欠如はこれまでのところ私にしかわかりませんでした。私のプログラムでこれまでのことを説明しましょう。現在、私はリンクされたリストに16進数を格納し、それらを一緒に追加することができます。問題は私の乗法から来ています。何とかleftNodeはセグメンテーションフォールトを投げている乗算方法の途中でNULLになっています。私はleftNodeがどの点でNULLになるのだろうかと思っていますか?
乗算方法:乗算に関連
LList Calculator::multiply(LList& left, LList& right) {
LList prodSum;
listnode *leftNode = (left.next());
int zeros = 0;
for(;;) {
if(leftNode == NULL) break;
int lval = leftNode->data;
LList curList;
for(int i = 0; i < zeros; i++) {
curList.insertTail(0);
}
right.reset();
listnode *rightNode = (right.next());
int carry = 0;
while(rightNode != NULL) {
int rval = rightNode->data;
int product = lval * rval + carry;
carry = product/16;
product %= 16;
curList.insertTail(product);
rightNode = (right.next());
}
while(carry) {
curList.insertTail(carry % 16);
carry /= 16;
}
prodSum = *add(prodSum, curList);
leftNode = (left.next()); // eventually causes a segmentation fault
leftNode->data << endl;
++zeros;
}
return prodSum;
}
クラス:ノードをトラバースに関する
class listnode {
public:
element data;
listnode * next;
};
class LList {
private:
listnode * head;
listnode * tail;
listnode * view;
public:
LList();
~LList();
void read();
listnode* next();
void reset();
void print();
void insertTail(element val);
void clean();
element deleteHead();
};
class Calculator {
public:
Calculator();
//inline LList* add(LList& left, LList& right); works
inline LList multiply(LList& left, LList& right);
};
Calculator::Calculator() {
};
他の方法:
listnode* LList::next() {
listnode* temp = view;
if(temp != NULL)
view = view->next;
if(view == NULL) {
}
return temp;
};
void LList::reset() {
view = head;
}
LList::LList(){
head = NULL;
view = NULL;
};
void LList::insertTail(element val) {
listnode * temp;
temp = new listnode;
temp -> data = val;
temp -> next = NULL;
if(head == NULL) {
head = temp;
view = head;
}
else
tail -> next = temp;
tail = temp;
};
void LList::clean() {
while(head != NULL)
deleteHead();
};
element LList::deleteHead() {
listnode * temp;
temp = head;
head = head -> next;
delete temp;
return temp -> data;
};
LList::~LList(){
delete head;
};
どのような問題がありますか?あなたの質問は何ですか? –
なぜ乗算関数でセグメンテーションフォルトが発生しますか? – Aaron
*私はデバッガにアクセスできない* - だから、どうやって簡単なことを書いていますか?あなたは間違いを探すために "あなたの頭の中で"プログラムを実行するつもりですか?あるいは、プログラムを初めて完全に書くことを期待していて、それらをデバッグする必要はありませんか?あなた自身をデバッガにしてください。 – PaulMcKenzie