Как использовать бесконечное количество структур для параметра функции?
Я пишу очень простой экспортер OBJ на C++ (для VC6, поскольку я пишу для старого проекта, который компилируется только там).
Прямо сейчас я застрял в поисках того, как использовать бесконечное количество структур для создания линии положения вершин. Это может показаться немного глупым, но это моя первая работающая программа, написанная на C++, поэтому я не очень хорошо разбираюсь в концепциях.
Я предполагаю, что делаю это неправильно, поскольку в Интернете я ничего не могу найти о том, что я пытаюсь сделать.
Вот структурный код моего заголовка:
struct PointList {
float X;
float Y;
float Z;
};
..и фактический код функции экспорта OBJ:
void OBJEXP::WriteOBJ(OBJEXP::PointList Points, std::string File) // Writes an OBJ.
{
ofstream output(File + ".obj");
for (int i = 0; i < sizeof(Points); i += 1)
{
output << "v " + to_string(Points.X) + " " + to_string(Points.Y) + " " + to_string(Points.Z) + "\n";
}
output.close();
cout << "All done\n";
}
Мой основной файл (предназначен для тестирования кода, в противном случае он будет запускаться каждый раз, когда я сохраню файл :)
OBJEXP::PointList POINTZ;
int main()
{
POINTZ.X = 1.0f;
POINTZ.Y = 5.5f;
POINTZ.Z = 2.0f;
OBJEXP::WriteOBJ(POINTZ, "testobject");
std::cout << "Execution done\n";
}
Мой файл OBJ выглядит так:
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
v 1.000000 5.500000 2.000000
что явно не очень правильно.
2 ответа
Несмотря на то, что вы используете старый компилятор, формат .OBJ не включает количество вершин / УФ / нормалей / граней перед списком.
Вы должны прочитать файл дважды: сначала для подсчета количества появившихся вершин / УФ / нормалей / граней, а затем еще раз для анализа фактических значений.
Современный компилятор делает это тривиальным с использованием
std::string
,
std::stringstream
и
std::vector
. Использование строк, массивов и FILE* в стиле C сделало бы это кошмаром.
Я предпочитаю использовать вектор: D
void OBJEXP::WriteOBJ(std::vector<OBJEXP::PointList> Points, std::string File) {
ofstream output(File + ".obj");
for (int i = 0; i < Points.size(); i += 1) {
output << "v " + to_string(Points[i].X) + " " + to_string(Points[i].Y) + " " + to_string(Points[i].Z) + "\n";
}
output.close();
cout << "All done\n";
}
основной код:
OBJEXP::PointList POINTZ;
int main() {
POINTZ.X = 1.0f;
POINTZ.Y = 5.5f;
POINTZ.Z = 2.0f;
std::vector tmp;
tmp.push_back(POINTZ);
OBJEXP::WriteOBJ(tmp, "testobject");
}