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

C Discussion :

Conversion de type de pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut Conversion de type de pointeur
    Connaitriez vous une façon pour convertir un pointeur (ici wp) de type:

    char* wp;
    ou
    char* wp[n];

    en un pointeur de type:

    char* wp[x][y][z]

    où x, y, z sont des constantes ou des variables telles que n=x*y*z (ex. convertir char* wp[24] en char* wp[2][3][4]).

    Merci.

    Didier

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On ne peut convertir en tableau multi-dimensionnel qu'avec des constantes (sauf peut-être avec les VLA en C99...)

    (Je ne me souviens plus de la syntaxe sans typedef)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef char CHAR_3_4[3][4]; /* CHAR_3_4 correspond au type char[3][4] */
     
    void func(char pwp[2][3][4]);
     
    char *wp = NULL;
    CHAR_3_4 * wp2 = (CHAR_3_4 *)wp;
     
    func(wp2);
    (Ceci compile sans problème en C++, et devrait compiler aussi en C)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Citation Envoyé par Médinoc
    On ne peut convertir en tableau multi-dimensionnel qu'avec des constantes (sauf peut-être avec les VLA en C99...)

    (Je ne me souviens plus de la syntaxe sans typedef)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef char CHAR_3_4[3][4]; /* CHAR_3_4 correspond au type char[3][4] */
     
    void func(char pwp[2][3][4]);
     
    char *wp = NULL;
    CHAR_3_4 * wp2 = (CHAR_3_4 *)wp;
     
    func(wp2);
    (Ceci compile sans problème en C++, et devrait compiler aussi en C)
    Dommage que ce ne soit pas plus général et qu'on ne puisse faire la même chose avec des variables.
    Merci pour la réponse.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par didierl
    Connaitriez vous une façon pour convertir un pointeur (ici wp) de type:

    char* wp;
    ou
    char* wp[n];

    en un pointeur de type:

    char* wp[x][y][z]

    où x, y, z sont des constantes ou des variables telles que n=x*y*z (ex. convertir char* wp[24] en char* wp[2][3][4]).
    Je ne pense pas que ce soit possible, surtout dynamiquement.

    Si tu veux adresser un bloc linéaire en 3D, il faut écrire une fonction qui calcule l'adresse de l'élément en fonction de 'adresse de dépaer et des 3 coordonnées. On utilise pour ça une formule qui tient compte des n-1 dimensions en partant de la droite.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne pense pas que ce soit possible, surtout dynamiquement.

    Si tu veux adresser un bloc linéaire en 3D, il faut écrire une fonction qui calcule l'adresse de l'élément en fonction de 'adresse de dépaer et des 3 coordonnées. On utilise pour ça une formule qui tient compte des n-1 dimensions en partant de la droite.
    J'avais bien pensé à cette solution mais qui est un peu lourde.
    En tout cas merci.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par didierl
    Connaitriez vous une façon pour convertir un pointeur (ici
    wp) de type:

    char* wp;
    Ok

    char* wp[n];
    Ceci n'est pas un pointeur mais un tableau de n pointeurs vers char

    en un pointeur de type:

    char* wp[x][y][z]
    et ceci un tableau tridimentionnel de pointeurs vers char

    où x, y, z sont des constantes ou des variables telles que n =x*y*z (ex. convertir char* wp[24] en char* wp[2][3][4]).
    Comme ce que tu me demandes n'a guère de sens, je vais répondre à une autre question. Premièrement, si y ou z sont des variables, il n'y a rien à faire. Si ce sont des constantes, que x est une constante aussi et que tu as un pointant vers un tableau de x*y*z char, tu peux le convertir sans risque en un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*pt_tab)[x][y][z] = (char (*)[x][y][z])wp;
    que tu peux utiliser comme ceci:Plus confortable, et permettant que x soit variable (mais pas y ou z), tu peux aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*pt_tab)[y][z] = (char (*)[y][z])wp
    que tu peux utiliser comme ceci: Si tu fais ce genre de chose, je te conseille d'utiliser des typedefs plutôt que des notations comme

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ok



    Ceci n'est pas un pointeur mais un tableau de n pointeurs vers char



    et ceci un tableau tridimentionnel de pointeurs vers char



    Comme ce que tu me demandes n'a guère de sens, je vais répondre à une autre question. Premièrement, si y ou z sont des variables, il n'y a rien à faire. Si ce sont des constantes, que x est une constante aussi et que tu as un pointant vers un tableau de x*y*z char, tu peux le convertir sans risque en un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*pt_tab)[x][y][z] = (char (*)[x][y][z])wp;
    que tu peux utiliser comme ceci:Plus confortable, et permettant que x soit variable (mais pas y ou z), tu peux aussi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*pt_tab)[y][z] = (char (*)[y][z])wp
    que tu peux utiliser comme ceci: Si tu fais ce genre de chose, je te conseille d'utiliser des typedefs plutôt que des notations comme
    Ma question n'a guère de sens, mais c'est marrant on dirait que tu as quand même compris...

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par didierl
    Ma question n'a guère de sens, mais c'est marrant on dirait que tu as quand même compris...
    A vrai dire, elle n'a pas énormément de sens du simple fait que, quand tu déclare un tableau (uni ou multi dimentionnel), tu déclare aussi... un pointeur sur le premier élément, qui sert de pointeur sur le tableau lui meme...

    Hormis que l'un serait une allocation statique et que l'autre serait une allocation dynamique, le deux codes suivants seraient sensiblement pareils (disposer de 2*3*4=24 caractères, et en prenant quand meme un sérieux raccourcis):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char MaVar[2][3][4];
    char *ptr;
    ptr=malloc(sizeof (char*2*3*4));
    //en n'oubliant pas de vérifier la réussite de l'allocation ;-)
    Il est à noter que la représentation en mémoire sera exactement pareille, identique meme à un simple char MaVar[24], la seule différence apparaissant au niveau du nombre de cases mémoires qui sont passées lors de l'incrémentation de chaque dimention

    Si tu déclare un tableau (uni ou multi dimentionnel) de pointeurs sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* wp[x][y][z];
    il s'agira alors de veiller à ce qu'une adresse mémoire soit fournie pour chacun des 24 pointeurs dont du disposera...soit par allocation dynamique, soit par affectation d'une adresse à laquelle se trouve déjà un (tableau de) caractère(s)

    Pour un tableau à deux ou trois dimentions ne contenant "que" 24 éléments (qu'il s'agisse de caractères ou de pointeurs ), il est peut etre tout aussi facile de décider de travailler sur un tableau à une seule dimention et de faire le calcul soi meme:

    Avec x, y et z représentant les positions recherchées respectives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char caractrer[24];
    caractere[12*z+4*y+x];
    donnerait exactement le meme résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char caractere[2][3][4];
    caractere[z][y][x];
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Par défaut
    Citation Envoyé par koala01
    Salut,

    A vrai dire, elle n'a pas énormément de sens du simple fait que, quand tu déclare un tableau (uni ou multi dimentionnel), tu déclare aussi... un pointeur sur le premier élément, qui sert de pointeur sur le tableau lui meme...

    Hormis que l'un serait une allocation statique et que l'autre serait une allocation dynamique, le deux codes suivants seraient sensiblement pareils (disposer de 2*3*4=24 caractères, et en prenant quand meme un sérieux raccourcis):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char MaVar[2][3][4];
    char *ptr;
    ptr=malloc(sizeof (char*2*3*4));
    //en n'oubliant pas de vérifier la réussite de l'allocation ;-)
    Il est à noter que la représentation en mémoire sera exactement pareille, identique meme à un simple char MaVar[24], la seule différence apparaissant au niveau du nombre de cases mémoires qui sont passées lors de l'incrémentation de chaque dimention

    Si tu déclare un tableau (uni ou multi dimentionnel) de pointeurs sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char* wp[x][y][z];
    il s'agira alors de veiller à ce qu'une adresse mémoire soit fournie pour chacun des 24 pointeurs dont du disposera...soit par allocation dynamique, soit par affectation d'une adresse à laquelle se trouve déjà un (tableau de) caractère(s)

    Pour un tableau à deux ou trois dimentions ne contenant "que" 24 éléments (qu'il s'agisse de caractères ou de pointeurs ), il est peut etre tout aussi facile de décider de travailler sur un tableau à une seule dimention et de faire le calcul soi meme:

    Avec x, y et z représentant les positions recherchées respectives
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char caractrer[24];
    caractere[12*z+4*y+x];
    donnerait exactement le meme résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char caractere[2][3][4];
    caractere[z][y][x];
    Sauf à l'utiliser...

Discussions similaires

  1. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  2. Conversion de type
    Par sovitec dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2004, 14h29
  3. Conversion de type
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/08/2003, 10h00
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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