Я хотел бы знать, как вернуть массив объектов из функции C.
Вот пример:
SDL_Vertex initTriangle (struct Point2D point1, struct Point2D point2, struct Point2D point3) {
SDL_Vertex triangleVertex[3]=
{
{
{ new_point1.x,new_point1.y },
{ 255, 255, 0, 0xFF },
{ 0.f, 0.f }
},
{
{ new_point2.x, new_point2.y },
{ 0,255,255, 0xFF },
{ 0.f, 0.f }
},
{
{ new_point3.x, new_point3.y },
{ 255,0,255, 0xFF },
{ 0.f, 0.f }
}
};
return triangleVertex;
};
SDL_Vertex triangleVertex[3] = initTriangle(...);
SDL_RenderGeometry(renderer, NULL, triangleVertex, 3, NULL, 0);
Я хотел бы сделать что-то подобное, но мне нужно, чтобы функция возвращала объект, как если бы я делал это:
SDL_Vertex triangleVertex[3]=
{
{
{ new_point1.x,new_point1.y },
{ 255, 255, 0, 0xFF },
{ 0.f, 0.f }
},
{
{ new_point2.x, new_point2.y },
{ 0,255,255, 0xFF },
{ 0.f, 0.f }
},
{
{ new_point3.x, new_point3.y },
{ 255,0,255, 0xFF },
{ 0.f, 0.f }
}
};
SDL_RenderGeometry(renderer, NULL, triangleVertex, 3, NULL, 0);
Единственный способ вернуть массив из функции — встроить его в структуру. struct EmbedArray { int a[10]; }; struct EmbedArray foo(int init) { struct EmbedArray ret; for (int i = 0; i < 10; i++) ret.a[i] = init; return ret; }
см. ideone.com/Xu0Iyn
Вы не можете вернуть массив из функции. Вы можете выделить данные и вернуть указатель на первый элемент или вернуть структуру, содержащую массив, но не вернуть массив.
Этот вопрос похож на: Возврат массива с помощью C. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему. Кроме того, что сказал @pmg: Что-то вроде typedef struct { SDL_Vertex vertices[3]; } VertexTriplet;
может помочь вам - и вы можете вернуть его из своей функции.
Похоже, вы хотите initTriangle
вернуть массив из 3 SDL_Vertex
.
Вы не можете вернуть массив таким образом (по значению) из функции C.
Одним из решений было бы принять его как параметр и заполнить его в функции:
void initTriangle (struct Point2D new_point1,
struct Point2D new_point2,
struct Point2D new_point3,
SDL_Vertex triangleVertex[3]) // <- add this parameter
{
// Fill the array passed in:
triangleVertex[0] =
(SDL_Vertex) // This cast might be needed
{
{ new_point1.x,new_point1.y },
{ 255, 255, 0, 0xFF },
{ 0.f, 0.f }
};
triangleVertex[1] =
(SDL_Vertex) // This cast might be needed
{
{ new_point2.x, new_point2.y },
{ 0,255,255, 0xFF },
{ 0.f, 0.f }
};
triangleVertex[2] =
(SDL_Vertex) // This cast might be needed
{
{ new_point3.x, new_point3.y },
{ 255,0,255, 0xFF },
{ 0.f, 0.f }
};
};
Пример использования (массив вызывающего объекта передается в качестве последнего аргумента):
SDL_Vertex myTriangleVertex[3];
initTriangle(..., myTriangleVertex);
Другая альтернатива — разместить массив внутри функции в куче и вернуть его. Но для этого вызывающему объекту потребуется не забыть освободить массив, чтобы избежать утечки памяти.
Третий вариант — встроить массив в структуру, после чего вы сможете вернуть его из функции.
Но в данном случае я бы выбрал первое предложенное мной решение (по крайней мере, по умолчанию), поскольку оно является самым простым.
Спасибо большое, попробую. Думаю, я уже пробовал это раньше, но gcc говорил мне, что я не могу выделить треугольникVertex[0] таким образом (с '='). И это выражение было ожидаемым. Я дам вам знать, если у меня получится.
Как я уже сказал, gcc выдает мне эту ошибку: «ошибка: ожидаемое выражение перед токеном '{'». Я не знаю почему, не могли бы вы мне помочь? Это происходит здесь: " треугольникVertex[0] = { "
В названии параметров была опечатка (ошибка есть и в выложенном вами коде, я скопировал ее, не проверяя). Кроме того, похоже, что в некоторых версиях вам нужно привести агрегат при назначении. Смотрите демо . Обновил мой ответ, пожалуйста, дайте мне знать, если это помогло.
Все сработало, как и ожидалось, большое спасибо!
Вы можете вернуть массив из функции, но не можете разместить его в стеке, как показывает ваш пример. Вы должны выделить его в куче.