Форум программистов, компьютерный форум CyberForum.ru

Функция возвращает странное значение - C++

Восстановить пароль Регистрация
 
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
21.03.2014, 01:53     Функция возвращает странное значение #1
Да, понимаю, что скорее всего ошибка глупая, но голова разбитая и найти не могу. Прилагаю полный код. В самом низу будет код основной программы и под ней напишу на какой строчке какая функция возвращает ересь.
P.S. саму функцию полностью дебажил - работает корректно =(
Deque.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#include <iostream>
 
struct Pair {
    int key;
    int prev;
 
    Pair(void) : key(0), prev(0){};
    Pair(int k, int p) : key(k), prev(p){};
    Pair(const Pair& o) : key(o.key), prev(o.prev){};
};
 
struct Node {
    Node* prev;
    Pair data;
    Node* next;
 
    Node() : prev(0), next(0) {};
    Node(Pair d, Node* p = 0, Node* n = 0) :
        prev(p), data(d), next(n) {};
};
 
class Deque {
    public:
        // Конструктори
        Deque() : head(0), tail(0) {};
        ~Deque() { clear(); };
        // типові функції
        void pushFront(int,int);
        void pushBack(int,int);
        Pair& popFront(void);
        Pair& popBack(void);
        bool isNull(void);
        void clear(void);
        // перезавантажений оператор виводу
        friend std::ostream& operator << (std::ostream&, const Deque&);
        // get
        Node* getHead(void);
        Node* getTail(void);
        Node* operator [] (int);
        bool check(int);
    protected:
        Node* head; // вказівник на "голову"
        Node* tail; // вказівник на "хвіст"
    private:
        // блокуємо конструтор копій та оператор присвоєння
        Deque(const Deque&);
        Deque& operator = (const Deque&);
};

Deque.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "stdafx.h"
 
std::ostream& operator << (std::ostream& stream, const Deque& queue)
{
    Node* carriage = queue.head;
    while ( carriage ){
        stream << '<' << carriage->data.key << ','
            << carriage->data.prev << "> ";
        carriage = carriage->next;
    }   return stream;
}
 
bool Deque::isNull(void)
{
    return head ? false : true;
}
 
void Deque::clear(void)
{
    if ( !this->isNull() ) {
        while ( head ) {
            tail = head->next;
            delete head;
            head = tail;
        }   head = tail = 0;
    }
}
 
void Deque::pushFront(int infoKey, int infoPrev)
{
    if ( head ) {
        head = new Node(Pair(infoKey,infoPrev),0,head);
        head->next->prev = head;
    } else
        tail = head = new Node(Pair(infoKey,infoPrev));
}
 
void Deque::pushBack(int infoKey, int infoPrev)
{
    if ( tail ) {
        tail->next = new Node(Pair(infoKey,infoPrev), tail);
        tail = tail->next;
    } else
        tail = head = new Node(Pair(infoKey,infoPrev));
}
 
Pair& Deque::popFront(void)
{
    if ( this->isNull() ) 
        return Pair();
 
    Pair value = head->data;
    if ( head == tail )
        this->clear();
    else {
        head = head->next;
        delete head->prev;
        head->prev = 0;
    }   return value;
}
 
Pair& Deque::popBack(void)
{
    if ( this->isNull() )
        return Pair();
 
    Pair value = tail->data;
    if ( head == tail )
        this->clear();
    else {
        tail = tail->prev;
        delete tail->next;
        tail->next = 0;
    } return value;
}
 
Node* Deque::getHead(void)
{
    return this->head;
}
 
Node* Deque::getTail(void)
{
    return this->tail;
}
 
Node* Deque::operator[] (int index)
{
    Node* carriage = this->head;
    if ( index < 0 ) return carriage;
    while ( carriage ) {
        if ( !(index--) ) return carriage;
        carriage = carriage->next;
    }   return 0;
}
 
bool Deque::check(int k)
{
    if ( this->isNull() ) return false;
    Node* carriage = this->head;
    while ( carriage ) {
        if ( carriage->data.key == k )
                return true;
        carriage = carriage->next;
    }   return false;
}

Graph.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once;
#include "Deque.h"
 
class Graph {
    public:
        Graph() : matrix(0), nsize(0){};
        void fileRead(const char*);
        void fileWrite(const char*);
        Node* buildPath(int, int);
    protected:
        int** matrix;
        int   nsize;
    private:
        
};

Graph.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdafx.h"
 
void Graph::fileRead(const char* filename)
{
    std::ifstream file(filename);
 
    if ( this->matrix ) {
        for ( int i = 0; i < nsize; i++ )
            delete [] matrix[i];
        delete [] matrix;
    }
 
    file >> this->nsize;
 
    this->matrix = new int* [nsize];
    for( int i = 0; i < nsize; i++ ) {
        this->matrix[i] = new int [nsize];
        for ( int j = 0; j < nsize; j++ )
            matrix[i][j] = 0;
    }
 
    int connections; file >> connections;
    for ( int i = 0; i < connections; i++ ) {
        int from, to; 
        file >> from >> to;
        --from; --to;
        this->matrix[from][to] = 1;
        this->matrix[to][from] = 1;
    }
}
 
void Graph::fileWrite(const char* filename)
{
    std::ofstream file(filename);
    for( int i = 0; i < nsize; i++ ) {
        for( int j = 0; j < nsize; j++ )
            file << matrix[i][j] << ' ';
        file << std::endl;
    }
}
 
Node* Graph::buildPath(int from, int to)
{
    Deque queue; from--; to--;
    queue.pushFront(from,-1);
    Node* carriage = queue.getHead();
    while ( carriage ) {
        for ( int i = 0; i < nsize; i++ )
            if ( this->matrix[carriage->data.key][i] )
                if ( i == to ) {
                    queue.pushBack(i, carriage->data.key);
                    return queue.getHead();
                } else if ( !queue.check(i) )
                    queue.pushBack(i, carriage->data.key);
        carriage = carriage->next;
    }   return queue.getHead();
}

Input.txt
Код
9 9
1 7
2 6
3 4
4 5
7 6
6 5
7 8
8 9
9 5

Output.txt
Код
0 0 0 0 0 0 1 0 0 
0 0 0 0 0 1 0 0 0 
0 0 0 1 0 0 0 0 0 
0 0 1 0 1 0 0 0 0 
0 0 0 1 0 1 0 0 1 
0 1 0 0 1 0 1 0 0 
1 0 0 0 0 1 0 1 0 
0 0 0 0 0 0 1 0 1 
0 0 0 0 1 0 0 1 0

Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// GraphLab.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Graph graph;
 
    graph.fileRead("input.txt");
    graph.fileWrite("output.txt");
 
    Node* head = graph.buildPath(8,3);
    while ( head ) {
        cout << '<' << head->data.key << ','
            << head->data.prev << "> ";
        head = head->next;
    }
 
    system( "pause" );
    return 0;
}

Код
Строчка №14.
    Node* head = graph.buildPath(8,3);
Вот здесь и идёт возвращения странного указателя из ада.
Саму функцию дебажил, работает нормально.
Мгновение думал, что проблема в "return queue->getHead();",
    пока не вспомнил, что там одна строчка return this->head;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 01:53     Функция возвращает странное значение
Посмотрите здесь:

Функция не возвращает значение (консолька, си++) C++
C++ Функция get() не возвращает значение
Функция, которая возвращает значение в классе C++
C++ Функция не возвращает значение
C++ Функция, которая только возвращает значение
C++ Функция вычисления среднего значения возвращает странное значение
Функция не возвращает значение C++
Функция не возвращает значение C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2014, 08:09     Функция возвращает странное значение #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Скорее всего, что-то из локально созданного объекта возвращаете (а его уже нет).

Добавлено через 2 минуты
C++
1
2
3
4
5
6
Node* Graph::buildPath(int from, int to)
{
    Deque queue;
    ...
    return queue.getHead();
}
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
21.03.2014, 11:18  [ТС]     Функция возвращает странное значение #3
alsav22, Вы правы
Минут 10 назад нашел решение. Действительно объект был локальный и мой собственноручно написанный деструктор прекрасно затирал все данные
Yandex
Объявления
21.03.2014, 11:18     Функция возвращает странное значение
Ответ Создать тему
Опции темы

Текущее время: 23:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru