Requête rebelle [PostgreSQL et C] - SQL/NoSQL - Programmation
Marsh Posté le 10-05-2007 à 16:54:11
A mon avis, il y a des chances pour que l'erreur vienne de ta chaine de caractères maRequete ou res.
Tu lui as donné quelle taille ?
Tu as essayé de débugger ton programme ?
Marsh Posté le 10-05-2007 à 17:02:49
J'ai mis char maRequete[250], ce que je ne saisis pas c'est que PQexec(conn,maRequete) fonctionne dans un cas mais pas dans un autre qui semble identique (conn ne change pas, maRequete semble identique).
Marsh Posté le 10-05-2007 à 17:17:04
Comportement aléatoire => l'erreur se situe ailleurs. Donne-nous la fonction complète.
Néanmoins, plusieurs remarques :
Marsh Posté le 10-05-2007 à 17:20:00
Est-ce que ce ne serait pas un problème de transtypage ?
Je veux dire ton result est manifestement calculé en variables numériques, et tu le mets ici comme string et le problème se situe là ...
Marsh Posté le 10-05-2007 à 17:21:46
ZeBix a écrit : Est-ce que ce ne serait pas un problème de transtypage ? |
Euh, non, parce que sprintf().
Marsh Posté le 11-05-2007 à 13:29:38
Je m'en suis sorti avec sprintf(resultChar,"%.0f",result);
Marsh Posté le 11-05-2007 à 13:37:57
Non, tu as seulement une configuration qui ne déclenche pas de segfault sur ton problème de gestion mémoire.
Le C c'est pas magique, hein. C'est pas en touchant à des trucs au hasard que ça va fonctionner.
Je subodore que resultChar est une cause possible de ton problème.
Montre ta fonction.
Marsh Posté le 11-05-2007 à 13:57:50
utilise PQexecParams
ou prepare ExecPrepared
Marsh Posté le 11-05-2007 à 14:46:18
resultChar n'apparaît qu'en début de fonction :
Code :
|
et dans le bout de code que j'ai copié en début de topic :
Code :
|
Marsh Posté le 11-05-2007 à 14:50:23
SangJun a écrit : resultChar n'apparaît qu'en début de fonction :
|
Ah, quand même !
Bon.
resultChar pèse 16, donc 15 caractères libres + 1 caractère terminateur.
"62500001887857.000000" mesure... 21 ! Il faut au minimum une chaîne de 22 caractères de long pour contenir ce nombre sous forme de chaînes de caractères.
Donc, tu as un dépassement de capacité, et tu dois empiéter sur une zone mémoire utilisée par autre chose. D'où les segmentation fault aléatoires, qui disparaissent quand tu n'utilises plus resultChar.
Marsh Posté le 11-05-2007 à 14:53:51
Mais pourquoi je ne l'ai pas vu avant !!!!!
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique.
Marsh Posté le 11-05-2007 à 14:54:17
Mais pourquoi je ne l'ai pas vu avant !!!!!
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique
Marsh Posté le 11-05-2007 à 14:58:48
d'où l'intérêt d'utiliser des fonctions comme snprintf(), strncat(), strncpy() etc.
Marsh Posté le 11-05-2007 à 15:09:35
Ah ! Je savais bien que c'était un problème de tableau, sauf que je n'avais pas très bien situé l'erreur
Marsh Posté le 11-05-2007 à 15:09:44
ouais enfin cette méthode de zouave pour faire des requêtes c'est de l'injection SQL
Marsh Posté le 11-05-2007 à 15:22:12
Ouais, après c'est sûr qu'il vaut mieux composer avec les fonctions spécificiques de l'API postgresql...
Marsh Posté le 11-05-2007 à 15:56:15
et les palce holders peuvent sauver, pour les plus grosses requetes ^^
Marsh Posté le 10-05-2007 à 16:43:32
Bonjour,
Je n'arrive pas à exécuter 2 requêtes, la première passe sans problème. La seconde me met un Segmentation Fault.
Quand je rentre la requête manuellement, pas de soucis, lorsque je l'ajoute par "calcul", ça ne marche plus.
C'est-à-dire que :
Sur le terminal, j'ai comme résultat :
Tandis que si je change le code par :
cela m'affiche :
Les chaînes de caractères sont pourtant identiques