2013-07-09 2 views
0

Я хочу выделить и инициализировать очень большой массив беззнаковых длинных int. Массив - это простой одномерный массив, и я хочу заполнить его значением первых N простых чисел. У меня уже есть программа, которая выплевывает их в .cpp-файл для включения. Я просто не уверен в синтаксисе инициализации массива. Я знаю, чтораспределение и заполнение большого массива

unsigned long int *known = new unsigned long int[N]; 

создаст массив в куче, но я не уверен, как инициализировать пользователей.

ответ

2

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

for(size_t idx = 0; idx < N; ++idx) 
{ 
    *(known + idx) = retrieve_value(idx); 
} 

Очевидно с retrieve_value функции, возвращающей соответствующее значение, которое должно быть присвоено известному [IDX].

Вы также можете использовать указатель/эквивалентность массива и писать код, используя синтаксис массива:

for(size_t idx = 0; idx < N; ++idx) 
{ 
    known[idx] = retrieve_value(idx); 
} 

, что сказал, если не существует веская причина для new'ing массива со таким образом, я сильно рекомендуется использовать один из стандартных контейнеров, таких как std :: vector или std :: array, в этом случае, поскольку это предотвратит головные боли управления памятью, которые в наши дни не нужны. Если N известно во время компиляции, то std::array, вероятно, будет иметь меньшие накладные расходы, в противном случае использование std::vector с соответствующим вызовом reserve() должно также выполнить работу. Я бы действительно предлагал иметь дело с необработанной памятью, если вам абсолютно необходимо выжать последний байт из доступной памяти.

+0

Итак, я сделал некоторые исследования и принял ваш совет и попробовал это, чтобы он определился в куче: std :: vector * known = new вектор ; \t известный [1] = 2; известный [2] = 3; [3] = 5; [4] = 7; \t известный [5] = 11; известный [6] = 13; [7] = 17; [8] = 19; \t известный [9] = 23; известный [10] = 29; [11] = 31; известный [12] = 37; j = известный [i]; но я все еще получаю ошибки. Объявление работает отлично, но это не позволяет мне заполнять членов. Я все еще многому учусь/переучиваю, так что спасибо вам за вашу помощь. – cassius

+0

Вам не нужно выделять вектор в куче. Реализация автоматически сделает это для хранения в любом случае в большинстве случаев. Просто используйте 'std :: vector known;'. Если вы хотите использовать назначения в свой вектор, как написано выше, вам также нужно вызвать 'known.resize (size)' или инициализировать/размер вектор на создание. Посмотрите на cppreference.com или подобные сайты для полного описания векторного API. –

+0

Хорошо, у меня есть синтаксис справа. Он работает, если я вставляю его непосредственно в свою программу. Если я включу определение в KnownPrimes.h, хотя я получаю ошибку компилятора «g ++: ошибка: KnownPrimes.o: нет такого файла или каталога». Почему компилятор должен искать файл .o? – cassius

0

Я предлагаю вам создать класс инициализатора массива, который примет указатель на массив и количество элементов, которые будут созданы. Используйте глобальную переменную этого класса. После создания конструктор заполнит массив.

class ArrayInitializer{ 
     ArrayInitializer(unsigned long* ptr, size_t Size); 
     ... 
     ... 
    }; 

Теперь создайте глобальную переменную

//include your header here, 
    ArrayInitializer g_arrayInit(known,N); 

Глобальные переменные создаются как только начинается выполнение программы. Также вы можете использовать этот класс для очистки выделенной памяти с помощью «нового»

+0

Я не совсем понимаю, что это будет покупать оригинальный плакат? Особенно глобальная переменная часть. –