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

Переподнение стека при запуске программы. - C++

Восстановить пароль Регистрация
 
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 10:21     Переподнение стека при запуске программы. #1
СОбственно вот такой код:
graf.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef grafH
#define grafH
 class graf {
   private:
    int numVerw;
    int* tops;
    int** svyazi;
   public:
    graf(int _numVerw);
    ~graf();
    void getLink(int link, int i, int j);
    int returnLink(int i, int j);
 };
#endif
graf.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
#include <iostream.h>
#include <stdio.h>
#include "graf.h"
//Инициализация
graf::graf(int _numVerw):
   numVerw(_numVerw)
{
   tops = new int[numVerw];
      for (int i = 0; i < numVerw; i++){
       tops[i] = i + 1;
    }
   svyazi = new int* [numVerw];
   for (int i = 0; i < numVerw; i++){
       svyazi[i] = new int [numVerw];
    }
 
}
//Destructor
graf::~graf()
{
  delete[] tops;
  tops = NULL;
  delete[] svyazi;
  svyazi = NULL;
}
//Заполнение массива описывающего ребра графа
void graf::getLink(int link, int i, int j){
   svyazi[i][j] = svyazi[j][i] = link;
}
//Возврат ребра
int graf::returnLink(int i, int j){
  return svyazi[i][j];
}
Основной файл
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
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include "graf.h"
#include "graf.cpp"
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
        graf* Gr = new graf(3);
        for (int i = 0; i < 3; i++){
           for (int j = i; j < 3; j++){
            int link = 0;
            cout << "Enter link value for rebro: " << i + 1 << " " << j + 1 <<
            " and " << j + 1 << " " << i + 1 <<  endl;
            cin >> link;
            Gr->getLink(link, i, j);
           }
        }
        
        getch;
        Gr->~graf();
        return 0;
}
При попытке запустить основной файл выскакивает окно с примерно таким сообщением
Project raised expeption class EStackOverflow with message 'Stack Overflow'
Подскажите что сделал неправильно? Накосячил похоже с памятью но где именно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2011, 10:21     Переподнение стека при запуске программы.
Посмотрите здесь:

C++ ошибка при запуске программы
Ошибка при запуске отладки программы C++
C++ Ошибка при запуске программы
Ошибка при запуске программы C++
C++ Ошибка при запуске программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2011, 14:08     Переподнение стека при запуске программы. #2
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
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
#ifndef grafH
#define grafH
 
class graf
{
private:
    int numVerw;
    int** svyazi;
public:
    graf(int _numVerw);
    ~graf();
    void getLink(int link, int i, int j);
    int returnLink(int i, int j);
};
#endif
 
//Инициализация
graf::graf(int _numVerw) : numVerw(_numVerw)
{
    svyazi = new int* [numVerw];
    for (int i = 0; i < numVerw; i++){
        svyazi[i] = new int [numVerw];
    }
}
//Destructor
graf::~graf()
{
    for (size_t i = 0; i < numVerw; ++i)
        delete[] svyazi[i];
    delete[] svyazi;
    svyazi = NULL;
}
//Заполнение массива описывающего ребра графа
void graf::getLink(int link, int i, int j)
{
    svyazi[i][j] = svyazi[j][i] = link;
}
//Возврат ребра
int graf::returnLink(int i, int j)
{
    return svyazi[i][j];
}
 
int main(int argc, char* argv[])
{
    graf Gr(3);
    for (int i = 0; i < 3; i++)
    {
        for (int j = i; j < 3; j++)
        {
            int link = 0;
            cout << "Enter link value for rebro: " << i + 1 << " " << j + 1 <<
                " and " << j + 1 << " " << i + 1 <<  endl;
            cin >> link;
            Gr.getLink(link, i, j);
        }
    }
    cin.get();
    return 0;
}
все у вас нормально в программе. Удалил только указатель *tops, т.к. она нигде не используется.
и вот еще ошибочка одна - при удалении двумерного массива, надо сначало освободить память из под каждого указателя в цикле, а потом уже удалять указатель на массив указателей (посмотримте как я написал в деструкторе).
И явно вызывать деструктор в конце программы не надо. Он автоматически вызываетсся при удалении объекта
Если еще вопросы есть - слушаю
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 14:24  [ТС]     Переподнение стека при запуске программы. #3
sandye51, ну первый вопрос это что такое size_t в деструкторе и почему используется ++i вместо i++.
И второе если все нормально, то почему она вылетала то у меня?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2011, 14:31     Переподнение стека при запуске программы. #4
Woody-krsk, size_t это беззнаковое целое, в каком то из стандартных .h он определяется так
C++
1
#define unsigned int size_t
++i или i++ в данном случае неважно. просто мне нравится больше ++i

никаких ошибок в коде, которые могли привести к переполнению стека - нет, попробуй запусти еще раз. Должно быть все нормально.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
02.01.2011, 14:33     Переподнение стека при запуске программы. #5
size_t это тоже самое что unsigned int, в деструкторе без разницы ++i или i++
разница есть, допустим когда y = ++i или y = i++
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 14:45  [ТС]     Переподнение стека при запуске программы. #6
sandye51, сейчас вроде стало нормально запускаться, теперь возник вопрос вот тут
C++
1
2
3
4
5
6
7
do {
            int i, j = 0;
            cout << "Enter name of rebro" << endl;
            cin >> i;
            cin >> j;
            cout << Gr->returnLink(i,j) << endl;
        } while(1);
На бесконечный цикл не обращайте внимания. Короче проблема: если ввести изначально занчения вот такими
11 = 0
12/21 = 1
13/31 = 1
22 = 0
23/32 = 1
33 = 0
то он мне вываливает значения
11 = 0
12 = 1
13 = 12
21 = 1
22 = 0
23 = 41449
А если ввести что то начиная с 3 то программа вылетает с сообщением
Переподнение стека при запуске программы.
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 15:00  [ТС]     Переподнение стека при запуске программы. #7
Понял что надо вот так
C++
1
2
3
4
int graf::returnLink(int i, int j)
{
        return svyazi[i - 1][j - 1];
}
Сделал, попытался запустить и вуаля
Переподнение стека при запуске программы.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2011, 15:34     Переподнение стека при запуске программы. #8
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
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
#ifndef grafH
#define grafH
 
class graf
{
private:
    int numVerw;
    int** svyazi;
public:
    graf(int _numVerw);
    ~graf();
    void getLink(int link, int i, int j);
    int returnLink(int i, int j);
    void PrintLink();
};
#endif
 
//Инициализация
graf::graf(int _numVerw) : numVerw(_numVerw)
{
    svyazi = new int* [numVerw];
    for (int i = 0; i < numVerw; i++){
        svyazi[i] = new int [numVerw];
    }
}
//Destructor
graf::~graf()
{
    for (size_t i = 0; i < numVerw; ++i)
        delete[] svyazi[i];
    delete[] svyazi;
    svyazi = NULL;
}
//Заполнение массива описывающего ребра графа
void graf::getLink(int link, int i, int j)
{
    svyazi[i][j] = svyazi[j][i] = link;
}
//Возврат ребра
int graf::returnLink(int i, int j)
{
    return svyazi[i][j];
}
 
void graf::PrintLink()
{
    for (size_t i = 0; i < 3; ++i)
        for (size_t j = 0; j < 3; ++j)
            cout << "[" << i + 1 << "][" << j + 1 << "]" << returnLink(i, j) << endl;
}
 
int main(int argc, char* argv[])
{
    graf Gr(3);
    for (int i = 0; i < 3; i++)
    {
        for (int j = i; j < 3; j++)
        {
            int link = 0;
            cout << "Enter link value for rebro: " << i + 1 << " " << j + 1 <<
                " and " << j + 1 << " " << i + 1 <<  endl;
            cin >> link;
            Gr.getLink(link, i, j);
        }
    }
    cin.get();
    Gr.PrintLink();
    cin.get();
    return 0;
}
написал отдельный метод для вывода
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 20:11  [ТС]     Переподнение стека при запуске программы. #9
sandye51, понимаешь, дело не в этом, а в том что он мне валит ошибку про переполнение мне это никому не сдавать, делаю для себя чтобы научиться и не получается, причем похоже не по моей вине.
Мля как задолбало уже биться как рыба об лед из-за того что среда криво работает
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
02.01.2011, 20:17     Переподнение стека при запуске программы. #10
Woody-krsk, а в голову не приходит использовать другую среду?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2011, 22:03     Переподнение стека при запуске программы.
Еще ссылки по теме:

Ошибка при запуске программы C++
C++ Ошибка при запуске программы
Ошибка при запуске программы C++

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

Или воспользуйтесь поиском по форуму:
Woody-krsk
1 / 1 / 0
Регистрация: 20.12.2010
Сообщений: 62
02.01.2011, 22:03  [ТС]     Переподнение стека при запуске программы. #11
sandye51, приходит... Но хочу взять лицензионную по msdn, так что надо ждать конца выходных.
Yandex
Объявления
02.01.2011, 22:03     Переподнение стека при запуске программы.
Ответ Создать тему
Опции темы

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