0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 12
1

Программа не выполняется до конца

20.12.2022, 18:45. Показов 802. Ответов 10

Author24 — интернет-сервис помощи студентам
Есть программа, написанная на с++, компилирую с помощью g++. Проблема в том, что она не выполняется до конца, то есть в функции main из 8 методов dirDot выполняется 3 или (о чудо) 5. Причем никаких ошибок не выводит. Конкретно проблема в компиляции под винду, так как когда тот же код компилируется под линукс, то программа исправно работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "cam.h"
#include "plane.h"
 
float v[] = {1.57, 1.57};
cam a(vec(0,0,0), v, vec(0, 0, 0));
 
int main(){
    vec H0(0,0,0);
    H0= a.dirDot(vec(3,0.4,0.4));
    H0= a.dirDot(vec(3,-0.6,0.4));
    H0= a.dirDot(vec(4,0.4,0.4));
    H0= a.dirDot(vec(4,-0.6,0.4));
    H0= a.dirDot(vec(3,0.4,1));
    H0= a.dirDot(vec(3,-0.6,1));
    H0= a.dirDot(vec(4,0.4,1));
    H0= a.dirDot(vec(4,-0.6,1));
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2022, 18:45
Ответы с готовыми решениями:

Программа со сверхбольшими числами не выполняется до конца
Сам код #include "verylong.h" void verylong::putvl()const { char temp ;...

Ошибка на этапе выполнения при том, что программа выполняется до конца
Есть матрица с заданным кол-вом столбцов и строк, которую надо сдвинуть, на выбор, во все 4...

Программа не выполняется до конца. В чем причина?
Здравствуйте, составил программу для нахождения корня функции. При небольшом количестве итераций...

запрос на sql не выполняется до конца, хотя программа работает
Он не выводит страну...вот у Сидорова должна быть Россия void __fastcall...

Не выполняется до конца
program lab01; const e=0.0001; var x,y,z,f,p,c,T,h:real; begin x:=1; ...

10
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,335
20.12.2022, 19:06 2
SERVELAZ, нужно весь код приложить, по обрезку непонятно
0
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 12
20.12.2022, 20:14  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void matrix::swp(char c, int i, int j){
    switch (c) {
        case 'c':
            for(int k = 0; k < n; k++){
                std::swap(cont[k][i], cont[k][j]);
            }
            break;
        case 'r':
            for(int k = 0; k < n; k++){
                std::swap(cont[i][k], cont[j][k]);
            }
            break;
    }
    ech = false;
}
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
void matrix::to_echelon(bool ex, float *x){
    for(int i = 0, j = 0; j < n-1; i++, j++){
        bool e = true;
        for(int k = j; k < n; k++){
            if(get(k, i)!=0){
                if(k!=j){
                    swp('r', k, j);
                    if(ex){
                        std::swap(x[k], x[j]);
                    }
                }
                e = false;
                break;
            }
        }
        if(e){
            i--;
            continue;
        }
        for(int k = i+1; k < n; k++){
            float q = -get(j, k)/get(j, i);
            add_to('r', k, i, q);
            if(ex){
                x[k] += q*x[i];
            }
        }
    }
    ech = true;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
void matrix::Gauss(float *x, float *out){
    if(!ech){
        to_echelon(true, x);
    }
    for(int i = n-1; i > -1; i--){
        float S = x[i];
        for(int j = i+1; j < n; j++){
            S -= out[j]*get(j, i);
        }
        out[i] = S/get(i, i);
    }
}
interetion - матрица 3 порядка
a, b, c, d - коэффициенты в каноническом уравнении плоскости
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vec plane::proj(vec M){
    if(a == 0 && b == 0){
        return vec(M.getValue('x'), M.getValue('y'), 0);
    }
    if(a == 0 && c == 0){
        return vec(M.getValue('x'), 0, M.getValue('z'));
    }
    if(b == 0 && c == 0){
        return vec(0, M.getValue('y'), M.getValue('z'));
    }
    float X[] = {-(M.getValue('y')*a - M.getValue('x')*b), -(M.getValue('z')*a-M.getValue('x')*c), -d};
    vec ret = vec(0, 0, 0);
    float out[3];
    interation.Gauss(X, out);
    char crds[] = "xyz";
    for(int i = 0; i < 3; i++){
        ret.setValue(crds[i], out[i]);
    }
    return ret;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
vec vec::getProjPos(vec o, vec a, vec b){
    vec O(0, 0, 0);
    char crds[] = "xyz";
    float p = 0;
    for(int i = 0; i < 3; i++){
      p+=a.getValue(crds[i])*(o.getValue(crds[i]) - b.getValue(crds[i]));
    }
    p /= a.getValue('v');
    for(int i = 0; i < 3; i++){
      O.setValue(crds[i], o.getValue(crds[i]) - p * a.getValue(crds[i])/a.getValue('v'));
    }
    return O;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
vec cam::dirDot(vec a){
    float v = vec::getProjPos(pos, vec('x', aoi), a).getValue('v');
    vec hy = y.proj(a);
    vec hx = x.proj(a);
    vec dx(a.getValue('x')-hy.getValue('x'),
            a.getValue('y')-hy.getValue('y'),
            a.getValue('z')-hy.getValue('z'));
    vec dy(a.getValue('x')-hx.getValue('x'),
            a.getValue('y')-hx.getValue('y'),
            a.getValue('z')-hx.getValue('z'));
    return vec(dx.getValue('v')/v*tan(aov[0]), dy.getValue('v')/v*tan(aov[1]), v/dis);
}
0
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
21.12.2022, 08:16 4
SERVELAZ, а в отладчике
Как пользоваться отладчиком (в Visual Studio)
пробовали посмотреть?
1
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
21.12.2022, 09:35 5
Цитата Сообщение от SERVELAZ Посмотреть сообщение
Проблема в том, что она не выполняется до конца, то есть в функции main из 8 методов dirDot выполняется 3 или (о чудо) 5.
Это вы как определили? Я не вижу в приведенных вами огрызках кода никакого наблюдаемого поведения.
0
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 12
24.12.2022, 09:42  [ТС] 6
Запустил отладку в Visual Studio. На моменте инициализации матрицы вызывается исключение
Вызвано исключение по адресу 0x00007FF640ED32F1 в ConsoleApplication1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.

C++
1
2
3
4
5
6
7
8
matrix(int _n) : n(_n) {
        init_cont();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cont[i][j] = 0;//Здесь вызывается исключение
            }
        }
    }
0
27 / 59 / 32
Регистрация: 06.08.2020
Сообщений: 215
24.12.2022, 10:18 7
Лучший ответ Сообщение было отмечено SERVELAZ как решение

Решение

cont - это что-то глобальное? В любом случае, судя по ошибке, оно не правильно инициировалось и произошёл выход за границы выделенной памяти. Если, конечно, она вообще выделялась.
1
Модератор
Эксперт С++
13504 / 10755 / 6410
Регистрация: 18.12.2011
Сообщений: 28,707
24.12.2022, 10:58 8
PencilTorch, скорее cont - это член класса matrix,
в котором не выполнено правило трех:
Распространенные ошибки
SERVELAZ, проверьте, наличие копиконструктора, деструктора и operator=
и проследите в отладчике правильность их выполнения.
1
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 12
24.12.2022, 14:58  [ТС] 9
cont - это изначально указатель на указатель на float(хотел сделать двумерный массив), и инициализация в функции init_cont была такой:
C++
1
2
3
4
5
6
void init_cont() {
        cont = (float**)malloc(n);
        for (int i = 0; i < n; i++) {
            cont[i] = (float*)malloc(n);
        }
    }
Но я понял, что инициализировать таким образом такая себе идея, по этому cont я переделал в просто указатель на float, а инициализацию изменил на следующую:
C++
1
2
3
void init_cont() {
        cont = new float[n*n];
    }
И теперь нет никаких ошибок

Добавлено через 3 минуты
Все таки поспешно я изменил код, инициализацию cont можно было просто немного исправить
C++
1
2
3
4
5
6
void init_cont() {
        cont = new float *[n];
        for (int i = 0; i < n; i++) {
            cont[i] = new float[n];
        }
    }
0
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,335
24.12.2022, 15:04 10
SERVELAZ, в malloc указывается количество байтов, а не элементов

а вот в new - верно, количество элементов
1
0 / 0 / 0
Регистрация: 23.08.2019
Сообщений: 12
24.12.2022, 15:14  [ТС] 11
Когда я это писал, я забыл, что нужно умножать на количество байтов на переменную
0
24.12.2022, 15:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2022, 15:14
Помогаю со студенческими работами здесь

Написанная функция не выполняется до конца
Доброго всем дня, вечера ну и т.д. Столкнулся с проблемой которую не могу решить, хотя...

Не до конца выполняется стандартный обмен с сайтом
Здравствуйте! Подскажите пожалуйста, выполняю стандартный обмен с сайтом (выгружаю товары, цены и...

cURL в цикле. Не до конца выполняется цикл
почему данный код выводит страницу только 22 раза из 76?&lt;?php $start = microtime(true);...

Стек потока выполняется не до конца, переключается на mine
Есть функция: fun initUserTracks() { userTracks = mutableListOf() ...

Ввод выполняется не до конца, а вывод входит в бесконечный цикл
Здравствуйте! Помогите с решением проблемы, уже всю голову сломал, не могу понять где ошибка....

Почему не выполняется до конца код в обработчике события Load?
программа запускается без ошибок private void Form1_Load(object sender, EventArgs e) { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru