IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Initialiser un tableau à partir d'un autre tableau


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Initialiser un tableau à partir d'un autre tableau
    Bonjour,
    je fais un programme comportant 2 tableaux constants, et j'aurais besoin d'initialiser les valeurs de l'un avec celles de l'autre. Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int tab1[] = {0,1,2};
    const int tab2[] = {5, tab1[0], 8, tab1[2], 4, tab1[1], tab1[2]};
    Mais j'ai une erreur de compilation. N'y a-t-il pas un moyen d'évaluer tab2 à la compilation sans devoir copier manuellement toutes les valeurs de tab1 dans tab2 ?
    Sachant que dans mon programme tab2 inclue quelques centaines de fois les termes du premier tableau j'aimerais éviter de devoir tout copier/coller ...

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Tu peux utiliser des constantes symboliques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define VALEUR1 0
    #define VALEUR2 1
    #define VALEUR3 2
     
    const int tab1[] = { VALEUR1 , VALEUR2 , VALEUR3 } ;
    const int tab2[] = { 5 , VALEUR1 , 8 , VALEUR3 , 4 , VALEUR2 , VALEUR3 } ;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Salut, ça risque de ne pas être très propre car mon premier tableau est assez lourd lui aussi.
    De plus pour simplifier l'écriture mon deuxieme tableau j'ai déjà des macros qui mettent plusieurs valeurs du premier dans le deuxième:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define TAB_PACK3(i) (tab1[i] & (tab1[i+1]<<16)), tab1[i+2]
    #define TAB_PACK2(i) (tab1[i] & (tab1[i+1]<<16))
     
    // j'avais oublié: les termes du 1er tableau sont des short
    const short int tab1[] = {0, 1, 2, 8};
    const int tab2[] = {TAB_PACK3(1), 5, tab1[0], 8, tab1[2], 4, tab1[1], tab1[2]};
    Et si je déclare les membres du 1er tableau en constantes sympoliques, je ne sais pas comment conserver ces macros. Il m'a déja fallut un temps fou pour faire ces tableaux, j'aimerais éviter d'avoir à totalement les refaire

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu peux faire un truc comme ça sinon mais je sais pas si c'est super propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <stdio.h>
     
    #define TAB_PACK3(i) (tab1[i] & (tab1[i+1]<<16)), tab1[i+2]
    #define TAB_PACK2(i) (tab1[i] & (tab1[i+1]<<16))
     
    #define TAILLE_TABLEAU2 9
     
    void remplissage_tableau( const short int * tab1 , int * tableau , size_t taille )
    {
    	int tab2[] = { TAB_PACK3(1) , 5 , tab1[0] , 8 , tab1[2] , 4 , tab1[1] , tab1[2] };
    	size_t i ;
     
    	for ( i = 0 ; i < taille ; i++ )
    		tableau[i] = tab2[i] ;
    }
     
    int main(void)
    {
    	const short int tab1[] = {0, 1, 2, 8};
    	const int tab2[TAILLE_TABLEAU2];
    	size_t i ;
     
    	remplissage_tableau( tab1 , (int*)tab2 , TAILLE_TABLEAU2 ); /* caster en int* pour supprimer le const */
     
    	for ( i = 0 ; i < TAILLE_TABLEAU2 ; i++ )
    		printf("%d " , tab2[i]) ;
     
    	return 0;
    }

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Je ne pense pas que le C permette ce genre de choses, surtout qu'il faudrait en plus gérer les références circulaires (du style « tab1[0]=tab0[0]; tab0[0]=tab1[0]; »). D'autre part, l'initialisation des tableaux consiste à lire en un seul bloc des données depuis la zone read-only jusque vers le tableau. Toi, tu fais des références compliquées, mélangeant à la fois des données statiques et des références multiples au même élément d'un autre tableau.

    En plus, il y a une notion de run-time. Lorsque tu fais « const int tab2[] = {TAB_PACK3(1), 5, tab1[0], 8, tab1[2], 4, tab1[1], tab1[2]}; », tu te réfères non pas à la valeur initiale, mais à l'état de la case en question au moment où la ligne est évaluée.

    Tout ceci justifie pleinement l'écriture d'une fonction de copie parce que, d'abord, l'initialisation d'un tableau n'est pas magique : même si l'opération de copie est extrêmement simple, elle a quand même lieu (soit via la C runtime library, soit directement compilée en MOVS ou similaire). Sinon, le fait de dire « même chose que la case tab1[2] », par exemple, implique la duplication des données pour chaque tableau (ce qui n'est pas forcément un problème, sauf si les tableaux sont grands).

    Si, malgré cela, tu ne souhaites pas opter pour une solution à l'exécution, moi, j'utiliserais un script (bash, Perl, ou n'importe quel autre langage) pour générer automatiquement un fichier « *.h » contenant les tableaux proprement définis qu'il n'y aurait plus qu'à inclure dans le projet principal, et je ferais appeler ce script par mon Makefile.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Salut, euh je suis un peu largué la Obsidian . Je suis encore novice en C, je croyais que ce genre d'initialisation était possible puisque toutes les valeurs sont connues à la compilation.

    Je ne connais pas de langage script et je ne sais pas refaire un makefile. J'ai imaginé une solution avec la première idée de jeroman qui semble marcher mais ça serait long à implémenter.
    Je vais simplement le créer à l'éxécution comme suggéré, comme le tableau ne fera que quelques Ko ça n'est pas nécessaire d'optimiser.

    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Remplir un tableau à partir d'un autre tableau Excel
    Par khelilo dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/12/2012, 10h14
  2. création d'un tableau à partir d'un autre tableau
    Par ferhat.adel dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2011, 17h02
  3. [XL-2007] Mise à jour d'un tableau à partir d'un autre tableau générique
    Par NoxfromParis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/01/2011, 20h40
  4. trié un tableau à partir d'un autre tableau
    Par somatino dans le forum C++
    Réponses: 5
    Dernier message: 27/06/2006, 13h19
  5. Créer un tableau à partir d'un autre tableau
    Par mariemor64 dans le forum ASP
    Réponses: 5
    Dernier message: 20/06/2006, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo