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

PostgreSQL Discussion :

DLL pour postgreSQL : erreur violation d'accès


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Par défaut DLL pour postgreSQL : erreur violation d'accès
    Bonjour,

    J'en suis toujours à déboguer mon code et j'ai un gros problème : mes fonctions IN et OUT semblent faire n'importe quoi.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    // complex.cpp : Defines the exported functions for the DLL application.
    //
     
    extern "C" {
     
    	#include "postgres.h"
     
    	#include "fmgr.h"
    	#include "libpq/pqformat.h"	/* needed for send/recv functions */
     
    	PG_MODULE_MAGIC;
     
    }
     
    class Complex
    {
    public:
    	void set(double x, double y){
    		this->x=x;
    		this->y=y;
    	}
    	double get_x() {
    		return (x);
    	}
    	double get_y() {
    		return (y);
    	}
     
    private:
    	double		x;
    	double		y;
    };
     
     
    extern "C" {
     
    __declspec(dllexport) Datum		complex_in(PG_FUNCTION_ARGS);
    __declspec(dllexport) Datum		complex_out(PG_FUNCTION_ARGS);
     
     
    /*****************************************************************************
     * Input/Output functions
     *****************************************************************************/
     
    PG_FUNCTION_INFO_V1(complex_in);
     
    Datum
    complex_in(PG_FUNCTION_ARGS)
    {
    	char	   *str = PG_GETARG_CSTRING(0);
    	double		x,
    				y;
    	Complex    *result;
     
    	sscanf(str, " ( %lf , %lf )", &x, &y);
     
    	result = (Complex *) palloc(sizeof(Complex));
    	result->set(x,y);
    	PG_RETURN_POINTER(result);
    }
     
    PG_FUNCTION_INFO_V1(complex_out);
     
    Datum
    complex_out(PG_FUNCTION_ARGS)
    {
    	Complex    *complex = (Complex *) PG_GETARG_POINTER(0);
    	char	   *result;
     
    	result = (char *) palloc(100);
    	snprintf(result, 100, "(%g,%g)", complex->get_x(), complex->get_y());
    	PG_RETURN_CSTRING(result);
    }
     
     
    }
    Le code ci-dessus est un exemple avec la classe Complex. Le code de mes fonctions IN et OUT est exactement identique à celles-ci, juste remplacer le nom de la Classe Complex par le nom de ma classe.

    Or, quand je teste avec une table vide, j'insère une première ligne ce qui fait appel à la fonction IN. Je suis pas à pas avec le déboggeur tout se passe bien. Ensuite, si je veux afficher le contenu de ma table et voir la ligne que je viens d'insérer (ce qui fait appel à la fonction OUT). Je constate que les valeurs stockées n'ont rien à voir avec ce que j'ai introduit !! Visiblement, le pointeur récupéré par la fonction OUT n'est pas correct...

    Mais, ce n'est là que le plus petit de mes problèmes.
    En effet, quand je tente d'insérer une deuxième ligne dans ma table, encore une fois je suis pas à pas l'exécution. Tout se passe bien mais arrivé à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PG_RETURN_POINTER(result);
    Le serveur crash avec comme message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception de première chance à 0x7854464c dans postgres.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x03f2d000.
    Exception non gérée à 0x7854464c dans postgres.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x03f2d000.
    Je ne comprends pas ce qui se passe, ni pourquoi j'ai cette erreur avec mon code et pas avec l'exemple Complex. La seule différence que j'ai pu noter entre ma classe et la classe Complex est que ma classe hérite d'une autre classe, qui hérite elle-même d'une autre classe etc. 6 fois...

    Est-ce que le problème d'allocation mémoire viendrait-il de là (héritage) ? Comment le corriger ? Svp aidez-moi car vraiment c'est un casse-tête chinois pour moi !!!

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 4
    Par défaut
    Je ne comprends pas

    J'ai modifié l'exemple Complex pour voir ce que ça donner avec un héritage et ça fonctionne toujours très bien.

    Voici l'exemple complex modifié :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    // complex.cpp : Defines the exported functions for the DLL application.
    //
     
    extern "C" {
     
    	#include "postgres.h"
     
    	#include "fmgr.h"
    	#include "libpq/pqformat.h"		/* needed for send/recv functions */
     
    	PG_MODULE_MAGIC;
     
    }
     
     
    class ComplexX
    {
    public:
    	ComplexX(double x){
    		this->x=x;
    	}
    	void set_x(double x){
    		this->x=x;
    	}
    	double get_x() {
    		return (x);
    	}
     
    private:
    	double		x;
    };
     
     
    class ComplexY : public ComplexX
    {
    public:
    	ComplexY(double x, double y):ComplexX(x){
    		this->y=y;
    	}
    	void set_y(double y){
    		this->y=y;
    	}
     
    	double get_y() {
    		return (y);
    	}
     
    private:
    	double		y;
    };
     
     
    extern "C" {
     
    __declspec(dllexport) Datum		complex_in(PG_FUNCTION_ARGS);
    __declspec(dllexport) Datum		complex_out(PG_FUNCTION_ARGS);
     
     
    /*****************************************************************************
     * Input/Output functions
     *****************************************************************************/
     
    PG_FUNCTION_INFO_V1(complex_in);
     
    Datum
    complex_in(PG_FUNCTION_ARGS)
    {
    	char	   *str = PG_GETARG_CSTRING(0);
    	double		x,
    				y;
    	ComplexY    *result;
     
    	sscanf(str, " ( %lf , %lf )", &x, &y);
     
    	result = (ComplexY *) palloc(sizeof(ComplexY));
    	result->set_x(x);
    	result->set_y(y);
    	PG_RETURN_POINTER(result);
    }
     
    PG_FUNCTION_INFO_V1(complex_out);
     
    Datum
    complex_out(PG_FUNCTION_ARGS)
    {
    	ComplexY    *complex = (ComplexY *) PG_GETARG_POINTER(0);
    	char	   *result;
     
    	result = (char *) palloc(100);
    	snprintf(result, 100, "(%g,%g)", complex->get_x(), complex->get_y());
    	PG_RETURN_CSTRING(result);
    }
     
    }
    Et voici la partie de mon code qui me pose problème :

    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
    extern "C" { 
     
    // DATE_SEC_IN
    PG_FUNCTION_INFO_V1(date_sec_in);
     
    Datum date_sec_in(PG_FUNCTION_ARGS)
    {
    	char *str = PG_GETARG_CSTRING(0);
    	long y;
    	unsigned short m, d, h, min;
    	double sec;
    	d_Timepoint_sec *result;
     
    	if (sscanf(str, " ( %ld , %hu, %hu, %hu, %hu, %lf )", &y, &m, &d, &h, &min, &sec) != 6)
    		ereport(ERROR,
    				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
    				 errmsg("invalid input syntax for date: \"%s\"",
    						str)));
     
    	result = (d_Timepoint_sec *) palloc(sizeof(d_Timepoint_sec));
    	result->set_year(y);
    	result->set_month(m);
    	result->set_day(d);
    	result->set_hour(h);
    	result->set_minute(min);
    	result->set_second(sec);
    	PG_RETURN_POINTER(result);
    }
     
    // DATE_SEC_OUT
    PG_FUNCTION_INFO_V1(date_sec_out);
     
    Datum date_sec_out(PG_FUNCTION_ARGS)
    {
    	d_Timepoint_sec *timep_sec = (d_Timepoint_sec *) PG_GETARG_POINTER(0);
    	char *result;
    	result = (char *) palloc(100);
    	snprintf(result, 100, "(%ld,%hu,%hu,%hu,%hu,%lf)", timep_sec->year(), timep_sec->month(), timep_sec->day(), timep_sec->hour(), timep_sec->minute(), timep_sec->second());
    	PG_RETURN_CSTRING(result);
    }
     
    }
    Si ce n'est pas dû à l'héritage, qu'est-ce que ça peut-être ??

Discussions similaires

  1. Développer une DLL pour postgresql.
    Par vaness7 dans le forum Extensions
    Réponses: 5
    Dernier message: 22/08/2011, 17h17
  2. strToIntDef et erreur "Violation d'acces.."
    Par villerose_ws dans le forum Langage
    Réponses: 10
    Dernier message: 06/08/2010, 11h51
  3. Réponses: 2
    Dernier message: 28/04/2010, 18h59
  4. Réponses: 2
    Dernier message: 18/11/2007, 09h11
  5. Erreur violation d'accès
    Par James64 dans le forum Langage
    Réponses: 5
    Dernier message: 02/12/2005, 16h54

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