Type ( C )

Bonsoir,
J'aurrais voulu savoir si il était possible de gérer les types dynamiquement, je m'explique, jai cette fonction :

long compare_tableau(char tableau[], long taille){
int i;
for(i = 0; i < taille; i++){
if(tableau[i] == 0){
return 0;
}
}
return 1;
}

J'aimerais si par exemple jai un array de type long pouvoir le lire sans devoir ajouter une nouvelle fonction.
Merci d'avance.
Configuration: Windows XP
Firefox 3.0.7

13 réponses

  1. Contributeur
    Il ne s'agit pas de l'opérateur d'indirection dans ce cas. Il s'agit du type char*.
    Tu as ton tableau en void*, s'il s'agit en fait d'un char*, tu devras le caster pour signaler au compilateur que les cases du tableau sont séparées d'un byte en mémoire.
    0
    1. D'accord j'ai compris :D

      Mais juste pourquoi avoir mi loperateur d'indirection a coter de char par exemple ? (char*) ...
      0
      1. Contributeur
        Le cast, c'est essayer de convertir un type en un autre. Je dis "essayer", car cela marche à condition d'avoir un certain degré de compatibilité entre les types.
        0
        1. ok thx et un pti dernier truc aprés c bon :D

          Caster sa veut dire ???

          Merci Merci Merci :D
          0
          1. Contributeur
            Tu peux utiliser aussi
            ((char*)tab)[i]

            En fait, tab[i]=*(tab+i). De plus j'ai utilisé (char*) devant tab, c'est pour caster tab qui est en void*.
            Celui là est obligé pour dire au compilateur de combien il doit se déplacer en mémoire pour tomber sur la bonne case.
            1
            1. Une personne pourrais juste m'expliquer ceci : *((char*)tab+i)

              merci
              0
              1. Contributeur
                Juste au cas où ça t'intéresserai, ce que tu cherche à faire est super facile en C++ grace au template :
                template<typename T>long compare_tableau(T tableau[],unsigned long taille){
                  int i;
                  for(i = 0; i < taille; i++){
                    if(tableau[i] == 0){
                      return 0;
                    }
                  }
                  return 1;
                } 
                0
                1. Contributeur
                  En gras, les endroits où je me sers de l'énumération :
                  void lecture_tableau(void *tab, const size_t taille, Type t)
                  case LONG:
                  case CHAR:
                  lecture_tableau(tab,sizeof tab/sizeof *tab,LONG);
                  lecture_tableau(tab2,sizeof tab2,CHAR);
                  0
                  1. merci encore :p une ptitre derniére précision stp, je crois que d'aprés ton code tu déclare une énumération, mais je voit pas ou tu t'en sert :/

                    (Merci beaucoup de m'aider )
                    0
                    1. Car jai ceci pour l'instant mais je comprend pas ce que tu veut dire par caster :/

                      void lecture_tableau(void *tableau, long taille){
                      int i;
                      for(i = 0; i < taille; i++){
                      printf("%ld | ", tableau[i]);
                      }
                      }
                      0
                      1. Contributeur
                        Voici un exemple d'implémentation de la méthode définie dans mon post 1.
                        typedef enum { LONG,CHAR } Type;
                        
                        void lecture_tableau(void *tab, const size_t taille, Type t) {
                            switch(t) {
                                int i;
                                case LONG:
                                    for(i=0;i<taille;i++)
                                        printf("%ld | ",*((long*)tab+i));
                                    break;
                        
                                case CHAR:
                                    for(i=0;i<taille;i++)
                                        printf("%c | ",*((char*)tab+i));
                                    break;
                            }
                        }
                        

                        Et pour l'appel :
                        long tab[]={1,2,3,4,5,6,7,8,9,10};
                        char tab2[]="coucou";
                        lecture_tableau(tab,sizeof tab/sizeof *tab,LONG);
                        lecture_tableau(tab2,sizeof tab2,CHAR);
                        
                        0
                    2. Merci pour ta reponse :) mais pourrait tu développer un peu plus stp, car un tableau est un pointeur en soi non ?
                      0
                      1. Contributeur
                        un tableau est un pointeur
                        Non, un tableau n'est pas du tout un pointeur, même si on peut utiliser la même notation.
                        0
                    3. Contributeur
                      Tu ne peux pas. Par contre, tu peux utiliser comme prototype :
                      long compare_tableau(void *tableau, const size_t taille, const int type); 

                      A l'intérieur de la fonction, tu castes tableau en long si type vaut 0 (par exemple), et en char si type vaut 1.
                      En gros, tu auras un switch pour séparer les cas en fonction de type.
                      Tu auras séparé les cas, mais tu n'auras bien qu'une seule fonction à appeler quelque soit le cas.
                      0