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 :

Pointeurs et changement de types louches


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Par défaut Pointeurs et changement de types louches
    Bonjour à tous. J'ai un problème bizarre : Je dois récupérer une image en niveaux de gris (0-255) en mémoire. Or, cette image est créée par une carte matrox, et est stockée dans un tableau à deux dimensions de types MIL_ID (spécial matrox). ce type occupe 4 octets (bizarerie : on a donc 4 pixels par élément du tableau) . Or, je voudrais récupérer les valeurs de chaque pixel pour les stocker dans un tableau de float (Float : également 4octets).

    Pour accéder à mes éléments, j'ai donc deux pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float *pfloat;
    MIL_ID *pmil;
    en toute logique, je fais pfloat = pmil. puisque les deux types occupent le même espace, puis je fais une boucle sur l'ensemble du tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(i=0 ; i<taille_x ; i++)
        for(j=0 ; j<taille_y ; j++)
           *pfloat = *pmil;
    or, grande surprise, je n'ai pas la même chose dans les deux tableaux. exemple, pour une case donnée, je vais avoir :
    *pmil = $C8C100FF par exemple (c'est donc juste, ce sont bien mes pixels)
    *pfloat = $20000000 (j'ai toujours un truc de ce genre, un chiffre puis que des 0).

    bref, je ne comprends pas pk mes données sont modifiées comme ça. J'ai essayé les opérateurs de cast, ça ne change rien !

    Merci à vous, et bravo si vous trouvez !!!

    Benjamin

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2006
    Messages : 77
    Par défaut
    Je ne comprends pas bien ton code, tu ne devrais pas créer un tableau de float ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0 ; i<taille_x ; i++)
    for(j=0 ; j<taille_y ; j++)
    *pfloat = *pmil;
    En quoi tu parcours ton image puisque tu recopies toujours la même valeur *pmil dans le même float *pfloat ???

    PS:

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    MIL_ID est un tableau à deux dimensions donc dans ce genre (supposons float)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef float** MIL_D
    Alors toi tu a un pointeur sur un MIL_D, ce qui equivaut à un float ***.
    Hors toi tu declare un simple float*pfloat.

    Après je ne sais pas comment on accede aux elements de MIL_D, donc je ne peux pas t'aider plus.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Par défaut
    Non, excusez moi je me suis mal exprimé. Le tableau à deux dimensions est uniquement dans notre tête. en réalité, les valeurs héxa de 0 à FF se suivent à la queue leuleu en mémoire (normal) et je décale un pointeur du début à la fin. Je gère moi même le "retour à la ligne" pour reconstituer l'image.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Et c'est où que tu décales des pointeurs .. moi je ne vois rien de tel dans le "peu" de code que tu as fournit, pour moi là, tu recopie toujours la même chose donc si tu veux une meilleure aide, fournit plus de code !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Il veut sans doute faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0 ; i<taille_x ; i++)
        for(j=0 ; j<taille_y ; j++)
           *pfloat++ = *pmil++;
    mais ça peut se faire avec un memcpy du tableau
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Par défaut
    oui pardon, c'est un bete oubli, bien sur j incrémente les deux pointeurs à chaque coup !

    C'est quoi cette histoire de memcopy ? je vais regarder de quoi ça parle, ça me semble interessant. Merci

Discussions similaires

  1. [Fortran] Changement de type
    Par sebduth dans le forum Fortran
    Réponses: 1
    Dernier message: 08/08/2005, 12h44
  2. PB changement de type d'un champ ds INTERBASE
    Par vanoou dans le forum InterBase
    Réponses: 3
    Dernier message: 03/01/2005, 17h24
  3. Changement de type
    Par spoutyoyo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 20/08/2004, 15h39
  4. [CR]Changement de type de base de donnée
    Par nabil dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/04/2004, 22h42
  5. changement de type pour un champ dans une table
    Par Missvan dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/02/2004, 15h26

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