Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для ELchemist
2 / 2 / 0
Регистрация: 14.03.2018
Сообщений: 51

Program received signal SIGSEGV, Segmentation fault

29.12.2020, 15:30. Показов 2315. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Странная ошибка в Vector& operator*(const Vector&) const. Функция выполняется, потому что выводится в консоли "114 114 1". Но программа крашится в с кодом ошибки 0xc0000005.
Скопировал код программы и прогнал его через онлайн-компилятор. Там вывода в консоль не произошло вообще.
Прогнал код через отладчик. Выполнение останавливается на 42 строке с сигналом "Program received signal SIGSEGV, Segmentation fault"
P.S. Да, функция умножения вектора на вектор возвращает неизмененную копию вектора. Просто я решил проверить, что внутри нее происходит. Но ведь не в этом же ошибка?

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <string>
#include <cmath>
 
class Vector {
    public:
        Vector(float, float, float);
        Vector(float, float);
        Vector(float);
        Vector();
        Vector(const Vector&);
        ~Vector();
 
        Vector& operator=(const Vector&);
        float operator[](const int) const;
        float& operator[](const int);
        Vector& operator+=(const Vector&);
        Vector& operator-=(const Vector&);
        Vector& operator+(const Vector&) const;
        Vector& operator-(const Vector&) const;
        Vector& operator*(const Vector&) const;
        Vector& operator*=(const float);
        Vector& operator/=(const float);
        Vector& operator*(const float) const;
        Vector& operator/(const float) const;
 
        void print() const;
        void invert();
    private:
        float x, y, z;
};
 
Vector::Vector(float ex_x, float ex_y, float ex_z) :
    x(ex_x), y(ex_y), z(ex_z) {}
Vector::Vector(float ex_x, float ex_y) :
    Vector(ex_x, ex_y, 0) {}
Vector::Vector(float ex_x) :
    Vector(ex_x, 0) {}
Vector::Vector(void) :
    Vector(0) {}
Vector::Vector(const Vector& ex) :
    Vector(ex.x, ex.y, ex.z) {}
Vector::~Vector(void) {}
 
Vector& Vector::operator=(const Vector& ex) {
    x = ex.x; y = ex.y; z = ex.z;
    return *this;
}
float Vector::operator[](const int coord) const {
    switch (coord%3) {
        case 0:  return x;
        case 1:  return y;
        default: return z;
    }
}
float& Vector::operator[](const int coord) {
    switch (coord%3) {
        case 0:  return x;
        case 1:  return y;
        default: return z;
    }
}
Vector& Vector::operator+=(const Vector& ex) {
    x += ex.x; y += ex.y; z += ex.z;
    return *this;
}
Vector& Vector::operator-=(const Vector& ex) {
    x -= ex.x; y -= ex.y; z -= ex.z;
    return *this;
}
Vector& Vector::operator+(const Vector& ex) const {
    Vector in = *this;
    return in += ex;
}
Vector& Vector::operator-(const Vector& ex) const {
    Vector in = *this;
    return in -= ex;
}
Vector& Vector::operator*(const Vector& ex) const {
    Vector in = *this;
    float exp2 = std::sqrt(in[0]*in[0] + in[1]*in[1] + in[2]*in[2]) * std::sqrt(ex[0]*ex[0] + ex[1]*ex[1] + ex[2]*ex[2]);
    if (exp2==0) return in;
    float exp1 = in[0]*ex[0] + in[1]*ex[1] + in[2]*ex[2];
    float angle = exp1/exp2;
    std::cout << exp1 << " " << exp2 << " " << angle << std::endl;
    return in; // TODO
}
Vector& Vector::operator*=(const float ex) {
    x *= ex; y *= ex; z *= ex;
    return *this;
}
Vector& Vector::operator/=(const float ex) {
    x /= ex; y /= ex; z /= ex;
    return *this;
}
Vector& Vector::operator*(const float ex) const {
    Vector in = *this;
    return in *= ex;
}
Vector& Vector::operator/(const float ex) const {
    Vector in = *this;
    return in /= ex;
}
 
void Vector::print(void) const {
    std::cout << "{" << x << ", " << y << ", " << z << "}" << std::endl;
}
void Vector::invert(void) {
    x = -x; y = -y; z = -z;
}
 
Vector& operator*(const float f, const Vector& v) {
    Vector in = v;
    return in *= f;
}
 
 
 
int main() {
    Vector v2(2, 3.0, 5);
    Vector v1 = 3*v2;
    Vector v3 = v1*v2;
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2020, 15:30
Ответы с готовыми решениями:

Program received signal SIGSEGV, Segmentation fault
Ошибка в классе &quot;TotalOfAll&quot;. Помогите пожалуйста, объясните в чём ошибка и как это исправить. В инете искал, вроде какая-та ошибка с...

Program received signal sigsegv
Здравствуйте, я писал код для метода Квайна и столкнулся с такой проблемой program received signal sigsegv segmentation fault При запуске...

Ошибка SIGSEGV(Segmentation fault)
Задание такое: Реализовать вычисления условных арифметических выражений c одномерными динамическими векторами, которые содержат...

5
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
29.12.2020, 15:34
Лучший ответ Сообщение было отмечено ELchemist как решение

Решение

Цитата Сообщение от ELchemist Посмотреть сообщение
Странная ошибка в Vector& operator*(const Vector&) const. Функция выполняется, потому что выводится в консоли "114 114 1". Но программа крашится в с кодом ошибки 0xc0000005.
Цитата Сообщение от ELchemist Посмотреть сообщение
Vector& Vector::operator*(const Vector& ex) const {
Ссылку убери Vector Vector::operator*

Добавлено через 1 минуту
В других операторах тоже, ты пытаешься вернуть ссылку на локальный объект
C++
1
2
3
4
5
6
7
Vector& operator+(const Vector&) const;
        Vector operator-(const Vector&) const;
        Vector operator*(const Vector&) const;
        Vector& operator*=(const float);
        Vector& operator/=(const float);
        Vector operator*(const float) const;
        Vector operator/(const float) const;
1
 Аватар для ELchemist
2 / 2 / 0
Регистрация: 14.03.2018
Сообщений: 51
29.12.2020, 15:35  [ТС]
Да. Это сработало. Но почему из-за ссылки возникала ошибка?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
29.12.2020, 15:38
Цитата Сообщение от ELchemist Посмотреть сообщение
Да. Это сработало. Но почему из-за ссылки возникала ошибка?
Ты возвращаешь ссылку на in, который будет уничтожен сразу при выходе из метода

Добавлено через 2 минуты
Все константные операторы должны возвращать объект по-значению. Неконстантные, которые возвращают *this - ссылку
1
 Аватар для ELchemist
2 / 2 / 0
Регистрация: 14.03.2018
Сообщений: 51
29.12.2020, 15:39  [ТС]
Хм... А когда я использовал операторы + и -, то они корректно работали. Вот этот код в главной функции работает правильно и ошибок не выдает
C++
1
2
3
4
    Vector v2(2, 3.0, 5);
    Vector v1 = 3*v2;
    Vector v3 = v1+v2;
    v3.print();
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
29.12.2020, 15:40
Цитата Сообщение от ELchemist Посмотреть сообщение
Хм... А когда я использовал операторы + и -, то они корректно работали. Вот этот код в главной функции работает правильно и ошибок не выдает
Просто повезло
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2020, 15:40
Помогаю со студенческими работами здесь

SIGSEGV (Segmentation fault) в матричном калькуляторе по непонятной причине
Здравствуйте! Начал изучать Си++ на примере написания матричного калькулятора, но при запуске прога крашится(ошибка в названии темы). Не...

Signal 11 (SIGSEGV)
То ли я дурак, то ли лыжи не едут. Во время тестирования, прога проходит 6 тестов, на 7-ом возникает Run-time error с доп.информацией...

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

Segmentation fault
При выводе второго объекта на экран объекте, вылетает с ошибкой. segmentation fault(core dumped). #include &lt;iostream&gt; using...

Segmentation fault
Всем привет. Пишу быдлокод для лабы в универе. Мне по определенному алгоритму необходимо получить из одного поколения особей, новое. ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru