Я новичок в C++ и хотел бы добиться следующего:
ttgl::vec3f positions[] = {
ttgl::vec3f(-1.0f, 1.0f, 0.0f),
ttgl::vec3f(1.0f, 1.0f, 0.0f),
ttgl::vec3f(1.0f, -1.0f, 0.0f),
ttgl::vec3f(1.0f, -1.0f, 0.0f),
ttgl::vec3f(-1.0f, -1.0f, 0.0f),
ttgl::vec3f(-1.0f, 1.0f, 0.0f),
};
Проблема в том, что я не знаю значений и должен динамически заполнять этот массив.
Я пытаюсь добиться этого с помощью следующей функции:
void getCirclePositions(GLfloat radius, GLint sides) {
ttgl::vec3f center = ttgl::vec3f(0.0f, 0.0f, 0.0f);
GLfloat angle = (2.0f * M_PI) / sides;
ttgl::vec3f positions[100];
positions[0] = center;
for (int i = 1; i <= sides; i++) {
GLfloat angleFan = angle * (i + 1);
GLfloat xCoordinate = radius * cos(angleFan);
GLfloat yCoordinate = radius * sin(angleFan);
ttgl::vec3f point = ttgl::vec3f(xCoordinate, yCoordinate, 0.0f);
positions[i] = point;
}
return positions;
};
Это приводит к следующей ошибке:
Run-Time Check Failure #2 - Stack around the variable 'positions' was
corrupted.
Как мне правильно вставить значения?
РЕДАКТИРОВАТЬ
Функция вызывается следующим образом:
getCirclePositions(1.0f, 100);
Я отредактировал код соответствующим образом, и ошибка решена. Спасибо за это.
void getCirclePositions(GLfloat radius, GLint sides) {
ttgl::vec3f center = ttgl::vec3f(0.0f, 0.0f, 0.0f);
GLfloat angle = (2.0f * M_PI) / sides;
ttgl::vec3f positions[100];
positions[0] = center;
for (int i = 1; i < sides; i++) {
GLfloat angleFan = angle * (i + 1);
GLfloat xCoordinate = radius * cos(angleFan);
GLfloat yCoordinate = radius * sin(angleFan);
ttgl::vec3f point = ttgl::vec3f(xCoordinate, yCoordinate, 0.0f);
positions[i] = point;
}
for (int i = 0; i >sides; i++) {
std::cout << positions[i];
}
};
Как мне распечатать этот массив?
sides
> = 100?
Похоже, вы используете индексирование на основе единицы, но массивы C++ используют индексацию на основе нуля.
@FredLarson positions[0]
назначается до цикла в positions[0] = center;
.
@ FrançoisAndrieux: Достаточно справедливо. Но в for (int i = 1; i <= sides; i++)
, если sides == 100
, он выходит за пределы массива.
@FredLarson Это правда, но мы не знаем, что такое sides
. То же самое будет верно и для i < sides
, хотя стороны ограничены до менее 101. Поскольку кажется, что OP хранит как центр круга, так и положение каждой вершины, использованной для его рисования, в одном и том же массиве, ожидается, что positions
будет нужны элементы n+1
, чтобы нарисовать круг, состоящий из линий n
(линии n
плюс центр). В этом случае цикл for
для перебора положений вершин будет от 1
до n
включительно, а не от традиционного 0
до n-1
включительно.
Все сводится к тому, что на этот вопрос нельзя ответить без минимальный воспроизводимый пример, поэтому я проголосовал за закрытие.
Использовать значения
std::vector<ttgl::vec3f>
иpush_back
(илиemplace_back
)?