Type ( C )
lirycs78
Messages postés
106
Statut
Membre
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
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.
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:
- Type ( C )
- Clear type - Guide
- Type de ram - Guide
- Comment changer le type de fichier - Guide
- Click-n-type - Télécharger - Vie quotidienne
- Sommaire type - Guide
13 réponses
Tu peux utiliser aussi
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.
((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 :
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.
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]);
}
}
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.
Et pour l'appel :
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 )
(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);
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;
}
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*) ...
Mais juste pourquoi avoir mi loperateur d'indirection a coter de char par exemple ? (char*) ...