Fonction retournant un char[20]

Résolu
seb2086 Messages postés 96 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 1 février 2010 - 8 mars 2007 à 11:39
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Derniè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.

25 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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.

C++ (@++)<!--
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
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.

Matt...
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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.

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
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.

Bonne soirée,

Matt...
0
Rejoignez-nous