(Courriels de diversion: <prevaudrions@recommandables-suspectees.com> <internationalisees@gît-electorale.com> <jardine@decachetais-mediantes.com> <couvre-chefs@preencollee-moka.com> <reinsererait@reorienterait-horrifiions.com> <allergiques@dejaunissaient-blâmerait.com> <emporterait@bloquiez-rameras.com> <croquez@minerais-resoudrais.com> <chiffonnons@attentant-pied-de-poule.com> <combattront@coalescence-mesuser.com> )
marc Thirion wrote: > > Le 5 Jan, Philippe CASIDY écrit : > > On 5 Jan, benech wrote: > > >> je developpe sous Motif 1.2 et une des fonctions classiques ne > >> fonctionne pas. En effet, je souhaite liberer l espace memoire occupe > >> par une XmStringTable. > >> > >> Dans le manuel de reference, il est indique de pratiquer de la > >> maniere suivante > >> : > >> void FreeXmStringTable(argv) > >> XmStringTable argv; > >> { > >> register int i; > >> if(!argv) > >> return; > >> for(i=0; argv[i];i++) > >> XmStringFree(argv[i]); > >> XtFree(argv); > >> } > >> > >> Or la fonction XtFree n accepte pas une XmStringTable en argument!!! > >> > > > > A tout hasard, il n'y aurait pas une fonction XmFree() ? > > Non. Tout n'est pas redéfini. Dans l'optique Motif, soit tu as un type > opaque (et donc des *Free), soit la structure est exposée et tu n'as pas > forcément de Free spécifique. > > Donc, soit il existe XmStringTableFree, soit il faut faire un XtFree. > > Dans ce dernier cas, le problème rencontré par Nathalie est sans doute > du au fait que XtFree déclare prendre un pointeur sur caractère en > argument (pourquoi tant de haine ?), et pas un pointeur sur XmString. > > Il suffit vraisemblablement de forcer le type de l'argument à l'appel, > du style : XtFree((char *)argv). > Salut, Je vais jouer au puriste (car je pense que Marc a donné la solution, à une question pas trop précise ...). En fait, l'idéal serait de savoir qui a alloué argv. D'où vient la supposition que c'est XtMalloc ? Personnellement, ça me choque un peu de libérer par XtFree un pointeur dont je ne sais pas comment il a été alloué. Par ailleurs, je préférerais faire XtFree((XtPointer)argv)... car j'aurais préféré que l'interface de XtFree soit void XtFree(XtPointer ptr) au lieu de void XtFree(char *ptr) comme on peut hélas le lire dans /usr/X11R6/include/X11/Intrinsic.h. Question de cohérence... C'est vrai que côté typage fort, pour ne pas dire programmation objet, le langage C, même dans sa version ANSI, est un peu cavalier avec sa notion de cast (qui permet de faire passer des vessies pour des lanternes, aux risques et périls (calculés ?) du programmeur) ! Bon, pour se rassurer tout à fait, on peut aller voir les sources des widgets concernés à condition d'utiliser Lesstif ou OpenMotif ... et surement pas Motif 1.2 qui n'est pas du tout un logiciel libre (à moins d'etre assez fortuné pour avoir acheté les sources de Motif : serait-ce le cas du CNES ? ;-) ). Pour ma part, je suis allé voir rapidement lesstif-0.89.0/lib/Xm/List.c, ce qui m'a (partiellement) rassuré, au moins pour les selected_items gérés par ce widget List : Allocation : selected_items = (XmString *) XtMalloc(List_SelectedItemCount(w) * sizeof(XmString)); Désallocation : for (i = 0; i < List_SelectedItemCount(w); i++) { XmStringFree(selected_items[i]); } XtFree((XtPointer)selected_items); A+ -- Phil --------------------------------------------------------------------- Aide sur la liste: <URL:mailto:linux-31-help@savage.iut-blagnac.fr>Le CULTe sur le web: <URL:http://www.CULTe.org/>