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 données ? Affichages différents selon type d'application


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 34
    Points : 24
    Points
    24
    Par défaut Conversion de données ? Affichages différents selon type d'application
    Bonjour/bonsoir à tous,

    Me lançant dans la programmation tactile sous windows 7, je rencontre un petit soucis d'encodage ? de stockage ? de donner.

    Les applications utilisant le tactile de windows 7 sont généralement des applications WIN32 avec sa syntaxe bien connu (windowshandle, hinstance, etc...), bref, l'application de base dont je me suis inspirée est développée comme ça et marche impecc!

    Là, vu que cela fait 1 an que je travaille sur mon projet, défini en glut car, ici mon code doit être exécuté sur tout type d'os... mon programme est donc un programme "classique" type c/c++ (int main() etc...)

    J'arrive à "capter" les touch de mon interface tactile dans mon programme, et surtout à identifier que cela est bien un "touch".

    Mais je n'arrive pas à afficher les informations de façon à les afficher !

    En fait, je récupère une structure du type TOUCHINPUT, définie ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct _TOUCHINPUT {
      LONG      x;
      LONG      y;
      HANDLE    hSource;
      DWORD     dwID;
      DWORD     dwFlags;
      DWORD     dwMask;
      DWORD     dwTime;
      ULONG_PTR dwExtraInfo;
      DWORD     cxContact;
      DWORD     cyContact;
    } TOUCHINPUT, *PTOUCHINPUT;
    lorsque je veux afficher (j'utilise un ostringstream que je balance en sortie standard, en console)...

    J'ai du n'importe quoi ! genre -645545431234

    et cela ne varie pas !

    Or que sur l'application démo dont je me suis inspirer, c'est exactement le même principe qui est utilisé !

    Est-ce un problème au niveau de mon type d'appli ? (Je développe sous VS2008) ?

    J'avoue... j'ai jamais vu ça....

    Merci à vous de votre aide, d'avance...

    Bonne soirée

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Je n'ai pas compris ce que tu voulais afficher ??

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Pourrais-tu montrer le bout de code. On dirait que ta zone n'est pas initialisée ou que tu déréférences une mauvaise adresse ou que tu écris un pointeur(?) ... bref quelque chose de bizarre dans ce que tu essaies d'afficher.

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Alors, je vais essayé de mettre des bouts de codes, parce que mon projet prends énormément de place...

    Alors premièrement les variables globales, et prototypes...

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /********* Multitouch *********/
     
    #define MAX_LOADSTRING 100
     
    #include <sstream>
     
    #include "targetver.h"
    #include "resource.h"
     
    // C RunTime Header Files
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>
     
    #ifdef _WIN32
    HWND		windowHandle;
    HINSTANCE	hInstance; 
    HDC			deviceContext;
     
    // Prototypages de functions
    LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam );
    void PrintTouch(TOUCHINPUT* ti);
     
    #endif
    /******************************/
    je ne mets pas le fichiers resources.h qui ne contient de des défines...

    Ensuite le code de mes fonctions...

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    void PrintTouch(TOUCHINPUT ti)
    {
    	ostringstream wss;
     
    	wss << "ID: " << ti.dwID << " ";
    	wss << "x: " << ti.x << " ";
    	wss << "y: " << ti.y << " ";
     
     
    	if(ti.dwFlags & TOUCHEVENTF_MOVE)
    		wss << "TOUCHEVENTF_MOVE ";
    	if(ti.dwFlags & TOUCHEVENTF_DOWN)
    		wss << "TOUCHEVENTF_DOWN ";
    	if(ti.dwFlags & TOUCHEVENTF_UP)
    		wss << "TOUCHEVENTF_UP ";
    	if(ti.dwFlags & TOUCHEVENTF_PRIMARY)
    		wss << "TOUCHEVENTF_PRIMARY ";
     
    	printf("%s\n",wss.str().c_str());
    }
     
    LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam )
    {
        UINT cInputs = LOWORD(wParam);
     
    	int x = 0;
    	int y = 0;
     
     
     
    	PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
    	GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT));
    	printf("%d\n",cInputs);
    	for (UINT i=0; i < cInputs; i++)
    	{
    			TOUCHINPUT ti = pInputs[i];
     
                PrintTouch(ti);
        }            
     
        delete [] pInputs;
    	ReleaseDC(hWnd, deviceContext);
    	return 0;
    }
    Ici le code de mon "main"...

    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
    16
    17
    18
    19
    20
    21
    22
     
     
    ....
    glutCreateWindow(windowTitle);
     
    	#ifdef _WIN32
    		// Multitouch Windows
    	    HWND windowHandle = FindWindow(NULL,title.c_str());
    		deviceContext = GetDC(windowHandle);		
    		RegisterTouchWindow(windowHandle, 0);
     
    	#endif
     
        glutDisplayFunc(redraw);
        //glutMouseFunc(mousebuttonfunc);
        glutMotionFunc(mousemotionfunc);
        glutKeyboardFunc(keyboardfunc);
        glutIdleFunc(idle);
     
        resetview();
     
        glutMainLoop();
    Ici le code concernant le multitouch de ma fonction idle de callback.

    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
    16
     
    void idle()
    {
       ...
     
    	MSG msg;
    	PeekMessage(&msg, windowHandle, 0, 0,1);
    	TranslateMessage(&msg);
    	switch(msg.message)
    	{
    		case WM_TOUCH:
    			OnTouch(msg.hwnd, msg.wParam, msg.lParam);
    			need_redraw();
            break;
    	}
    }

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    Dans ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam )
    Tu définis x et y mais tu ne les utilises pas.
    De plus vu le chiffre affiché je dirais que tu as de grand chance d'afficher simplement une variable qui n'est pas initialisée ou modifiée.
    Homer J. Simpson


  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Le prototype de PrintTouch définit un pointeur sur TOUCHINPUT, alors que l'entête de la fonction définit un structure.
    Normalement le compilateur aurait du le dire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void PrintTouch(TOUCHINPUT* ti);
    //Puis
    void PrintTouch(TOUCHINPUT ti)
    {
    ...
    Je pense qu'il vaut mieux passer un pointeur, et dans la fonction, ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	wss << "ID: " << ti->dwID << " ";
    	wss << "x: " << ti->x << " ";
    	wss << "y: " << ti->y << " ";
    Mais c'est mon opinion, les références c'est très bien aussi.

  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Je pense qu'il vaut mieux passer un pointeur,Mais c'est mon opinion, les références c'est très bien aussi.
    Un pointeur uniquement si tu peux accepter un paramètre nulle. Sinon toujours référence . Un pointeur = 4 octets en plus, une référence = 0 octets en plus
    Homer J. Simpson


  8. #8
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Un pointeur uniquement si tu peux accepter un paramètre nulle. Sinon toujours référence . Un pointeur = 4 octets en plus, une référence = 0 octets en plus
    Ha bon ?
    Et comment font les compilateurs pour générer des références qui font zéro octet ? Par magie ?

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    As-tu testé le retour de l'appel à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT));

  10. #10
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Et comment font les compilateurs pour générer des références qui font zéro octet ? Par magie ?
    Un pointeur est l'adresse du pointeur + la référence de l'objet. Une référence c'est directement une adresse. Il n'y a pas d'indirection supplémentaire. Une référence est un alias. il n'y a pas de demande mémoire supplémentaire. Un référence est donc 0 octets supplémentaire par rapport au pointeur qui lui en prendra 4 de plus (l'adresse du pointeur). une référence gagne sur tout les plans, taille et vitesse.
    Homer J. Simpson


  11. #11
    Invité
    Invité(e)
    Par défaut
    Oui, il s'agit de cas généraux.
    Dans le cas présent, le structure concernée doit faire partie des déclarations permanentes (global, classe de base). C'est pour cela qu'il me semble préférable de créer un pointeur à l'ouverture et le libérer à la fermeture.
    D'ailleurs, moi, je décrirais plutout la structure comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct _TOUCHINPUT {
      LONG      x;
    ...
    ...
      DWORD     cyContact;
    } TTOUCHINPUT;
    typedef TTOUCHINPUT*  ptrToucheInput;
    C'est à dire que ptrToucheInput est "un pointeur sur TTOUCHINPUT qui est une structure de type TOUCHINPUT"
    Dernière modification par Invité ; 08/11/2010 à 11h20. Motif: Affichage simplifié de la structure de DjDavOnline

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Un pointeur est l'adresse du pointeur + la référence de l'objet. Une référence c'est directement une adresse. Il n'y a pas d'indirection supplémentaire. Une référence est un alias. il n'y a pas de demande mémoire supplémentaire. Un référence est donc 0 octets supplémentaire par rapport au pointeur qui lui en prendra 4 de plus (l'adresse du pointeur). une référence gagne sur tout les plans, taille et vitesse.

    Je te conseille de regarder le code assembleur généré par l'utilisation d'un pointeur et d'une référence (disons dans un environnement type windows/linux avec un compilo mainstream gcc, visual, dm, ...). Il y a des chances que ce soit le même. Une référence ne prend pas 0 octets. En terme d'implémentation, une référence et un pointeur sont souvent implémentés de la même façon.

    Question : que devrait afficher le code suivant ? 4/0/1 ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    template<typename T>
    struct s
    {
        T t;
    };
    int main()
    {
        std::cout<<sizeof(s<char*>)<<"\n";
        std::cout<<sizeof(s<char&>)<<"\n";
        std::cout<<sizeof(s<char>)<<"\n";
     
        return 0;
    }

    Citation Envoyé par Pierre Dolez Voir le message
    .
    D'ailleurs, moi, je décrirais plutout la structure comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct _TOUCHINPUT {
      LONG      x;
      LONG      y;
      HANDLE    hSource;
      DWORD     dwID;
      DWORD     dwFlags;
      DWORD     dwMask;
      DWORD     dwTime;
      ULONG_PTR dwExtraInfo;
      DWORD     cxContact;
      DWORD     cyContact;
    } TTOUCHINPUT;
    typedef TTOUCHINPUT*  ptrToucheInput;
    C'est à dire que ptrToucheInput est "un pointeur sur TTOUCHINPUT qui est une structure de type TOUCHINPUT"
    On transmettra le message à win32@microsoft.com

  13. #13
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Je te conseille de regarder le code assembleur généré par l'utilisation d'un pointeur et d'une référence (disons dans un environnement type windows/linux avec un compilo mainstream gcc, visual, dm, ...). Il y a des chances que ce soit le même. Une référence ne prend pas 0 octets. En terme d'implémentation, une référence et un pointeur sont souvent implémentés de la même façon.

    Question : que devrait afficher le code suivant ? 4/0/1 ? :
    Hum... pas faux ok pour la mémoire, mais la référence reste tout de même un accès plus rapide.
    Une référence en paramètre de fonction prend autant de place qu'un pointeur? Pour une instanciation je suis ok mais pour un paramètre, je n'en suis pas sur, à l'exécution un programme utilisant 1 fonction avec 1 pointeur en paramètre demandera la même taille que le même programme avec 1 référence à la place?
    Homer J. Simpson


  14. #14
    Invité
    Invité(e)
    Par défaut
    Bon, à l'évidence vous vous moquez.
    Mes sources c'est Borland.
    D'ailleurs expliquez tout de même ce qui est si drôle, moi, j'ai à peu près terminé de développer, sauf pour aider l'un ou l'autre, mais je suppose qu'il y en a qui aimeraient comprendre.

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Hum... pas faux ok pour la mémoire, mais la référence reste tout de même un accès plus rapide.
    Aucune raison pour cela.

    Citation Envoyé par Astraya Voir le message
    Une référence en paramètre de fonction prend autant de place qu'un pointeur?
    Il y a des chances que oui

    Citation Envoyé par Astraya Voir le message
    Pour une instanciation je suis ok mais pour un paramètre, je n'en suis pas sur, à l'exécution un programme utilisant 1 fonction avec 1 pointeur en paramètre demandera la même taille que le même programme avec 1 référence à la place?
    Fais le test.

    D'un point de vue du langage une référence et un pointeur sont deux choses très différentes. En terme de code généré, une référence et un pointeur sont souvent implémentés de la même façon : une zone (sur le tas/la pile ou un registre) contenant une adresse vers l'objet référencé/pointé. Au compilateur le boulot de vérifier que les utilisations sont correctes par rapport au langage et de générer le code correspondant à la sémantique spécifiée par la norme.

  16. #16
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Effectivement, c'est marrant mais j'étais vraiment persuadé de ça.. ou je suis allez chercher cette idée va savoir Merci en tout cas
    Je trouve quand même étrange que le compilateur ne procède pas à des optimisations plus drastique sur les références. Ou alors il les fait et les fait aussi pour les pointeurs.
    En tout cas merci.
    Homer J. Simpson


  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour 3DArchi,
    On transmettra le message à win32@microsoft.com
    J'ai simplifié l'affichage de la structure de DjDavOnline. Et j'ai en particulier fait disparaitre ces horribles DWORD (sauf le dernier).
    En tour cas je suis content que ma réponse
    Je pense qu'il vaut mieux passer un pointeur, et dans la fonction, ce sera
    ...
    Mais c'est mon opinion, les références c'est très bien aussi.
    ait provoqué cet intéressant débat entre spécialistes.
    Dernière modification par 3DArchi ; 08/11/2010 à 12h14. Motif: HS

  18. #18
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    Merci à vous pour vos réponses.

    Je vois que les problèmes d'allocation mémoire, pointeurs, etc... font toujours parler...

    Citation Envoyé par 3DArchi Voir le message
    As-tu testé le retour de l'appel à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT));

    Oui, justement, cette fonction, retourne bien une erreur, j'ai récupéré le dernier code d'erreur et en effet, le "handle" est invalide (ici cela doit être le handle de la fenêtre) est invalide, or, bizarrement, j'arrive bien à "enregistrer" ma fenêtre comme multitouch, donc il n'est pas vraiment invalide ?

    Bizarre...

Discussions similaires

  1. [PDF] Données affichées différentes selon l'outil d'affichage utilisé
    Par Jipété dans le forum Bureautique
    Réponses: 4
    Dernier message: 02/10/2014, 11h53
  2. Affichage différent selon URL de provenance
    Par BnA dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/08/2007, 14h30
  3. affichage différent selon résolution
    Par altadeos dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/12/2006, 11h58
  4. [Dates] affichage différent selon le mois en cours
    Par itri2005 dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2006, 17h05
  5. Affichage différent selon texte dans une case
    Par pingoo78 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 16h32

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