【问题标题】:How do I use an infinite amount of structs for a function's parameter?如何为函数的参数使用无限数量的结构?
【发布时间】:2021-05-19 23:35:55
【问题描述】:

我正在用 C++ 编写一个非常简单的 OBJ 导出器(对于 VC6,因为我正在编写一个只能在那里编译的旧项目。)

现在,我一直在研究如何使用无限数量的结构来制作顶点位置线。这听起来可能有点傻,但这是我用 C++ 编写的第一个功能程序,所以我不太了解这些概念。

我假设我做错了,因为在 Internet 上找不到任何关于我正在尝试做的事情。

这是我的标头结构代码:

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

这显然不是很正确。

【问题讨论】:

  • 确实知道infinite不是一个数字,对吧?
  • PointList 不是一个好名字,因为它不是任何东西的列表。考虑将其重命名为 Point 并使用 std::vector&lt;Point&gt; 作为它们的集合。
  • 请注意,MSVC 6.0 是在 1998 中发布的。它是 C++ 的一个古老版本(可能甚至不符合 C++98,更不用说该标准的任何更新版本了)。
  • 您不能在计算机程序中使用 无限 数量的任何东西。另一方面,可以为无限无限数量的东西设计程序。也就是说,任何限制都是由程序之外的因素(例如有限的内存)设置的。
  • 老实说,我不确定你想在这里做什么。 for 循环正在迭代sizeof(Points) 次,这将是结构占用的字节数。 3(浮点数)x 4(每个浮点数的字节数)= 12,这是程序输出的行数。但当然,每次它都会输出相同的 X、Y 和 Z。

标签: c++ visual-c++-6


【解决方案1】:

尽管您使用的是古代编译器,但 .OBJ 的格式不包括列表前的顶点/UV/法线/面数。

您必须读取该文件两次:首先计算出现的顶点/uvs/法线/面的数量,然后再次解析实际值。

现代编译器使用std::stringstd::stringstreamstd::vector 使这变得微不足道。使用 C 风格的字符串、数组和 FILE* 会使这成为一场噩梦。

【讨论】:

    【解决方案2】:

    我更喜欢使用矢量 :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");
    }
    

    【讨论】:

    • MSVC 6 是否支持 STL?它是在 C++98 标准最终确定之前发布的,这并不能阻止它获得支持,但也不保证它。
    • 是的,当时它已经完全实现了 STL。 std::vector tmp; 似乎是一个错字,最好使用 const std::vector&lt;OBJEXP::PointList&gt;&amp; Points 作为函数参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多