PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  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  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Requête rebelle

Technique - optimisation | Requête rebelle

Par SangJun le 10/05/2007 - 16:41

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 :

strcpy(maRequete,"");
strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = ");
sprintf(resultChar,"%f\0",result);
strcat(maRequete,resultChar);
printf("%s\n",maRequete);

res = PQexec(conn,maRequete);
printf("OK\n");

Sur le terminal, j'ai comme résultat :
SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
Erreur de segmentation

Tandis que si je change le code par :
strcpy(maRequete,"");
strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000");
strcat(maRequete,resultChar);
printf("%s\n",maRequete);

res = PQexec(conn,maRequete);
printf("OK\n");
cela m'affiche :
SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
OK

Les chaînes de caractères sont pourtant identiques °_0

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

strcat n'alloue pas la mémoi

sparky/ = 10 Mai, 2007 - 16:48

strcat n'alloue pas la mémoire :-( Donc évidemment que tu as un SEGMENTATION FAULT si maRequete est trop petit.

Utilise strdup, mallloc, calloc et free, ou alors utilise ceci
(sous BSD et c'est de moi)

char *
pg_strcat(char *dest,const char *src)
{
char *tmp;
if ( src == NULL )
return dest;

if ( dest == NULL )
{
exit_horribly(NULL,NULL,"Cannot add to a NULL String\n");
}
tmp=malloc( (size_t) (strlen(dest)+strlen(src)+1) );
strcpy(tmp,dest);
strcat(tmp,src);
free(dest);
dest=tmp;

return dest;
}


J'ai donc mis la fonction :

SangJun/ = 10 Mai, 2007 - 17:00

J'ai donc mis la fonction :

char * pg_strcat(char *dest,const char *src)
{
char *tmp;
if ( src == NULL )
return dest;

if ( dest == NULL )
{
return NULL;
}
tmp=malloc( (size_t) (strlen(dest)+strlen(src)+1) );
strcpy(tmp,dest);
strcat(tmp,src);
free(dest);
dest=tmp;

return dest;
}

Et modifié les lignes en :

strcpy(maRequete,"");
strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = ");
sprintf(resultChar,"%f\0",result);
pg_strcat(maRequete,resultChar);
printf("%s\n",maRequete);

res = PQexec(conn,maRequete);
printf("OK\n");

Résultat :

*** glibc detected *** free(): invalid pointer: 0xbfde18d2 ***
Abandon

Je précise aussi que j'avais mis char maRequete[250], je ne saisis pas pourquoi la requête est bien dans la chaîne mais qu'il refuse de la lancer.


Ben évidemment : voici comme

sparky/ = 11 Mai, 2007 - 10:09

Ben évidemment : voici comment faire

char *maRequest;
char *resultChar:
/* strdup alloue la mémoire
*/
strdup(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = ");

/* ajoutez un test pour eviter que result > 59 car.
*/
resultChar = (char *) malloc(60);
/* normalement test pour s'assurer que malloc a marché
*/
sprintf(resultChar,"%f\0",result);

pg_strcat(maRequete,resultChar);
printf("%s\n",maRequete);

voilà; cela devrait être ok maintenant.


Je viens de lire ton post.

SangJun/ = 11 Mai, 2007 - 13:49

Je viens de lire ton post.

Je m'en suis sorti avec sprintf(resultChar,"%.0f",result);


Et en plus ma variable result

SangJun/ = 11 Mai, 2007 - 14:55

Et en plus ma variable resultChar est initialisée par char resultChar[16];

Erreur stupide :-/


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.