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.
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.
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); } }
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 :
Le serveur crash avec comme message d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part PG_RETURN_POINTER(result);
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...
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.
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 !!!
Partager