С Новым годом! Форум программистов, компьютерный форум, киберфорум C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.06.2018
Сообщений: 3
1

Ошибка std::stof()

01.12.2018, 19:18. Показов 3882. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день/утро/вечер/ночь! Пишу приложение на С++ с ипользованием OpenGL и FreeGLUT, открывающее *.obj файлы. Почитал специализацию файлов данного формата, разбил файл на строки, проверил, с какого символа начинается каждая строка. При отображении вершин модели(точнее, при трансформации строки в значение типа float) никаких проблем с использованием stof() не возникало. Но как только я попытался воплотить в жизнь отображение полигонов на экране, в Виндовской консольке появился такой текст:
Код
terminated called after throwing an instance of 'std::invalid_argument'
    what():   stof
Исходный код прилагаю:
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <Gl\glut.h>
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <typeinfo>
using namespace std;
 
class Vertex{
public:
    Vertex(float ix, float iy, float iz){
        x = ix;
        y = iy;
        z = iz;
    }
    
    float getX(){
        return x;
    }
    float getY(){
        return y;
    }
    float getZ(){
        return z;
    }
    
private:
    float x;
    float y;
    float z;
};
 
class Face{
public:
    Face(vector<int> numbers){
        
    }
     
private:
    vector<Vertex> Face_Vertices;
};
 
class ModelReader{
public:
    vector<Vertex> Vertices;
    vector<Face> Faces;
    
    ModelReader(string name){
        string line;
        ifstream model(name);
        
        if (model.is_open()) {
            
            while(getline(model, line)) {
                line += ' ';
                
                string buff;
                vector<float> coords = {};
                vector<int> points;
                
                if (line.substr(0, 2) == "v ") {
                    line.erase(0, 2);
                    for (int v = 0; v < line.size(); v++) {
                        if (line[v] != ' ') {
                            buff += line[v];
                        } else {
                            float num = stof(buff);
                            coords.push_back(num);
                            buff = "";
                        }
                    }
                    Vertices.push_back(Vertex(coords[0], coords[1], coords[2]));
                } else if (line.substr(0, 2) == "f ") {
                    cout << line << endl;
                    line.erase(0, 2);
                    cout << line << endl << endl;
                    
                    for (int i = 0; i < line.size(); i++) {
                        if (line[i] != ' ') {
                            buff += line[i];
                        } else {
                            cout << buff << endl;
                            points.push_back(stof(buff));
                            buff = "";
                        }
                    }
                    
                    for (int f = 0; f < points.size(); f++){
                        cout << endl << points[f] << ' ' << typeid(points[f]).name();
                    }
                }
            }
        }
    }
};
 
ModelReader reader("cow.obj");
 
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    
    glLoadIdentity();
    glTranslatef(-1.0, -2.0, -10.0f);
    glScalef(0.004, 0.004, 0.004);
    
    glColor3f(1, 1, 1);
    glBegin(GL_POINTS);
    for (int q = 0; q < reader.Vertices.size(); q++) {
        glVertex3f(reader.Vertices[q].getX(), reader.Vertices[q].getY(), reader.Vertices[q].getZ());
    }
    glEnd();
    
    glutSwapBuffers();
}
 
void reshape(GLsizei width, GLsizei height) {
    
    if (height == 0) height = 1;
    GLfloat aspect = (GLfloat)width / (GLfloat)height;
    
    glViewport(0, 0, width, height);
    
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    
    gluPerspective(45.0f, aspect, 0.1f, 100.0f);
}
 
void initGL() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
 
void timer(int = 0) {
    glutPostRedisplay();
    glutTimerFunc(17, timer, 0);
}
 
void registration() {
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    initGL();
    timer();
}
 
 
 
int main(int argc, char** argv) {
    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(10, 10);
    glutCreateWindow("Model");
    
    registration();
    
    glutMainLoop();
    
    return 0;
}
Использую Dev-C++ 5.11 вкупе с TDM-GCC 4.9.2 64-bit
В настройках компилятора прописана строка
Код
-std=c++11
Разобраться, почему при записи координат вершин модели никакой проблемы не возникает, а при записи номеров вершин полигона оная имеется, я не могу. Прошу помощи, а заодно и критики относительно моего кода у Знатаков)
Заранее спасибо!)

P.S. При тестах в другом проекте абсолютно те же самые значения аргумента функции stof() никаких ошибок не выдавали.
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
#include <iostream>
#include <string>
#include <vector>
#include <typeinfo>
using namespace std;
 
string str = "f 350/1754 342/1715 212/1000";
 
vector<int> nums;
 
int main(int argc, char** argv) {
    cout << str << endl;
    str.erase(0, 2);
    str += ' ';
    cout << str << endl << endl;
    
    string buff;
    
    for (int i = 0; i < str.size(); i++) {
        if (str[i] != ' ') {
            buff += str[i];
        } else {
            cout << buff << endl;
            nums.push_back(stof(buff));
            buff = "";
        }
    }
    
    for (int f = 0; f < nums.size(); f++){
        cout << endl << nums[f] << ' ' << typeid(nums[f]).name();
    }
    
    return 0;
}
Вывод:
Код
f 350/1754 342/1715 212/1000
350/1754 342/1715 212/1000

350/1754
342/1715
212/1000

350 i
342 i
212 i
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2018, 19:18
Ответы с готовыми решениями:

std::string, std::fstream, ошибка кучи
где то начало вылетать при операции += с локальной переменной std::string. Заменил на свой qString....

Не могу разобраться как обновить в std::map<std::string, вектор_структур>
Не могу разобраться как обновить вектор структур после его добавления в map без удаления и...

Ошибка "неопределенная ссылка" при работе с std::thread
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . ...

Как проинициализировать std::stack<const int> obj ( std::stack<int>{} );
добрый день. вопрос в коде: http://rextester.com/VCVVML6656 #include &lt;iostream&gt; #include...

0
01.12.2018, 19:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2018, 19:18
Помогаю со студенческими работами здесь

std::filesystem && std::asio и пр
Пытался найти хоть какие-то сроки включения всего этого в стандарт (так же ожидается lexical_cast,...

Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>...
Есть двухмерный вектор: std::vector&lt;std::vector&lt;TRabbitCell&gt; &gt; *cells(5, 10); Пытаюсь...

Перевод строк std::string, std::wstring в Unicode (String)
Собственно столкнулся с проблемой, как корректно перевести к примеру текст из Edit1-&gt;Text в...

Ошибка Ambiguity between std::abs(int) and abs(int)
Есть вот такой пример из учебника #include &lt;conio.h&gt; #include &lt;iostream.h&gt; int abs(int x); //...


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

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