#c #linux #output #cout
#c #linux #вывод #cout
Вопрос:
Это для моей лабораторной работы, которая заключается в создании простой очереди с использованием C .
#include "Task5.h"
#include <iostream>
using namespace std;
void push(const long amp;i, node* amp;n) {
if (n == NULL) {
node *ptr = new node;
ptr -> item = i;
ptr -> next = NULL;
n = ptr;
cout << "Created New Node." << endl;
}
else {
node *ptr = n;
cout << "Created Pointer" << endl;
while (ptr -> next != NULL){
cout << "Finding Next..." << endl;
ptr = ptr -> next;
}
cout << "I'm here." << endl;
node *temp = new node;
temp -> item = i;
ptr -> next = temp;
cout << "Node Created." << endl;
}
}
long pop(node* amp;n) {
if (n == NULL) cout << "HEY!!! Can't pop an empty queue." << endl;
else {
long val;
node *ptr = n;
n = n -> next;
val = ptr -> item;
delete ptr;
return val;
}
}
int main() {
node *head = NULL;
push(13,head);
push(10,head);
push(18,head);
push(22,head);
cout << pop(head) << endl;
cout << pop(head) << endl;
cout << pop(head) << endl;
cout << pop(head) << endl;
cout << pop(head) << endl;
cout << pop(head) << endl;
}
Это дает следующий результат:
Created New Node. Created Pointer I'm Here. Node Created. Created Pointer Finding Next... I'm here. Node Created. Created Pointer Finding Next... Finding Next... I'm here. Node Created. 13 10 18 22 HEY!!! Can't pop an empty queue. 6296192 HEY!!! Can't pop an empty queue. 6296192
Таким образом, конечным результатом является то, что код работает, ОДНАКО он выдает 6296192 случайным образом. Я подумал, может быть, я что-то неправильно написал или cout преобразует endl; в hex. Мой преподаватель лаборатории также понятия не имеет, что происходит. Может кто-нибудь сказать мне, что происходит? Если это поможет, я запускаю этот код через терминал запуска Linux.
Заранее спасибо.
Комментарии:
1. Вопрос: Какое значение возвращает pop () при попытке открыть пустую очередь?
2. Включите предупреждения вашего компилятора и / или перестаньте игнорировать предупреждение, которое сообщает вам что-то о том, что «не все пути управления возвращают значение» в вашей
pop
функции. Это было бы первым признаком того, что там что-то может быть не так. Я надеюсь, что «преподаватель лаборатории также понятия не имеет», на самом деле не соответствует действительности, и они знали , но хотели, чтобы вы нашли это самостоятельно. Если нет, возьмите почти все, что они вам дают, за то, чего это стоит (что, вероятно, будет не так много).3. @NathanOliver в силу неразрешимости проблемы с остановкой, это так.
4. @Quentin Я удалил комментарий, поскольку понял, что здесь выдается только предупреждение. Я не думаю, что это связано с проблемой остановки, поскольку каждый проверяет, возвращаются ли все пути выхода.
5. @NathanOliver это было слишком сложно. Просто определение того,
foo() { bar(); }
должно ли вызывать предупреждение, требует знания того,bar
останавливается ли.
Ответ №1:
В вашей функции:
long pop(node* amp;n) {
вы ничего не возвращаете в случае, если n == NULL
является true. Итак, это UB, и он также может вызывать такие случайные значения на выходе.
Комментарии:
1. Ах, это имеет смысл. Спасибо. Я знал, что это что-то глупое XD
Ответ №2:
Я бы предложил использовать отладчик с точкой останова в первом cout << pop(head) << endl;
и каждый раз просматривать значение, возвращаемое из pop.
Также компилятор, вероятно, выдает вам предупреждение о причине проблемы, всегда обращайте внимание на предупреждения, обычно это означает, что произойдет что-то непредвиденное.
cout << pop(head) << endl;
Использует значение, возвращаемое pop()
, но в случае пустой очереди значение не возвращается, что приводит к неопределенному поведению.