具有相同名称的结构化绑定
Structured bindings with the same names
我正在编写一些 OpenGL 应用程序,无论如何。在一个地方,我决定使用结构化绑定,因为它可以节省我大量的输入。在这里:
for (auto row = 0; row < N - 1; ++row) {
for (auto col = 0; col < N - 1; ++col) {
//glColor3f(colors[row][col].R, colors[row][col].G, colors[row][col].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row][col].x, points[row][col].y, points[row][col].z);
//glColor3f(colors[row + 1][col].R, colors[row + 1][col].G, colors[row + 1][col].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row + 1][col].x, points[row + 1][col].y, points[row + 1][col].z);
//glColor3f(colors[row][col + 1].R, colors[row][col + 1].G, colors[row][col + 1].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row][col + 1].x, points[row][col + 1].y, points[row][col + 1].z);
}
}
现在的问题是,第一次绑定(使用 normal_points[row][col]
)时效果很好。但是当我为 normal_points[row+1][col]
执行此操作时,我得到的数字是相同的。但在 normal_points
二维数组中它们不是。证明:
所以在 Watch 1
选项卡中你可以看到在数组中这些值不同,但是当我从第一个断点跳到第二个断点时,xu, xv
等的值没有不改变。我该如何解决?是因为我使用相同的名字吗?如果是这样,我不能使用相同的名称吗? (因为我有第二个循环,就像这个循环一样,它确实可以节省大量输入并提供可读性)
抱歉,我很惊讶你的代码可以编译。
您在同一范围内写 三次 次
auto[xu, xv, yu, yv, zu, zv] = <something>;
因此,您在同一范围内定义了 三次 次相同的变量。
建议:使用不同的名称
auto [xu1, xv1, yu1, yv1, zu1, zv1] = normal_points[row][col];
// ...
auto [xu2, xv2, yu2, yv2, zu2, zv2] = normal_points[row+1][col];
// ...
auto [xu3, xv3, yu3, yv3, zu3, zv3] = normal_points[row][col+1];
或者使用三个不同的范围
for (auto col = 0; col < N - 1; ++col)
{
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col];
// ...
}
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
// ...
}
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
// ...
}
}
我正在编写一些 OpenGL 应用程序,无论如何。在一个地方,我决定使用结构化绑定,因为它可以节省我大量的输入。在这里:
for (auto row = 0; row < N - 1; ++row) {
for (auto col = 0; col < N - 1; ++col) {
//glColor3f(colors[row][col].R, colors[row][col].G, colors[row][col].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row][col].x, points[row][col].y, points[row][col].z);
//glColor3f(colors[row + 1][col].R, colors[row + 1][col].G, colors[row + 1][col].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row + 1][col].x, points[row + 1][col].y, points[row + 1][col].z);
//glColor3f(colors[row][col + 1].R, colors[row][col + 1].G, colors[row][col + 1].B);
auto[xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
factor = std::sqrt((yu * zv - zu * yv) + (zu * xv - xu * zv) + (xu * yv - yu * xv));
glNormal3f((yu * zv - zu * yv) / factor, (zu * xv - xu * zv) / factor, (xu * yv - yu * xv) / factor);
glVertex3f(points[row][col + 1].x, points[row][col + 1].y, points[row][col + 1].z);
}
}
现在的问题是,第一次绑定(使用 normal_points[row][col]
)时效果很好。但是当我为 normal_points[row+1][col]
执行此操作时,我得到的数字是相同的。但在 normal_points
二维数组中它们不是。证明:
所以在 Watch 1
选项卡中你可以看到在数组中这些值不同,但是当我从第一个断点跳到第二个断点时,xu, xv
等的值没有不改变。我该如何解决?是因为我使用相同的名字吗?如果是这样,我不能使用相同的名称吗? (因为我有第二个循环,就像这个循环一样,它确实可以节省大量输入并提供可读性)
抱歉,我很惊讶你的代码可以编译。
您在同一范围内写 三次 次
auto[xu, xv, yu, yv, zu, zv] = <something>;
因此,您在同一范围内定义了 三次 次相同的变量。
建议:使用不同的名称
auto [xu1, xv1, yu1, yv1, zu1, zv1] = normal_points[row][col];
// ...
auto [xu2, xv2, yu2, yv2, zu2, zv2] = normal_points[row+1][col];
// ...
auto [xu3, xv3, yu3, yv3, zu3, zv3] = normal_points[row][col+1];
或者使用三个不同的范围
for (auto col = 0; col < N - 1; ++col)
{
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col];
// ...
}
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row+1][col];
// ...
}
{
auto [xu, xv, yu, yv, zu, zv] = normal_points[row][col+1];
// ...
}
}