Как использовать бесконечное количество структур для параметра функции?

Я пишу очень простой экспортер 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");
}
Другие вопросы по тегам