2015-03-25 6 views
1

Я пытаюсь реализовать структуру vec3 в C. У меня есть работа, но не обязательно, как я хочу. Текущий код, который у меня есть, ниже.C vec3 Struct Implementation

typedef struct vec3 { 
    float x, y, z; 
} vec3; 

struct vec3 newvec3(float x, float y, float z) { 
    struct vec3 *values = malloc(sizeof(struct vec3)); 

    values->x = x; 
    values->y = y; 
    values->z = z; 
    return *values; 
} 

Чтобы объявить структуру, мне нужно написать.

vec3 test = newvec3(0.0, 1.0, 0.4); 

Что я хочу.

vec3 test = vec3(0.0, 1.0, 0.4); 

или что-то подобное. Мне было интересно, есть ли способ сделать это. Благодарю.

+0

новыйvec3 сделать память утечка. Также использовать C++. – BLUEPIXY

+0

yikes, это очень плохо. Вы получаете утечку памяти каждый раз, когда вы создаете новый vec3. Как правило, это делается, просто объявляя структуру, а затем вручную устанавливая ее элементы. 'vec3 test; test.x = 0.0; test.y = 1.0; test.z = 0.4'. Вы также можете использовать тот факт, что структуры смежны в памяти, устанавливая его равным массиву '{x, y, z}' – mklingen

+0

Вы выделяете память, которую вы тогда эффективно отбрасываете: структура возвращается по значению и доступ к утерянному указателю. Это утечка памяти. –

ответ

3

Использование

vec3 test = {0.0, 1.0, 0.4}; 
+1

Такое простое исправление, которое я просмотрел. Спасибо за ваш комментарий. – TJGreen

1

Ближайший вы можете получить в C с использованием имени типа как конструктор использовать соединение буквального:

vec3 test = (vec3){ 0.0, 1.0, 0.4 }; 

Это, конечно, канавы тело функции, чтобы вы не имеют реальной возможности делать что-либо за пределами установленных значений (он также не выделяет динамическое хранилище, вам придется делать это отдельно). Это дает вам несколько дополнительных функций, которые приятно иметь, хотя (автоматически обнуляет поля, короче для сложных структур и т. Д.).

C имеет несколько пространств имен (то есть несколько способов интерпретировать одно и то же слово), но они выделены ключевыми словами (например, struct или enum), или они являются основным «общим» пространством. После того, как вы напечатаете typedef, вы поместите его в «общее» пространство, используя значение этого имени, чтобы оно также не могло быть присвоено функции. Там нет «имени func» или чего-то подобного.

Вы могли использовать функцию, как макрос, чтобы обернуть newvec3:

#define vec3(...) newvec3(__VA_ARGS__) 

Это будет только расширяться vec3 в newvec3, когда это в контексте функции вызова, так что это позволило бы продолжать использовать из имя в контексте типа. Но вы, вероятно, не должны этого делать - он не делает фактически добавляет второе значение в глобальное пространство имен, это просто замена, которая иногда срабатывает, а иногда и не (и, что еще хуже, срабатывает независимо от правил области, что нарушает C семантика для имен нормального типа и функций). У вас должно быть два отдельных имени в реальном программном пространстве; может также сделать это явным.