Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
1

Segmentation fault

07.02.2015, 21:31. Показов 1580. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Есть 2 класса.
object
C++
1
2
3
4
5
6
7
8
9
10
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
Имеет 2 метода. Первый записывает указатель на функцию, второй вызывает функцию по указателю.
Objects
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
Имеет тоже 2 метода. Первый записывает адресс обекта в массив, второй вызывает метод call у всех обектов адресса которых записаны в массив.
Код целиком:
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
#include <iostream>
using namespace std;
 
class object{
    void (*f)(object*);
public:
    void setFunc(void (*func)(object*)){
        f = func;
    }
    void callFunc(){
        f(this);
    }
};
 
class Objects{
    object **mass;
public:
    int size;
    Objects(){
        size = 0;
        mass = new object*[size];
    }
    void addObject(object *ob){
        mass[size++] = ob;
    }
    void callFuncs(){
        for(int c=0;c<size;c++){
            mass[c]->callFunc();
        }
    }
};
 
void out(object *o){
    cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size<<endl;
    Main.callFuncs();
    return 0;
}
Если в цикле поставить число меньше 5(4 например) то ошибка не возникает.
Вопрос:
Почему возникает ошибка?
Как исправить?
Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2015, 21:31
Ответы с готовыми решениями:

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы strcmp, strcpy. выводит...

Segmentation fault
Кусок кода: template &lt;typename Type&gt; class Queue { private: struct Elem ...

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str......

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw...

8
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 21:46 2
Для начала. Создали массив размером ноль элементов.
Цитата Сообщение от YR17 Посмотреть сообщение
size = 0;
mass = new object*[size];
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
07.02.2015, 21:46 3
C++
1
2
        size = 0;
        mass = new object*[size];
Ошибка тут.
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 21:54  [ТС] 4
А как правильно?
size инкремируется при добавлении елемента
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:01 5
но массив не увеличивается. Или реаллокацию делайте или на вектор замените массив.
или статический массив указателей используйте.
C++
1
object *mass[100];
1
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 4
07.02.2015, 22:05  [ТС] 6
Можно пример реаллокации?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2015, 22:12 7
Лучший ответ Сообщение было отмечено YR17 как решение

Решение

да вы замучаетесь, доводя это до рабочего варианта. конструкторы копий еще надо, деструктор, оператор =. и все это есть в std::vector. найдите список его методов и пользуйтесь. он уже все реаллоцирует что надо и удаляет и копирует.

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
#include <iostream>
#include <vector>
 
using namespace std;
 
class object
{
  void (*f)(object*);
public:
  void setFunc(void (*func)(object*))
  {
    f = func;
  }
 
  void callFunc()
  {
    f(this);
  }
};
 
class Objects
{
  std::vector<object*> mass;
 
public:
  unsigned size() const
  {
    return mass.size();
  }
 
  void addObject(object *obj)
  {
    mass.push_back(obj);
  }
 
  void callFuncs() const
  {
    for (auto obj : mass)
    {
      obj->callFunc();
    }
  }
};
 
void out(object *o)
{
  cout<<o<<endl;
}
 
int main(){
    Objects Main;
    object *n;
    for(int c=0;c<5;c++){
        n = new object;
        n->setFunc(out);
        Main.addObject(n);
    }
    cout<<Main.size()<<endl;
    Main.callFuncs();
    return 0;
}
0
Заблокирован
07.02.2015, 22:14 8
YR17, лучше добавьте поле capacity, которое будет отвечать за максимальное число элементов в контейнере.
C++
1
2
3
size = 0;
capacity = 100;
mass = new object* [ capacity ];
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
07.02.2015, 22:25 9
Цитата Сообщение от YR17 Посмотреть сообщение
Можно пример реаллокации?
что то типа этого, но лучше так не делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void Realloc(size_t newsize)
    {
        object **newmass = new object *[newsize];
        for (size_t i = 0; i < size; i++)
        {
            newmass[i] = mass[i];
        }
        size = newsize;
        delete[] mass;
        mass = newmass;
    }
    void addObject(object *ob)
    {
        Realloc(size + 1);
        mass[size - 1] = ob;
    }
0
07.02.2015, 22:25
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2015, 22:25
Помогаю со студенческими работами здесь

Segmentation fault
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL}; Пробую: char ** a; a...

Segmentation fault
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine,...

Segmentation fault
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача...

Segmentation fault :(
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{ int id; char name;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетных компьютеров началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
Как определить, содержит ли строка подстроку в JavaScript
InfoMaster 19.01.2025
При разработке веб-приложений часто возникает необходимость выполнять различные операции со строками, среди которых особое место занимает поиск подстрок. JavaScript предоставляет несколько встроенных. . .
Что такое метаклассы в Python
InfoMaster 19.01.2025
Метаклассы в Python представляют собой один из самых мощных и одновременно сложных механизмов языка, позволяющий программистам контролировать процесс создания классов. По своей сути, метакласс. . .
Как удалить свойство из объекта JavaScript
InfoMaster 19.01.2025
В современной веб-разработке объекты JavaScript играют фундаментальную роль в организации и структурировании данных. Они представляют собой контейнеры, которые хранят связанные данные и. . .
Какая разница между String и string в C#
InfoMaster 19.01.2025
В языке программирования C# существует интересная особенность: для работы со строками можно использовать как String, так и string. Эта двойственность часто вызывает вопросы у разработчиков, особенно. . .
Как в Git откатить репозиторий к предыдущему коммиту
InfoMaster 19.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, предоставляя разработчикам мощные инструменты для управления изменениями в. . .
Как работают замыкания (closure) в JavaScript
InfoMaster 19.01.2025
В мире современной веб-разработки замыкания (closures) представляют собой один из фундаментальных концептов языка JavaScript, который часто вызывает затруднения у начинающих разработчиков, но при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru