2013-09-17 1 views
1

Как инициализировать массив в c с возрастающими значениями во время компиляции?Как инициализировать массив в c с возрастающими значениями во время компиляции?

Например, я хочу, чтобы инициализировать массив 5000 целых чисел - и я хочу, чтобы инициализировать его, как [] = {1,2, .... 4999} Я не хочу писать 5000 целых чисел при инициализации массив во время компиляции.

+4

Почему вы думаете, что вам нужно это делать, а не просто инициализировать во время выполнения? –

+0

Вместо массива вы можете просто использовать 'i + 1' вместо' a [i] ' –

+0

Я думаю, вы можете использовать скрипт компоновщика. –

ответ

2

Вы не можете инициализировать массив напрямую с помощью инкрементных значений в C. Вам придется либо инициализировать его, указав все значения, либо используя цикл во время выполнения.

-1

Почему бы не сделать что-то вроде этого:

int size = 5000; 
int arr[size]; 
int i = 1; 
for(i=1; i <= size; i++) 
{ 
    arr[i - 1] = i; // Initializing each element seperately 
} 
+3

Что относительно arr [0]? – HAL

+2

А как насчет переполнения буфера? Обратите внимание, что 'sizeof (arr)' не менее 10000 и, скорее всего, больше. –

+0

@hal sorry пропустил это – Armand

3

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

#define V10(x) (x), (x)+1, (x)+2, (x)+3, (x)+4, (x)+5, (x)+6, (x)+7, (x)+8, (x)+9 

#define V100(x) V10(x), V10(x+10), V10(x+20), V10(x+30), V10(x+40), \ 
       V10(x+50), V10(x+60), V10(x+70), V10(x+80), V10(x+90) 

#define V1000(x) V100(x), V100(x+100), V100(x+200), V100(x+300), V100(x+400), \ 
       V100(x+500), V100(x+600), V100(x+700), V100(x+800), V100(x+900) 

const int a[5000] = { V1000(1), \ 
         V1000(1001), \ 
         V1000(2001), \ 
         V1000(3001), \ 
         V1000(4001) }; 
+2

Правильный ответ на неправильный вопрос :-) – Neil

+0

@Neil: совершенно - я давал OP выгоду от сомнений, хотя - возможно, существует подлинное требование (вряд ли я знаю), например. это некоторая встроенная вещь, которая имеет ограничение в режиме реального времени во время запуска ... –

+0

@PaulR - Точно. Система перезагружается довольно много, и она должна быть как можно скорее. Кроме того, зачем что-то делать во время выполнения, что можно легко сделать во время компиляции. –

2

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

$ echo "unsigned int myarray[] = { $(seq -s ", " 0 9) };" 
unsigned int myarray[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

Вы можете pipe в выделенный исходный файл и включить его в свой код.

(В C++ у вас есть лучшие варианты, благодаря шаблону магии.)

0

Инициализации массива непосредственно с Инкрементированием значений в C не представляется возможным, хотя это может быть возможным с помощью компоновщика сценариев, как уже отмечались другими. Лучше всего использовать цикл for ... для (i = 0, i < 5000, i ++) a [i] = i + 1;

0

Для небольших массивов, вы могли бы сделать так:

#include <stdio.h> 

#define OFFSET (9 - 1) // start at line 9, -1 for 1 indexing 

int main() 
{ 
    int array[] = 
    { 
    __LINE__ - OFFSET, 
    __LINE__ - OFFSET, 
    __LINE__ - OFFSET, 
    __LINE__ - OFFSET, 
    __LINE__ - OFFSET 
    }; 

    for(int i=0; i<sizeof(array)/sizeof(*array); i++) 
    { 
    printf("%d ", array[i]); 
    } 
} 

Но, конечно, с 5000 целых чисел, этот метод будет весьма утомительным. Лучший вариант - сгенерировать исходный код C из внешнего скрипта.

+0

(Например, каждый начинающий программист C должен иметь возможность писать программу, которая печатает '{1, 2, 3 .... 5000}' в текстовый файл.) – Lundin

0

Используйте внешний файл сборки, чтобы инициализировать данные и скомпилировать их с помощью кода C. Вам может потребоваться указать директиву сегмента .data.

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

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