2011-12-13 3 views
2

Etre capable de définir un tableau par ex.Initialisation de Lvalues, Rvalues ​​et Array en C

int a[] = {1,2,3}; 

est très pratique, cependant, l'un de réseau est une valeur r de sorte que je ne peut pas modifier ultérieurement les valeurs de a, par exemple,

a[] = {4,5,6}; 

Le contexte de vouloir le faire est l'écriture d'un tas de tests unitaires où je suis alimentation dans les tableaux aux fonctions et tester les sorties. Je cours des essais sur la même fonction avec différentes entrées et voudrais éviter d'avoir des noms uniques pour mes tableaux d'entrée, par exemple. Je vais avoir à faire:

int test1_a[] = {1,2,3}; 
/* calls to functions */ 

int test2_a[] = {4,5,6}; 
/* calls to functions */ 

De plus, si je veux passer un pointeur vers un tableau dans une fonction que je dois le 1er casting comme ceci:

int a[] = {1,2,3}; 
int *b = a; 

my_func(&b); 

passer un pointeur vers une valeur r comme cela ne fonctionne pas:

my_func(&a); 

Ma question est de savoir s'il y a une autre façon de facilement initialiser un tableau de valeurs sans souffrir de ces limites? (Notamment en vue de le rendre facile d'écrire de nombreux tests unitaires similaires sans chaque essai ayant un ensemble unique de noms de tableaux)

+5

Cela peut être lié: http://stackoverflow.com/q/8380348/726361 –

+1

Si votre seul problème est la réinitialisation du tableau sans recompilation, alors vous pouvez le lire à partir d'un fichier ou d'une base de données. (ne pas oublier la taille!). – wildplasser

+0

bon point - je pense que c'est peut-être le chemin à parcourir. Je passe de Python à C en ce moment d'où toutes ces questions (peut-être) stupides sur les bases ... – bph

Répondre

1

Si vous avez déjà les valeurs que vous voulez transmettre aux fonctions, pourquoi ne pas utiliser un tableau multidimensionnel?

int a[][] = { 
    { 1, 2, 3 }, 
    { 4, 5, 6 } 
} 

for (int i = 0; i < 2; i++) 
{ 
    /* Call functions with 'a[i]' as argument */ 
} 

De même, si les fonctions que vous appelez attendent un tableau, et que vous disposez par exemple d'un tableau. int a[] = {...}; int *b = a;, alors ne les appelez pas avec &b. L'utilisation de &b transmet l'adresse du pointeur , et non ce à quoi il renvoie.

+0

belle suggestion, qui ressemble à une solution bien rangé.Je pense que la route mémcpy confond les choses et introduit des problèmes potentiels de portabilité. Je vais laisser celui-là seul. – bph

1

Voici une option:

#include <stdio.h> 
#include <stdarg.h> 

void ReinitArray(int* p, size_t cnt, ...) 
{ 
    va_list ap; 

    va_start(ap, cnt); 

    while (cnt--) 
    { 
    *p++ = va_arg(ap, int); 
    } 

    va_end(ap); 
} 

int array[5] = { 1, 2, 3, 4, 5 }; 

int main(void) 
{ 
    size_t i; 

    printf("array[5]="); 
    for (i = 0; i < 5; i++) printf("%d ", array[i]); 
    printf("\n"); 

    ReinitArray(array, 5, 11, 22, 33, 44, 55); 

    printf("array[5]="); 
    for (i = 0; i < 5; i++) printf("%d ", array[i]); 
    printf("\n"); 

    return 0; 
} 

Sortie:

array[5]=1 2 3 4 5 
array[5]=11 22 33 44 55 

Et vous pouvez simplement écrire my_func(a);a est un nom de tableau. Cela équivaudra à passer &a[0], l'adresse du tout premier élément du tableau. Vous ne pouvez pas passer des tableaux entiers directement en tant que paramètres de fonction dans C.

1

Si j'ai bien compris votre question.Je suppose que les éléments suivants devraient résoudre votre problème. Uniquement si votre compilateur c prend en charge les littéraux composés (c99 et versions ultérieures).

Pour spécifier la norme, gcc peut être appelé "gcc -std = c99 -Wall -pedantic".

Questions connexes