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 :

Probleme lors de la suppression de pointeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Par défaut Probleme lors de la suppression de pointeur
    Bonjour a tous, ca doit etre une erreur pas tres compliquée, mais ca fait longtemps que j'ai pas fait de c++.

    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
     
    #include <iostream>
    #include "windows.h"
    #include <stdint.h>
     
    using namespace std;
     
    void main()
    {
    	typedef int32_t (_stdcall *Ni845xFindDevice)(char *, unsigned int *, unsigned int *);
    	typedef void (_stdcall *Ni845xStatusToString)(int32_t, uint32_t , int8_t *);
    	HINSTANCE LoadME = LoadLibrary(L"C:\\Windows\\System32\\Ni845x.dll");
     
     
    	Ni845xFindDevice nifunc = (Ni845xFindDevice) GetProcAddress(LoadME, "ni845xFindDevice");
    	Ni845xStatusToString nifunc2 = (Ni845xStatusToString) GetProcAddress(LoadME, "ni845xStatusToString");
     
    	char *pFirstDevice=new char[1024];
    	int8_t * output = new int8_t;
    	int32_t out1 = nifunc (pFirstDevice,NULL,NULL);
    	nifunc2(out1,36,output);
     
    	cout << output << endl;
    	delete [] pFirstDevice;
    	//delete output;
    };
    Aucun probleme avec la 1ere fonction que je recupere de la dll.
    Par contre la 2e, qui traduit la réponse de la premiere me pose des problemes.
    out1 est le truc a traduire, le 2nd argument, la taille du buffer de réponse, le 3e argument le pointeur ou va la réponse traduite.

    Le probleme se situe sur le pointeur output (et peut etre sur la taille du buffer)

    des que je decommente "delete output" j'obtiens ces erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Windows a déclenché un point d'arrêt dans test2.exe.
     
    Cela peut être dû à une défaillance du tas qui indique un bogue dans test2.exe ou l'une des DLL chargées.
    avec un magnifique
    HEAP[test2.exe]: Heap block at 005550F8 modified at 00555125 past requested size of 25

    Si j'enleve le delete tout va bien.

    et 2e chose, si j'augment la taille du buffer a plus de 36, j'ai plein de
    Violation d'accès lors de la lecture de l'emplacement 0xdddddddd.

    mais la valeur output prend toujours une valeur cohérente apres la fonction, c'est toujours a la suppression, ou a la fin du programme quil y a un probleme.
    La doc liée a la dll est la www.ni.com/pdf/manuals/371746c.pdf si vous voulez plus de détails sur les fonctions (section SPI for C)

    PS : je suis sous visual studio 2010 express

    merci de votre aide

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    out1 est le truc a traduire, le 25nd argument, la taille du buffer de réponse, le 3e argument le pointeur ou va la réponse traduite.
    Si le deuxième argument est la taille du buffer de réponse, alors cela veut dire qu'il faut passer un tableau dans le troisième argument, et pas un unique int8_t, non ?

    D'ailleurs, je ne comprends pas trop le recours à l'allocation dynamique dans ce cas (new[]/delete[]) pourquoi ne pas faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char pFirstDevice[1024];
    int8_t output[36];
    int32_t out1 = nifunc (pFirstDevice, NULL, NULL);
    nifunc2(out1, 36 , output);
     out << output << endl;

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Juin 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2012
    Messages : 15
    Par défaut
    la fonction définie dans la dll demande des pointeurs

    Mais j'ai testé sans, ca marche bien.


    Dans la doc la fonction est définie comme ca :
    void ni845xStatusToString (int32 StatusCode,uInt32 MaxSize,int8 * StatusString);

    Faut que je revise mes bases sur les fonctions et les pointeurs pour comprendre pourquoi mettre un pointeur plutot qu'une variable normale

    edit : j'ai compris, je me mélangeais avec les pointeurs et les tableaux

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Utilise un vector (ou mieux : un array si tu es sur C++11), et envoie comme pointeur l'adresse du premier élément.

Discussions similaires

  1. probleme lors de la suppression d`un element du panier
    Par lucaazori1988 dans le forum Langage
    Réponses: 1
    Dernier message: 14/05/2010, 11h42
  2. Réponses: 4
    Dernier message: 22/05/2006, 14h22
  3. [8i][DBA] probleme lors de suppression d'un user
    Par sali dans le forum Oracle
    Réponses: 4
    Dernier message: 11/02/2006, 00h40
  4. [JDBC] Problème lors d'un suppression
    Par Cyborg289 dans le forum JDBC
    Réponses: 5
    Dernier message: 13/09/2005, 10h06
  5. Probleme lors d'une suppression
    Par DrTank dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2005, 17h38

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