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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
#1

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

21.03.2014, 01:53. Просмотров 320. Ответов 2
Метки нет (Все метки)

Да, понимаю, что скорее всего ошибка глупая, но голова разбитая и найти не могу. Прилагаю полный код. В самом низу будет код основной программы и под ней напишу на какой строчке какая функция возвращает ересь.
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++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;memory.h&gt; using namespace std; int maximum(int *mass, int n) //Функция...

Функция не возвращает значение - C++
Функция ничего не возвращает: int Return(int s) { return s; } Передаю в аргумент S целочисленную переменную, но результата в...

Функция не возвращает значение - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int ca(int a) { int i,r; r = 0; ...

Функция get() не возвращает значение - C++
Есть класс, в котором определен объект типа SDL_Surface*. Пытаюсь передать его в сторонний класс с помощью метода getScreen(), но он по...

Функция не возвращает значение - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include &quot;stdafx.h&quot; using namespace std; const int max_size = 100; ...

Функция не возвращает значение (консолька, си++) - C++
Функция не возвращает значение, но указывает по какому if'у она прошла. Почему не рассчитывается/передается result? #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 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 назад нашел решение. Действительно объект был локальный и мой собственноручно написанный деструктор прекрасно затирал все данные
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 11:18
Привет! Вот еще темы с ответами:

Почему функция не возвращает значение? - C++
По заданию из учебника, нужно написать небольшую поисковую систему, используя все полученные знания. Вот написал такую программу, но...

Функция неправильно возвращает значение - C++
double SparseMatrix::get(int i, int j)const { if (rows != nullptr &amp;&amp; cols != nullptr) { return rows-&gt;value; } return 0; ...

Функция возвращает неверное значение - C++
Здравствуйте. Подскажите, пожалуйста, почему одна из двух функций возвращает неверное значение, хотя по алгоритму работы они схожи и...

Функция которая возвращает значение и цикл - C++
Задача функции: Ввод прекращается при наполнении массива либо когда пользователь вводит нечисловое значение и возвращает действительное...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru