type en langage C

Statut
N'est pas ouverte pour d'autres réponses.

sebge2

Elite
Bonjour

Je me remet à vous ... je commence à en avoir vraiment marre de chercher !

Voila ce que j'aimerais réaliser :

Code:
#define mon_type unsigned long int

void ma_fonction(le_type){
 le_type i;
}

main(){
   ma_fonction(mon_type);
}
Merci d'avance :)
 

Jereck

Α & Ω
Staff
Avant tes prototypes, mais après tes inclusions :
typedef unsigned long int mon_type;

Ton prototype :
void ma_fonction(mon_type i);

Ton main :
main(){
....mon_type Var;
....ma_fonction(Var);
}


Ta définition de la fonction :
void ma_fonction(mon_type i){
..../* Traitement de ta variable i */
}
 
1er
OP
sebge2

sebge2

Elite
non en fait j'utilise dans ma fonction un type "variable"

en fait je fais ca pour calculer l'overflow de chaque type int

une fois c'est un unsigned long int l'autre un unsigned short int

le type à donner en paramètre à la fonction est donc variable

tout le probleme est la :?
 

Jereck

Α & Ω
Staff
Je comprends pas trop ce que tu veux en fait :/
Avec un enum{}, ça n'irait pas ? (j'en ait jamais utilisé en C donc, je sais pas trop comment on s'en sert... )
 

Roudoudou

Lecteur discret
une fonction à paramètre variable ?

essaye le polymorphisme, tu copy/pastes ta fonction et dans chaque version, tu définis un type différent pour le paramètre

ps: ton problème est pas très bien expliqué
 
1er
OP
sebge2

sebge2

Elite
le problème c'est que je dois passer comme paramètre à la fonction un type de variable... le paramètre est un type

j'ai un calcul qui est répétitif mais qui se fait sur une variable dont le type change


imaginons que je dois calculer i+i où i est soit un long ou short ... et doit le rester absolument !... je dois passer le type de la variable à la fonction :?
 

Jereck

Α & Ω
Staff
[CdC a dit:
Roudoudou]une fonction à paramètre variable ?

essaye le polymorphisme, tu copy/pastes ta fonction et dans chaque version, tu définis un type différent pour le paramètre
c'est pas du polymorphisme ça, c'est de la surcharge de fonction (chuis en plein dedans dans mes cours ^^)
et ça n'existe pas en C
 
1er
OP
sebge2

sebge2

Elite
[CdC a dit:
Roudoudou]une fonction à paramètre variable ?

essaye le polymorphisme, tu copy/pastes ta fonction et dans chaque version, tu définis un type différent pour le paramètre

ps: ton problème est pas très bien expliqué

c'est pour un rapport d'OS sur l'oveflow des INT

ca va pas etre tres propre si je copie colle en changeant le type des paramètres :D et j'aimerais que ca soit propre :wink:
 

Roudoudou

Lecteur discret
pourquoi le type doit il changer ? Ne peux-tu pas réalsier ton probleme avec deux (si tu as deux types différents) avec deux fonctions de même nom mais avec des types de paramètres différents ? Ou toi tu voudrais juste avoir un genre de constante dans ton prog qui te permettrait avant compilation de choisir le type de parametre de la fonction ?
 

Roudoudou

Lecteur discret
Jereck a dit:
[CdC a dit:
Roudoudou]une fonction à paramètre variable ?

essaye le polymorphisme, tu copy/pastes ta fonction et dans chaque version, tu définis un type différent pour le paramètre
c'est pas du polymorphisme ça, c'est de la surcharge de fonction (chuis en plein dedans dans mes cours ^^)
et ça n'existe pas en C
autant pour moi, j'avais expliquée l'idée :)

et que ca ne marche pas en C ca je ne savais pas non plus :)
 
1er
OP
sebge2

sebge2

Elite
en fait je fais un p'tit calcul sur des int de type différent

mais ce calcul est le meme pour tous les types d'int

Code:
void function_unsigned_short_int(void){
  int i;
  unsigned short int variableTest;
  variableTest=(pow_rebuilded(2,(sizeof(variableTest)*8))-1); // valeur maximum - 1

  printf("unsigned short int\n");

  for(i=1; i<=nb_results_diplays; i++,variableTest++)
    printf("%d\n",variableTest); // on affiche les valeurs

  return;
}

le seul truc qui change c'est la déclaration de la variable variableTest .....
 
1er
OP
sebge2

sebge2

Elite
une autre idée m'a traversé l'esprit :

Code:
  int variableTest;
  int i;

  if(is_unsigned && is_long){ variableTest=(unsigned long int) variableTest;}
  if(is_unsigned && !is_long){ variableTest=(unsigned short int) variableTest;}
  if(!is_unsigned && is_long){variableTest=(signed long int) variableTest;}
  if(!is_unsigned && !is_long){ variableTest=(signed short) variableTest_old;}
le probleme est que la variable ne change pas de type ... pourtant il passe bien par une des conditions

pourquoi le casting ne va pas ??? :cry:

c'est le meme si je passe par une variable intermédiaire lors du casting
 

oNi-

:baille: Lecteur
je me demande si ta variable de destination ne doit pas être du type voulu...

ensuite j'ai un souvenir très vague du C, mais tes conditions... (je dis p-e une énorme connerie) tu y testes quoi ? Je veux dire, y a pas de variable testée à ce moment là non ?
 
1er
OP
sebge2

sebge2

Elite
c'est une portion de code ... les tests ce font sur des booleans
 

ImMorT4L

Touriste
sebge2 a dit:
pourquoi le casting ne va pas ??? :cry:

c'est le meme si je passe par une variable intermédiaire lors du casting
C'est normal, tu déclares un int et tu y places un long... Tu mets donc une variable longue dans un espace mémoire prévu pour un int :D

Le meilleur moyen est de passer à ta fonction une liste de paramètres variables :D

Tu dois passer un paramètre fixe et ensuite (...):

void ma_fonction(char *bien_obligé, ...)

Tu a ensuite une variable de type va_list que tu initialise via va_start et que tu ferme avec va_end...

Les paramètres peuvent être récupérés avec TYPE = va_arg(va_list, TYPE); dans une boucle while != 0 :D

PS: Si tu comprends pas, vient me touver en MP ;)
 
1er
OP
sebge2

sebge2

Elite
je comprend pas vraiment lol

j'ai regardé dans le livre que j'ai sur le C et j'ai rien compris non plus ...

enfin merci je garderai ce que j'ai ca sera plus simple !
 
1er
OP
sebge2

sebge2

Elite
Code:
#include <stdio.h>
#include <stddef.h>

#define nb_results_diplays 5

int pow_rebuilded(int base,int expos){
  int i;
  int returnValue = 1;
  
  for(i=1;i<=expos;i++) returnValue*=base;
  
  return returnValue;
}

void function_unsigned_short_int(void){
  int i;
  unsigned short int variableTest;  
  variableTest=(pow_rebuilded(2,(sizeof(variableTest)*8))-1); // valeur maximum - 1

  printf("unsigned short int\n");

  for(i=1; i<=nb_results_diplays; i++,variableTest++) 
    printf("%d\n",variableTest); // on affiche les valeurs 
  
  return;
}

void function_unsigned_long_int(void){
  int i;
  unsigned long int variableTest;
  variableTest=(pow_rebuilded(2,(sizeof(variableTest)*8))-1); // valeur maximum - 1

  printf("unsigned long int\n");

  for(i=1; i<=nb_results_diplays; i++,variableTest++)
     printf("%lu\n",variableTest); // on affiche les valeurs

  return;
}

void function_signed_short_int(void){
  int i;
  signed short int variableTest;
  variableTest=(pow_rebuilded(2,(sizeof(variableTest)*8)-1)-1); // valeur maximum - 1
  
  printf("signed short int => incrémentation \n");

  // incrémentation
  for(i=1; i<=nb_results_diplays; i++,variableTest++)
    printf("%d\n",variableTest); // on affiche les valeurs


  variableTest=-(pow_rebuilded(2,(sizeof(variableTest)*8)-1)); // valeur minimum + 1

  printf("signed short int => décrémentation\n");

  // décrémentation
  for(i=1; i<=nb_results_diplays; i++,variableTest--)
    printf("%d\n",variableTest); // on affiche les valeurs

  return;  
}

void function_signed_long_int(void){
  int i;
  signed long int variableTest;
  variableTest=(pow_rebuilded(2,(sizeof(variableTest)*8)-1)-1); // valeur maximum - 1

  printf("signed long int => incrémentation \n");

  // incrémentation
  for(i=1; i<=nb_results_diplays; i++,variableTest++)
    printf("%d\n",variableTest); // on affiche les valeurs


  variableTest=-(pow_rebuilded(2,(sizeof(variableTest)*8)-1)); // valeur minimum + 1

  printf("signed long int => décrémentation\n");

  // décrémentation
  for(i=1; i<=nb_results_diplays; i++,variableTest--)
    printf("%d\n",variableTest); // on affiche les valeurs

  return;
}

main(){ 
  printf("\nExercice 1\n");
        
  function_unsigned_short_int();    
  function_unsigned_long_int();

  function_signed_short_int();
  function_signed_long_int();  
}
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut