Type ( C )
lirycs78
Messages postés
101
Date d'inscription
Statut
Membre
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 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.
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
-
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. -
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. -
Merci pour ta reponse :) mais pourrait tu développer un peu plus stp, car un tableau est un pointeur en soi non ?
-
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]);
}
}-
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);
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 ) -
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); -
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; } -
Une personne pourrais juste m'expliquer ceci : *((char*)tab+i)
merci -
-
ok thx et un pti dernier truc aprés c bon :D
Caster sa veut dire ???
Merci Merci Merci :D -
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.
-
D'accord j'ai compris :D
Mais juste pourquoi avoir mi loperateur d'indirection a coter de char par exemple ? (char*) ... -
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.