154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
1

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

24.11.2014, 04:01. Показов 762. Ответов 14
Метки нет (Все метки)

Здрасьте, приятели по несчастью! У меня проблема. Не спрашивайте зачем мне это надо и почему, просто объясните почему так происходит. У меня есть класс 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);
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2014, 04:01
Ответы с готовыми решениями:

std::vector<T>.push_back(T) - Error
Не пойму в чем дело, но при добавлении (CTextureManager :: load(const char* file)) в вектор –...

Потокобезопасность при одновременном pop_front и push_back std::list
Есть std::list. Поток &quot;потребитель&quot;, если size() &gt; 1 забирает front() и делает pop_front(). Поток...

Теряю ссылку на элемент в std::vector после того, как делаю push_back следующего элемента
Добрый день! Подскажите пожалуйста в чем причина моей ошибки. Сам работал на чистом C++, то есть...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

14
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.11.2014, 04:19 2
Pro100Tom, по этому коду неочевидно. В отладчик смотрели хотя бы на точку вылета?
0
119 / 141 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 05:11 3
Потому что где то используешь выход за границы массива, Пока за границей ничего не находилось все это прокатывало и как то работало, как только добавил еще один вектор, то за границей массива что то появилось и ты стал затирать это место, отсюда уже пошли гарантированные вылеты.
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
24.11.2014, 12:10  [ТС] 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, и всё работает.
0
119 / 141 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
24.11.2014, 12:12 5
Цитата Сообщение от Pro100Tom Посмотреть сообщение
(float(&matrix)[4][4])
А float тут зачем ?
0
Заблокирован
24.11.2014, 12:17 6
Не умеешь отладчиком пользоваться значит. Выкладывай рабочий архив проекта с вылетающим экзепшеном, так и быть - посмотрю.
0
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
24.11.2014, 12:57  [ТС] 7
matrix это имя поля. Структуры матрицы у меня нет, я создал двумерный массив для этого.

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

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

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

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

Добавлено через 5 минут
Нашёл ошибку! Благодарю всех! Блин, ошибка в одном месте, а всплывает хрень какая-то совершенно, казалось бы, не в связанном с местом ошибки месте...
0
3652 / 2989 / 828
Регистрация: 25.03.2012
Сообщений: 11,024
Записей в блоге: 1
24.11.2014, 14:17 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);
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
24.11.2014, 14:37  [ТС] 13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Pro100Tom, а зачем тут ссылки-то понадобились?
Спасибо большое за альтернативу, обязательно протестирую. А без ссылок c++ разве не копирует массив?
0
3254 / 2056 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.11.2014, 14:41 14
Цитата Сообщение от Pro100Tom Посмотреть сообщение
А без ссылок c++ разве не копирует массив?
Нет.
А еще проще - не париться с сишными массивами и использовать вектора.
1
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
24.11.2014, 14:44  [ТС] 15
Спасибо, парни, большое. Многое предстоит изменить, стало быть!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2014, 14:44
Помогаю со студенческими работами здесь

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы....

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Std::vector push_back vs emplace_back
Бывают ли случаи, когда push_back невозможно реализовать через emplace_back, либо такая реализация...


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

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

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