Вернуть массив объектов из функции C?

Я хотел бы знать, как вернуть массив объектов из функции 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);

Вы можете вернуть массив из функции, но не можете разместить его в стеке, как показывает ваш пример. Вы должны выделить его в куче.

Jeff Holt 24.07.2024 17:14

Единственный способ вернуть массив из функции — встроить его в структуру. 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

pmg 24.07.2024 17:20

Вы не можете вернуть массив из функции. Вы можете выделить данные и вернуть указатель на первый элемент или вернуть структуру, содержащую массив, но не вернуть массив.

William Pursell 24.07.2024 17:22

Этот вопрос похож на: Возврат массива с помощью C. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему. Кроме того, что сказал @pmg: Что-то вроде typedef struct { SDL_Vertex vertices[3]; } VertexTriplet; может помочь вам - и вы можете вернуть его из своей функции.

einpoklum 24.07.2024 17:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы хотите 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] таким образом (с '='). И это выражение было ожидаемым. Я дам вам знать, если у меня получится.

spots 727 24.07.2024 18:24

Как я уже сказал, gcc выдает мне эту ошибку: «ошибка: ожидаемое выражение перед токеном '{'». Я не знаю почему, не могли бы вы мне помочь? Это происходит здесь: " треугольникVertex[0] = { "

spots 727 24.07.2024 19:32

В названии параметров была опечатка (ошибка есть и в выложенном вами коде, я скопировал ее, не проверяя). Кроме того, похоже, что в некоторых версиях вам нужно привести агрегат при назначении. Смотрите демо . Обновил мой ответ, пожалуйста, дайте мне знать, если это помогло.

wohlstad 24.07.2024 19:55

Все сработало, как и ожидалось, большое спасибо!

spots 727 24.07.2024 21:59

Другие вопросы по теме