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

Std push_back сумасшедший! - C++

Восстановить пароль Регистрация
 
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 04:01     Std push_back сумасшедший! #1
Здрасьте, приятели по несчастью! У меня проблема. Не спрашивайте зачем мне это надо и почему, просто объясните почему так происходит. У меня есть класс Model
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
#ifndef MODEL_H
#define MODEL_H
 
#include "string"
#include "string.h"
#include "Vertex.h"
#include "Face.h"
 
#include <vector>
 
using namespace std;
 
class Model
{
public:
    Model();
    Model(std::string name);
    ~Model();
    static void ReadModel(Model& intercepter);
 
    std::vector<Vertex> defaultVertices;
    std::vector<Vertex> transformedVertices;
    
    std::vector<Face> vertexFaces;
    Vertex* normals;
    Face* normalFaces;
    std::string name;
};
 
#endif
В 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
void Model::ReadModel(Model& intercepter)
{
    string line;
    string textureFace;
    char separator;
    char op;
    int vertexCount = 0, faceCount = 0, normalCount = 0;
    ifstream infile(intercepter.name, ifstream::in);
 
    if (!infile.is_open())
    {
        return;
    }
 
    while (!infile.eof())
    {
        getline(infile, line);
        istringstream iss(line, istringstream::in);
        iss >> op;
 
        Vertex tempVertex;
        Face tempVertexFace, tempNormalFace;
 
        if (op == 'v')
        {
            iss >> tempVertex.x >> tempVertex.y >> tempVertex.z;
            tempVertex.w = 1.0f;
 
            intercepter.defaultVertices.push_back(tempVertex);
            intercepter.transformedVertices.push_back(tempVertex);
            
 
            vertexCount++;
        }
        else if (op == 'f')
        {       
            iss >> tempVertexFace.a >> separator >> separator >> tempNormalFace.a
                >> tempVertexFace.b >> separator >> separator >> tempNormalFace.a
                >> tempVertexFace.c >> separator >> separator >> tempNormalFace.a;
 
            intercepter.vertexFaces.push_back(tempVertexFace);
            faceCount++;
        }
    }
    infile.close();
 
    return;
}
Всё работает супер, объект там дальше рендерится и всё здорово. Если я добавляю еще одно поле
C++
1
std::vector<Vertex> finalizedVertices;
а в cpp добавляю строку
C++
1
intercepter.finalizedVertices.push_back(tempVertex);
, то программа через одну две прорисовки. Я даже не использую эти данные, я их просто создал и просто считал и всё! А программа вылетает. Иногда она не вылетает, если я переставлю эти строки местами
C++
1
2
3
intercepter.defaultVertices.push_back(tempVertex);
            intercepter.transformedVertices.push_back(tempVertex);
intercepter.finalizedVertices.push_back(tempVertex);
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.11.2014, 04:19     Std push_back сумасшедший! #2
Pro100Tom, по этому коду неочевидно. В отладчик смотрели хотя бы на точку вылета?
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 05:11     Std push_back сумасшедший! #3
Потому что где то используешь выход за границы массива, Пока за границей ничего не находилось все это прокатывало и как то работало, как только добавил еще один вектор, то за границей массива что то появилось и ты стал затирать это место, отсюда уже пошли гарантированные вылеты.
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 12:10  [ТС]     Std push_back сумасшедший! #4
Вылетает в по-разному, в двух местах.
C++
1
2
3
4
5
while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
а иногда на самой первой строке этой функции
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
float Matrix::CalculateDeterminant(float(&matrix)[4][4])
{
    vector<int> horizontalIndexes = { 1, 2, 3 };
    float det = 0.0f;
 
    for (int j = 0; j < 4; j++)
    {
        if (matrix[0][j] == 0) continue;
 
        vector<int> verticalIndexes = { 0, 1, 2, 3 };
        std::vector<int>::iterator vPosition = std::find(verticalIndexes.begin(), verticalIndexes.end(), j);
        verticalIndexes.erase(vPosition);
 
        float tempMatrix[3][3];
        for (int k = 0; k < 3; k++)
        {
            for (int l = 0; l < 3; l++)
            {
                tempMatrix[k][l] = matrix[horizontalIndexes[k]][verticalIndexes[l]];
            }
        }
 
        int sign = 1;
        if (j % 2 != 0)
            sign = -1;
 
        det += matrix[0][j] * CalculateDeterminant(tempMatrix) * sign;
    }
 
    return det;
}
Если пользуюсь отладчиком, и поставлю breakpoint на эту фунцкию, то никогда не вылетает на ней, всегла вылетает там, где я описал ранее. Если же не ставлю breakpoint, то вылетает тут. Все данные инитиализированы, на ноль не делю.

Добавлено через 2 минуты
Причём, когда этот exception вылетает, я жму continue, он вылетает снова, я снова жму continue, и всё работает.
demmax2004
57 / 135 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 12:12     Std push_back сумасшедший! #5
Цитата Сообщение от Pro100Tom Посмотреть сообщение
(float(&matrix)[4][4])
А float тут зачем ?
-THE_MASTER666-
Заблокирован
24.11.2014, 12:17     Std push_back сумасшедший! #6
Не умеешь отладчиком пользоваться значит. Выкладывай рабочий архив проекта с вылетающим экзепшеном, так и быть - посмотрю.
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 12:57  [ТС]     Std push_back сумасшедший! #7
matrix это имя поля. Структуры матрицы у меня нет, я создал двумерный массив для этого.

Сейчас скину. Там куча ненужных функций пока что и повторы есть. У меня две версии, одна работает как надо, но надо функционал добавить. Так думал, как добавлю, то удалю всё ненужное.

Большое спасибо за помощь. Только у меня есть одна просьба, если поменяете что-нибудь, то дайте знать, я реально хотел бы понять где затупил.
Подумал, что лучше скину и вторую версию тоже, где всё работает. Только придётся по внешним ссылкам скачивать https://drive.google.com/file/d/0B1E...ew?usp=sharing
https://drive.google.com/file/d/0B1E...ew?usp=sharing

Добавлено через 2 минуты
А как отладчиком-то пользоваться тогда? Что я упускаю?

Добавлено через 13 минут
Что-то с методом FinalizeVertices не так...
-THE_MASTER666-
Заблокирован
24.11.2014, 13:23     Std push_back сумасшедший! #8
Ну что тут не так то? Заяц крутится, всё работает
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 13:26  [ТС]     Std push_back сумасшедший! #9
Это медведь! Ты другой открой, я две ссылки скинул.
-THE_MASTER666-
Заблокирован
24.11.2014, 13:52     Std push_back сумасшедший! #10
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Это медведь!
а..ну да
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Ты другой открой, я две ссылки скинул.
Открыл, у тебя там попытка чтения не существующего элемента вектора, то есть ты вылез за баундари кондишен))
Почему так - разбирайся сам. Ну это ошибка рантайма релизного, в если запускать дебаггером сразу, у тебя тут бред полнейший написан и там тоже экзепшены:
C++
1
void Matrix::CalculateMatrixInverse(float(&inputMatrix)[4][4], float(&outputMatrix)[4][4])
что ты эти вообще пытался сказать? Что ты пытаешься в функции таким способом передать?
Миниатюры
Std push_back сумасшедший!  
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 14:08  [ТС]     Std push_back сумасшедший! #11
Почему бред? Там куча функций просто есть, которые мне надо убрать, как только разберёмся вот с этой ерундой. Я передаю два референса к двум матрицам, одна из них input, другую буду использовать как output. Вторая матрица будет являться инверсией первой. Я бы return matrix[4][4] сделал, да нельзя массив возвращать.

Добавлено через 5 минут
Нашёл ошибку! Благодарю всех! Блин, ошибка в одном месте, а всплывает хрень какая-то совершенно, казалось бы, не в связанном с местом ошибки месте...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
24.11.2014, 14:17     Std push_back сумасшедший! #12
Pro100Tom, а зачем тут ссылки-то понадобились?

Добавлено через 2 минуты
C++
1
2
3
4
void Matrix::CalculateMatrixInverse(const float inputMatrix[][], float outputMatrix[][]){}
float a[4][4]={...};
float a_1[4][4];
CalculateMatrixInverse(a, a_1);
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 14:37  [ТС]     Std push_back сумасшедший! #13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Pro100Tom, а зачем тут ссылки-то понадобились?
Спасибо большое за альтернативу, обязательно протестирую. А без ссылок c++ разве не копирует массив?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.11.2014, 14:41     Std push_back сумасшедший! #14
Цитата Сообщение от Pro100Tom Посмотреть сообщение
А без ссылок c++ разве не копирует массив?
Нет.
А еще проще - не париться с сишными массивами и использовать вектора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 14:44     Std push_back сумасшедший!
Еще ссылки по теме:

C++ Стандартный поток и STL (std::copy to std::cout)
Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}' C++
C++ Теряю ссылку на элемент в std::vector после того, как делаю push_back следующего элемента

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

Или воспользуйтесь поиском по форуму:
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
24.11.2014, 14:44  [ТС]     Std push_back сумасшедший! #15
Спасибо, парни, большое. Многое предстоит изменить, стало быть!
Yandex
Объявления
24.11.2014, 14:44     Std push_back сумасшедший!
Ответ Создать тему
Опции темы

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