IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

operation sur matrice multitype


Sujet :

Bibliothèque standard C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 44
    Points
    44
    Par défaut operation sur matrice multitype
    Bonjour,
    alors voici ma question

    J'ai une fonction principale dans laquelle je travaille sur des matrices
    j'ai par exemple une fonction addvectscal qui additionne un scalaire a chaque valeur du vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    void addvectscal(double *vecteur, int sizevect, double scal){
            int i = 0;
            for(i = 0; i < sizevect; i++)
                    vecteur[i] += scal;
    }
     
    int main(){
            int i = 0;
            double *vect = (double*)calloc(3, sizeof(double));
            vect[0] = 1.2; vect[1] = 3.1; vect[2] = 5.9;
            addvectscal(vect, 3, -5.3);
            return 0;
    }
    cet exemple simple est fait pour introduire ma question :

    Je voudrais par l'utilisation judicieuse d'une macro par exemple ou autre, faire en sorte que ma fonction addvectscal reconnaisse que je lui ai donné des int, des double , des float etc
    Parceque dans le cas précédent je lui spécifie en entrée que c'est un double*vecteur. mais je voudrais ne pas avoir d'appriori sur le type du vecteur

    je pensais récupérer le sizeof avec une macro mais je ne sais pas vraiment comment m'y prendre

  2. #2
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Il faut passer en paramètre la taille de tes données (avec un sizeof a l'appel)et utiliser le type générique void*
    all your base are belong to us.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    Il faut passer en paramètre la taille de tes données (avec un sizeof a l'appel)et utiliser le type générique void*
    Salut merci de ta reponse
    Pourrais tu me donner une tout petit exemple, je vois bien l'histoire du parametre generique mais pas celui du sizeof
    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    Il faut passer en paramètre la taille de tes données (avec un sizeof a l'appel)et utiliser le type générique void*
    Ce sera insuffisant. A cause de
    Le type de vecteur devra être correctement restitué de void * en double*, float *, int *, .... La taille du type est une information insuffisante.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    les types sont en void* il representent potentiellement n'importe quel type, il faut passer leur taille pour passer d'un element a un autre dans le vecteur.

    On concidere que vecteur et scal sont du meme type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    void fct_add_double(const double* a, const double* b, double *resultat) {
        *resultat = *a + *b;
    }
     
    void addvectscal(void*vecteur, int sizevect, void *scal, size_t size, void (*fct_add)(const void*, const void*, void*)){
            int i = 0;
            for(i = 0; i < sizevect; i++) 
                     fct_add((vecteur + size * i), scal, (vecteur + size * i));
    }
     
    //et a l'appel 
     
    addvectscal(vecteur, 42, sizeof(double), fct_add_double);
    c'est juste l'idée, cela ne marchera certainement pas en l'état et je n ai pas de compilo sous la main. En tout cas on voit que l'on acces au n ieme element du vecteur par le premier element + la taille d'un element multiplié par l index. On doit aussi utiliser un pointeur de fonction car on ne connais effectivement pas les types.

    sinon, n'oublie pas que le cast de double vers float et int reste une solution plus facile, mais tout dépend de tes besoins.


    Un peu de litterature http://rperrot.developpez.com/articles/c/genericite/ (là où j'ai tout appris sur la généricité, un must).
    all your base are belong to us.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Points : 44
    Points
    44
    Par défaut
    Ok merci pour ton aide, je regarde tout ca

    Citation Envoyé par TheDrev Voir le message
    les types sont en void* il representent potentiellement n'importe quel type, il faut passer leur taille pour passer d'un element a un autre dans le vecteur.

    On concidere que vecteur et scal sont du meme type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    void fct_add_double(const double* a, const double* b, double *resultat) {
        *resultat = *a + *b;
    }
     
    void addvectscal(void*vecteur, int sizevect, void *scal, size_t size, void (*fct_add)(const void*, const void*, void*)){
            int i = 0;
            for(i = 0; i < sizevect; i++) 
                     fct_add((vecteur + size * i), scal, (vecteur + size * i));
    }
     
    //et a l'appel 
     
    addvectscal(vecteur, 42, sizeof(double), fct_add_double);
    c'est juste l'idée, cela ne marchera certainement pas en l'état et je n ai pas de compilo sous la main. En tout cas on voit que l'on acces au n ieme element du vecteur par le premier element + la taille d'un element multiplié par l index. On doit aussi utiliser un pointeur de fonction car on ne connais effectivement pas les types.

    sinon, n'oublie pas que le cast de double vers float et int reste une solution plus facile, mais tout dépend de tes besoins.


    Un peu de litterature http://rperrot.developpez.com/articles/c/genericite/ (là où j'ai tout appris sur la généricité, un must).

Discussions similaires

  1. Operations sur matrice
    Par black_hole dans le forum OpenCV
    Réponses: 0
    Dernier message: 04/11/2013, 22h44
  2. UJMP et les operations sur matrices
    Par wax78 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 14/10/2010, 15h23
  3. Commande date. Faire des opération sur l'heure?
    Par fidififouille dans le forum Linux
    Réponses: 9
    Dernier message: 23/08/2004, 15h16
  4. [Débutant][String] Opérations sur une chaîne
    Par gandalf_le_blanc dans le forum Général Java
    Réponses: 8
    Dernier message: 08/06/2004, 11h59
  5. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo