No, no podrá ajustar a valores arbitrarios en una declaración (a no ser hecho como parte de la declaración).
Usted puede hacerlo con código, algo así como:
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 27;
:
myArray[99] = -7;
o (si hay una fórmula):
for (int i = 0; i < 100; i++) myArray[i] = i + 1;
La otra posibilidad es mantener en torno a algunas plantillas que son establecer en el momento de la declaración y usarlos para inicializar su matriz, algo como:
static const int onceArr[] = { 0, 1, 2, 3, 4,..., 99};
static const int twiceArr[] = { 0, 2, 4, 6, 8,...,198};
:
int myArray[7];
:
memcpy (myArray, twiceArr, sizeof (myArray));
Esto tiene la ventaja de que (lo más probable) es más rápido y le permite crear matrices más pequeñas que las plantillas.He usado este método en situaciones donde tengo que reinicializar una matriz rápidamente pero a un estado específico (si el estado fuera todo ceros, simplemente usaría memset
).
Incluso se puede localizar a una función de inicialización:
void initMyArray (int *arr, size_t sz) {
static const int template[] = {2, 3, 5, 7, 11, 13, 17, 19, 21, ..., 9973};
memcpy (arr, template, sz);
}
:
int myArray[100];
initMyArray (myArray, sizeof(myArray));
La matriz estática (casi seguro) se creará en tiempo de compilación por lo que no habrá ningún costo en tiempo de ejecución para eso, y el memcpy
debe ser deslumbrantemente rápido, probablemente más rápido que 1,229 declaraciones de asignación pero definitivamente menos tipeado de su parte :-).
Diría * definitivamente * 'estático'. – caf
Creo que la forma más conveniente en mi caso, en lugar de asignar cada elemento, copie cada matriz deseada en una matriz global. Muchas gracias –
+1 por C99. ;) memcpy (myarray, (int [sizeof (myarray)/sizeof (myarray [0])] {1,2,3,4}, sizeof myarray); para iniciar el resto en el cero apropiado. – Nyan