2013-06-26 4 views
0

У меня есть структура с указателями на float, которые я хочу превратить в массив неопределенного размера. В начале моей программы я хочу объявить некоторые из этих структур и превратить их в разные массивы размера, например:Заполнение динамического массива C++

struct _arr { 
    float * a; 
} 

...

_arr x; 
x.a = (float *)malloc(sizeof(float)*31); 
x.a = { 6, 
     1, 1, 1, 0  , 0  , 
     1, 0, 1, 0  , 0.0625, 
     1, 1, 0, 0.0625, 0  , 
     1, 0, 1, 0  , 0.0625, 
     1, 0, 0, 0.0625, 0.0625, 
     1, 1, 0, 0.0625, 0 
     }; 

К сожалению, это не работает, есть ли у кого-нибудь предложения, которые получают значения в массив, кроме добавления каждого значения в отдельности (например, [0] = 6;)?

+2

Можете ли вы хранить 'std :: vector ' вместо указателя? – juanchopanza

+2

Если вы знаете содержимое во время компиляции, зачем нужен динамический массив? –

+0

@ PhilippMatthiasSchäfer им могут потребоваться разные экземпляры для хранения массивов разных размеров с разными значениями. – juanchopanza

ответ

3

Это может быть упрощен путем сохранения std::vector<float>:

#include <vector> 

struct arr_ { 
    std::vector<float> a; 
}; 

В C++ 11, инициализация тривиальна:

arr_ x{ {1.0f, 2.0f, 3.0f, 4.0f, 5.0f} }; 

К сожалению, нет тривиального способа выполнить такую ​​инициализацию в C++ 03. Одним из вариантов было бы инициализировать из временного массива фиксированного размера:

float farray_[5] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f}; 
arr_ x{ std::vector<float>(farray_, farray_+5)}; 
+0

+1 хотя C++ 11 только из-за равномерной инициализации. Что было бы рекомендуемым способом без C++ 11? –

+1

Быть точным '_arr' отлично (я все равно не рекомендую его, конечно), но' _Arr' не будет. Это двойные подчеркивания и ведущие подчеркивания, за которыми следуют прописные буквы. –

+0

@Andre Я не могу придумать решение C++ 03, которое не включает установку элементов один за другим или копирование элементов массива фиксированного размера в вектор. – juanchopanza

1

Вы можете инициализировать array на stack, а затем копировать/memcpy к вашей динамической памяти. Но использование vector, как было предложено, было бы лучшим выбором.

0

Xa является указателем и при изменении ха = хх изменить адрес

попробовать этот код:

ха = новый поплавок (6, 1, 1, 1, 0, 0 , 1, 0, 1, 0, 0,0625, 1, 1, 0, 0,0625, 0, 1, 0, 1, 0, 0,0625, 1, 0, 0, 0,0625, 0,0625, 1, 1, 0, 0.0625, 0 );

+0

Вы даже пробовали это? – juanchopanza

+0

yep в vs2010 и у меня есть предупреждение – beyrem

+0

Я пробовал, и он не работает, он просто использует последнее значение. – Diabl0658

Смежные вопросы