【发布时间】:2016-05-01 21:06:41
【问题描述】:
首先让我说我无权使用调试器,我使用 Nano 作为我的编辑器
目前,我的计算器正在用头撞砖墙(分段错误)。我试图通过我的指针来发现我的问题是什么,但我缺乏经验/知识只让我到目前为止。让我解释一下到目前为止我的程序中的工作原理。目前,我能够将十六进制数字存储在链表中并将它们加在一起。问题来自我的乘法方法。在乘法方法中,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;
};
【问题讨论】:
-
什么问题?你有什么问题?
-
为什么我的乘法函数出现分段错误?
-
我无权使用调试器 -- 那么你将如何写一些重要的东西呢?您是否要“在脑海中”运行程序来查找错误?或者您是否希望第一次就可以完美地编写程序,并且永远不需要调试它们?给自己一个调试器。
-
你不是已经问过这个了吗? stackoverflow.com/questions/36961466/…
-
@Xarotic 因为你至少有一个错误。创建minimal reproducible example 的过程可能会帮助您找到它;这肯定会引出一个更好的问题。
标签: c++ linked-list segmentation-fault calculator