seb2086
Messages postés96Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention 1 février 2010
-
8 mars 2007 à 11:39
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 2010
-
11 mars 2007 à 17:30
Bonjour,
J'ai une variable char a[20] que je voudrais retourner dans une fonction mais je ne sais pas comment faire.
Merci pour votre aide.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 11 mars 2007 à 15:07
Pour éviter ce que tu fais, il suffit de diviser getData en deux:
getDataSize qui retourne pRes->row_count;
getData, qui récupère effectivement les données
Ca me semble aussi simple comme ca, mais c'est sans doute une question de goût.
J'insiste plutôt sur le fait que dans les différentes API qu'on peut trouver, les fonctions ne retournent jamais (normalement) de mémoire à libérer, et je pense que c'est un exemple à suivre.
Je m'appuie principalement sur l'API Win32 pour dire ça, par exemple :
GetWindowText : tu ne connais pas à l'avance la taille du texte, tu appelles donc GetWindowTextLength avant.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 11 mars 2007 à 15:59
J'espère bien. Tu imagine le chaos dans un code s'il fallait que certaines fonctions des API fasses à leur tête ? Il faudrait à chaque fois aller ce documenter à savoir si elle alloue ou non. Et encore, il faudrait savoir quel type d'allocation elle fait : HeapAlloc VirtualAlloc LocalAlloc etc. Il faudrait bien sûr libérer la mémoire avec le libérateur conséquent à l'allocateur. On se retrouverais avec une boullie de GlobalFree VirtualFree etc.
Et encore, si par exemple on a réservé une plage mémoire avec un HeapCreate (ou quelque chose dans le genre), on se trouverais à la gaspiller puisque la fonction alloue elle même la mémoire. On se retrouve avec des fragments éparpillés dans tout les coins de la mémoire.
Ceci dit, si c'est une fonction que tu n'utilisera QUE dans tes programmes et que tu sais ce que tu fais (prend en compte le fais que tu et peut-être les autres devrons relires le code plus tard pour des corrections), alors fais comme bon te semble. MAIS si ces fonctions serons exportées d'une lib ou d'une dll, oublie cette méthode ! Tu cours à la catastrophe avec ça.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 11 mars 2007 à 16:29
Mysql (mysql_store_resutl) retoune des fonctions (au moins une de tête) dont il faut liberer la memoire, la lib pcre aussi (pcre_compile). Il existe aussi des fonctions pour la liberation de cette memoire (mysql_free_result, pcre_free), ce que je fais bien sur aussi.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 11 mars 2007 à 17:05
Possible mais elle sont explicitement faite pour ça.
Même dans ce cas, tu peux t'apercevoir que la mémoire est libérée de façon différente.
Si on prend ton exemple, disons qu'on utilise MySQL avec la lib pcre.
On utilise mysql_store_result et pcre_compile en plus de diverses plages mémoire réservées par malloc. Si ces fonctions prenaient un pointeur sur la zone memoire pour stocker, on pourrait ce contenter de malloc et free.
Mais, vue que ce n'est pas le cas, il faut toute une panoplie de fonctions diverses pour allouer et libérer. Quelqu'un qui ne s'y connait pas vraiment ne comprendra rien du tout dans cet amalgam de malloc, free, mysql_free_result, pcre_free etc.
Il est préférable d'éviter cette méthode. Si elle est indispensable, très bien mais mieu vaut ne pas répendre son utilisation dans tout ses codes.
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 20103 11 mars 2007 à 17:30
Il est certain que je fais cela que quand j'en ai besoin...
Et je trouve, pour moi, que c'est assez simple.
par contre, comme la signalé vecchio56, je pourrais faire deux fonctions :
getDataSize qui retourne pRes->row_count;
getData, qui récupère effectivement les données
mais ici il faut effectuer la requete deux fois (et des fois elles sont longues car des conditions et surtout beaucoup de data) d'oui une grosse perte de temps.
Enfin, j'étais ravi de 'tailler le bout de gras' avec vous.