Type ( C )

lirycs78 Messages postés 106 Statut Membre -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

13 réponses

fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
lirycs78 Messages postés 106 Statut Membre 1
 
Merci pour ta reponse :) mais pourrait tu développer un peu plus stp, car un tableau est un pointeur en soi non ?
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
lirycs78 Messages postés 106 Statut Membre 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
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lirycs78 Messages postés 106 Statut Membre 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
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
lirycs78 Messages postés 106 Statut Membre 1
 
Une personne pourrais juste m'expliquer ceci : *((char*)tab+i)

merci
0
lirycs78 Messages postés 106 Statut Membre 1
 
??
0
lirycs78 Messages postés 106 Statut Membre 1
 
ok thx et un pti dernier truc aprés c bon :D

Caster sa veut dire ???

Merci Merci Merci :D
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
lirycs78 Messages postés 106 Statut Membre 1
 
D'accord j'ai compris :D

Mais juste pourquoi avoir mi loperateur d'indirection a coter de char par exemple ? (char*) ...
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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