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 :

Comment remplir un tableau en paramètre de fonction ?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut Comment remplir un tableau en paramètre de fonction ?
    Bonjour !



    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
    void litTableau(const unsigned int taille, const int * tab)
    {
         unsigned int i;
         for (i = 0 ; i < taille ; i++) printf(" %0X", tab[i]);
         printf("\n");
    }
     
     
    int main(int argc, char *argv[])
    {
        litTableau(3, {0x54, 0x41, 0x42});
     
        system("PAUSE");	
        return 0;
    }

    Quelle est la bonne syntaxe pour remplir le tableau depuis le paramètre de la fonction ?

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Je ne sais pas trop ce que tu as voulu faire ici, mais il faut tout d'abord déclarer ton tableau et ensuite le passer à ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	int tab[] = {0x54, 0x41, 0x42};
    	litTableau(3, tab);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    En fait, c'est dans le but de vérifier si telle suite d'octets se trouve dans un fichier.

    Ayant déjà un tableau pour fread(), j'aimerais éviter de tout faire en double.



    Je pense que c'est possible puisque ça marche avec les lettres d'une chaîne de caractères qu'on peut remplir dynamiquement et directement dans le paramètre de la fonction.

    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
    void litTableau(const unsigned int taille, const char * tab)
    {
         unsigned int i;
         for (i = 0 ; i < taille ; i++) printf(" %0X", tab[i]);
         printf("\n");
    }
     
     
    int main(int argc, char *argv[])
    {
        litTableau(3, "TAB");
     
        system("PAUSE");	
        return 0;
    }

    Mais j'aimerais ne pas être limité à l'ANSI...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 400
    Points : 23 783
    Points
    23 783
    Par défaut
    Bonjour,

    Citation Envoyé par Nikolas Voir le message
    Je pense que c'est possible puisque ça marche avec les lettres d'une chaîne de caractères qu'on peut remplir dynamiquement et directement dans le paramètre de la fonction.
    Dans les deux cas, tu passes un pointeur vers le tableau préalablement rempli. La notation ensembliste avec les accolades ne fonctionne qu'à l'initialisation d'un tableau.

    Bonne chance,

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Il y aurait bien la méthode des options avec les énumération des 256 combinaisons d'un octet mais ça n'est pas dans l'ordre.

    Il y a aussi la méthode de mettre chaque valeur en argument supplémentaire avec « stdarg.h » mais ça revient à un code lourd pour pas grand-chose.


    Ou alors ne pas faire de fonction et faire une comparaison primitive octet par octet ; un code bien dégueulasse...

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ce qui t'est suggéré, c'est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char *argv[])
    {
     int tab[] =   {0x54, 0x41, 0x42};  
     litTableau(3, tab);
     
        system("PAUSE");	
        return 0;
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Oui oui, j'ai compris, c'est même comme ça que je fais pour l'instant mais j'aimerais alléger mon code.


    Avec les chaînes, je m'emmerde pas à les déclarer d'abord puisque ça marche tout seul.


    Je ne fais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[] = "TAB";
    litTableau(3, tab);

    Alors que ça fonctionne avec :


  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    J'ai trouvé une méthode qui compile mais le programme plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    litTableau(3, 0x54==0x41==0x42);

    J'essaie encore d'autres combinaisons ; je finirai bien par trouver la bonne sur des milliards de possibilités...

  9. #9
    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
    J'ai trouvé une méthode qui compile mais le programme plante :
    Normal, l'accès à l'adresse 0 ne peut que faire planter.
    En effet, l'expression renvoie 0.

    Pourquoi faire compliqué quand on peut faire simple ? La solution de diogene est simple et fonctionne sans problème.

    Si tu veux mettre ça au milieu d'un gros paquet de code, il est même toujours possible de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tab[] =   {0x54, 0x41, 0x42};  
    litTableau(3, tab);
    entre { }, afin d'éviter d'être obligé de mettre la première ligne en début de fonction (les déclarations se font toujours en début de fonction, sauf en C99 je crois).

  10. #10
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Y'a bien une méthode (tordue à mon avis), mais à toi de voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    litTableau(3, "\x54\x41\x42") ;

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par jeroman Voir le message
    (les déclarations se font toujours en début de fonction, sauf en C99 je crois).
    En début de bloc pour être précis (ce que d'ailleurs tu décris dans ta méthode).

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 725
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Nikolas Voir le message
    Je ne fais pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[] = "TAB";
    litTableau(3, tab);

    Alors que ça fonctionne avec :

    Ca fonctionnera même avec :

    Pour peu que tu réécrives ta fonction de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void litTableau(const char * tab)
    {
         char *pt:
         for (pt=tab; *pt; pt++) printf(" %0X", *pt);
         fputc('\n', stdout);      // Autant éviter la grosse artillerie pour un seul caractère !!!
    }

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 112
    Points : 44
    Points
    44
    Par défaut
    Alors là, Elijha, bravo !


    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
    void litTableau(const unsigned int taille, const unsigned char * tab)
    {
         unsigned int i;
         for (i = 0 ; i < taille ; i++) printf(" %0.2X", tab[i]);
         printf("\n");
    }
     
     
    int main(int argc, char *argv[])
    {
        litTableau(256, "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF");
     
        system("PAUSE");	
        return 0;
    }


    Merci beaucoup, c'est vraiment une chouette méthode, ça allège grandement mon code.

    J'ai pas perdu mon temps en venant ici.



    Merci aussi aux autres de s'être penchés sur ce problème.

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

Discussions similaires

  1. Comment remplir un tableau
    Par Aurore_atmo dans le forum MATLAB
    Réponses: 39
    Dernier message: 06/07/2006, 11h16
  2. [C#] Comment remplir un tableau avec un arraylist
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/06/2006, 15h14
  3. comment remplir un tableau deja créé
    Par Hamza dans le forum Delphi
    Réponses: 6
    Dernier message: 05/06/2006, 23h01
  4. comment remplir un tableau deja créé
    Par Hamza dans le forum Bases de données
    Réponses: 0
    Dernier message: 04/06/2006, 19h38
  5. Réponses: 1
    Dernier message: 18/11/2005, 11h38

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