Aide - Recherche - Membres - Calendrier
Version complète : Help! un fatal error
Les Forums de PalmAttitude.org > GENERAL PalmOS > Développement sous PalmOS
Destino
J'ai un fatal error qd je teste mon appli sur le simulator, mais (pour l'instant) aucune error sur le Clié.
l'error en question est:
MemoryMgr.c, Line:3650, Non-word-aligned handle

Quelqu'un saurait-il d'où provient l'erreur et comment y remedier?
Merci pour toutes les aides.
g peur d'avoir la même erreur +tar sur le Clié
Patrice
En simplifiant un poil : tu utilises un handle invalide.
Destino
tu peux etre un peu + clair STP.
Merci
Patrice
Je ne crois pas mais je peux essayer : tu dois utiliser quelque part un handle qui s'avère invalide pour le système.
Destino
Supposons que tu dis vrai:
-Comment est ce que je peux savoir d'où l'erreur et la corriger?
-Pourquoi l'erreur n'est que sur le Simulator (pour l'instant)?
-un handle peut être une form?
-Comment en faisant un débug avec codeWarrior pour détecter ce handle invalide?
Merci
Patrice
CITATION(Destino)
Supposons que tu dis vrai:
Hum rolleyes.gif
CITATION(Destino)
-Comment est ce que je peux savoir d'où l'erreur et la corriger?

Ben avec du debugging classique !
CITATION(Destino)
-Pourquoi l'erreur n'est que sur le Simulator (pour l'instant)?

Parce que la gestion mémoire peut être différente selon le matériel
CITATION(Destino)
-un handle peut être une form?

Non
CITATION(Destino)
-Comment en faisant un débug avec codeWarrior pour détecter ce handle invalide?

En suivant pas à pas et en trouvant où ça plante. Comme pour n'importe quel bug
Destino
Je crois que je vais paraître le + NUL de ce forum.mais just une autre question:
J'ai réussi à faire un débug, cependant je ne sais pas quoi surveiller (pointeur ?!!,variable ?!!,...?!!) pour voir ce handle qui me fait ch.er.
J'ai super grave besoin de votre aide.
merci
oupsman
Quand tu as fais un débug pas à pas de ton programme, il a du planter (logique)

Par contre, la ligne de code executée au moment du plantage est celle qui le fait planter (logique là aussi)

A toi de voir ce que tu fais comme carabistouille pour que cela plante.

Déjà, à quel endroit plante ton programme ? Saisie ? Validation de données ? Affichage ?
Schtunks
CITATION(oupsman)
Par contre, la ligne de code executée au moment du plantage est celle qui le fait planter (logique là aussi)


rolleyes.gif t'es sur ?
Patrice
CITATION(Schtunks)
CITATION(oupsman)
Par contre, la ligne de code executée au moment du plantage est celle qui le fait planter (logique là aussi)

rolleyes.gif t'es sur ?

anim_oui.gif on verra les enchaînements tragiques en leçon 7 icon_lol2.gif
oupsman
Dans le cas d'un Handle foireux oui quasiment. J'ai eu beaucoup de messages comme Destino pendant le développement de LPS rolleyes.gif
Schtunks
CITATION(Schtunks)
rolleyes.gif t'es sur ?


icon_bla.gif Désolé, ce n'était pas tout à fait une vraie question... icon_bla.gif anim_wink.gif


CITATION(oupsman)
J'ai eu beaucoup de messages comme Destino pendant le développement de LPS rolleyes.gif


Puisque tu en parles, ça en est où !? anim_wink.gif
oupsman
Ouf, joker question suivante ....

Au point mort depuis longtemps, chuis en train de me battre avec les statistiques graphiques.

Chuis nul de nul en programmation graphique moi, faut que j'apprenne tout.

Même en pascal sous DOS, j'en avais jamais fait, c'est dire !
Patrice
CITATION(oupsman)
Même en pascal sous DOS, j'en avais jamais fait, c'est dire !

Si ça peux te rassurer, depuis le DOS, la programmation graphique a légèrement évolué... icon_lol2.gif
oupsman
CITATION(Patrice)
Si ça peux te rassurer, depuis le DOS, la programmation graphique a légèrement évolué... icon_lol2.gif


nooooonn sans blague ?

On est plus obligé de coder ses routines à la main ?

Tu déconnes ?

PS : je suis en train d'étudier ligne à ligne le code de fuellog qui fait lui aussi des stats graphiques. Je devrais m'en sortir facilement.

Mais là on est HS.
Destino
je crois ke vous vous être éloigné de souci....
Pour revenir un instant à mon handle, mon appli (sur le simulator) se plante (avec un fatal error) lors de l'affichage d'une FORM.
g fais un debug, RIEN d'anormal (enfin du moins cke je constate).
Qd je relance le simulator, tout fonctionne parfaitement.Je sors de mon appli (sans fermer le simulator), je relance une 2e fois mon appli et là c le feu (FATAL ERROR) lors de l'affiche d'une des Form de l'appli.
What's wrong?Que faire? pourquoi?Oh my God,why? what's happened?
Le mystère absolu, pas de réponse, rien, na da,
je tourne vers vous pour de l'aide.
oupsman
Encore une fois : sur quelle ligne de code ton programme se plante ?

C'est cette ligne là qui est buggée.

Ensuite, une fois que c'est trouvé, tu peux nous demander de l'aide : poste le bout de code (affichage de la form), avec quelques détails.

Mais si tu ne nous donnes pas plus de détails, on ne pourra pas t'aider ...
Destino
Voici le bout de code de l'affichage de la Form:

Boolean MainExpFormHandleEvent(EventPtr eventP)
{
Boolean handled = false;
ExperOeuvF = true;
ListType*listP;
// Char*NameDB = "ExperDB";
UInt32 Creator = 'TINO';
RGBColorType rgbP;
FormPtr frmP= FrmGetActiveForm();


switch (eventP->eType)
{

/* case menuEvent:
handled = MainDoMenuCommand(eventP->data.menu.itemID);
break;
*/
case frmOpenEvent:
PrvMainExpFormInit(frmP);
UIColorSetTableEntry(UIFormFill,&Ptrs.rgbP);
UIColorSetTableEntry(UIObjectFill,&Ptrs.rgbP);

//Agrandir l'ecran
VskSetState(gSilkState.refNum, vskStateEnable, vskResizeVertically);
VskSetState(gSilkState.refNum, vskStateResize, vskResizeMin);
VskSetState(gSilkState.refNum, vskStateEnable, vskResizeDisable);

FrmDrawForm (frmP);

UIColorSetTableEntry(UIObjectFill,&Ptrs.rgbP);
Ptrs.passage = 0;
Tempo1.Compteur = false;
Tempo1.NewExp=false;

//Ouvrir la base CpDB, initialise les données dans un Char*TabExp[255]
//Puis affiche tout dans une liste
Err error = OpenCreateDB("CpDB",'TINO');
UInt16 numRecs = InitListCp(TabExp);
error = DmCloseDatabase(gDB);
listP = (ListType*) GetObjectPtr(frmP,ListTrig);
LstSetListChoices (listP,TabExp,numRecs);
LstSetSelection (listP,-1);

if(StrLen(Tempo1.CP)>0)
{
CtlSetLabel((ControlType*)GetObjectPtr(frmP,SelectTrg),Tempo1.CP);

//Ouvrir la base dont le nom est dans Tempo1.CP, initialise les données dans un Char*TabExp[255],les tri
//Puis affiche tout dans une liste
Err error = OpenCreateDB(Tempo1.CP,Creator);
DmQuickSort(gDB,(DmComparF *)TriageExp,0);
UInt16 numRecs = initlist(TabExp);
error = DmCloseDatabase(gDB);

listP = (ListType*) GetObjectPtr(frmP,ExpList);
LstSetSelection (listP,-1);
LstSetListChoices(listP, NULL, numRecs); // display all numRecs
LstSetDrawFunction(listP, ListDrawCallback);
LstDrawList (listP);

if(numRecs==0)
{

rgbP.r= 0xEE;rgbP.g = 0xEE;rgbP.b = 0xEE;
UIColorSetTableEntry(UIObjectFill,&rgbP);
FrmCustomAlert(MsgInfo," Attention, n il n'y a aucune Expertise avec le CP : ",Tempo1.CP,NULL);
FrmHideObject(frmP,FrmGetObjectIndex(frmP,ExpList));
}

if(Ptrs.MsgActiv == true)
{
rgbP.r= 0xff;rgbP.g = 0xff;rgbP.b = 0xFF;
UIColorSetTableEntry(UIObjectFill,&rgbP);
FrmCustomAlert(MsgInfo,"Utiliser les icônes en bas pour:","n-Créer ou Supprimer une Expertisen-Revenir au menu",NULL);
}

}
else
{
CtlSetLabel((ControlType*)GetObjectPtr(frmP,SelectTrg),"Choix du Donneur d'ordre");
FrmHideObject(frmP,FrmGetObjectIndex(frmP,ExpList));
}
listP = (ListType*) GetObjectPtr(frmP,ExpList);
LstSetSelection (listP,-1);

UIColorSetTableEntry(UIObjectFill,&Ptrs.rgbP);
UIColorSetTableEntry(UIObjectFrame,&Ptrs.rgbP);

handled = true;
break;
Eddy
CITATION(Destino)
Voici le bout de code de l'affichage de la Form:


Et voudrais-tu nous indiquez laquelle de ces lignes provoques l'erreur fatale ?

Eddy
Patrice
Ya un paquet de "trous noirs" dans ton code, par exemple :
- Aucun test des codes retour (ça pour crasher, c'est de première)
- Deux fois le remplissage de la liste (listP), 1 fois avec du contenu et 1 fois sans (là ça sent le gaz très fort)
- ...
oupsman
Je rejoins l'avis de Patrice :

CODE
listP = (ListType*) GetObjectPtr(frmP,ExpList);

LstSetSelection (listP,-1);

LstSetListChoices(listP, NULL, numRecs); // display all numRecs

LstSetDrawFunction(listP, ListDrawCallback);

LstDrawList (listP);


Ensuite, je ne vois pas la déclaration de ton TabExp. Est ce une variable globale ?

Quelle est la ligne qui plante ?

Au pif, je dirais LstSetListChoices (listP,NULL,numRecs);

En clair, cela veut dire que tu veux vider ta liste, ce qui n'est pas le but voulu je pense.
Patrice
CITATION(oupsman)
Au pif, je dirais LstSetListChoices (listP,NULL,numRecs);

En clair, cela veut dire que tu veux vider ta liste, ce qui n'est pas le but voulu je pense.

anim_endesaccord.gif c'est une liste à callback anim_wink.gif Il y a des chances que l'erreur soit dans le callback, d'ailleurs.
Destino
il ya 2 list sur la form:
-sur une des list, j'affiche la base "CpDB"
sur l'autre, j'affiche la base dont le nom est donné par la variable Tempo1.CP

- Char*TabExp[255]; est une variable globale

- Aucune ligne ne m'affiche une erreur

si vous avez d'autres questions sur le code,j'suis a vous
Guy-Lux
J'ai eu un comportement comparable de mon pgm car la taille du heap que j'avais laissée par défaut était trop petite. L'allocation mémoire fonctionnait mais j'écrasais des bouts de mémoire au petit bonheur la chance.
Destino
g rien compris
Patrice
CITATION(Destino)
- Char*TabExp[255]; est une variable globale

8O Et il sont alloués tes 255 pointeurs ??? rolleyes.gif
oupsman
CITATION(Patrice)
CITATION(oupsman)
Au pif, je dirais LstSetListChoices (listP,NULL,numRecs);

En clair, cela veut dire que tu veux vider ta liste, ce qui n'est pas le but voulu je pense.

anim_endesaccord.gif c'est une liste à callback anim_wink.gif Il y a des chances que l'erreur soit dans le callback, d'ailleurs.


Ou est la déclaration de callback ?

Pourquoi les données sont chargées la première fois en dur ?

Là franchement je vois pas.

Ceci dit, j'ai un bout de code qui permet de charger dynamiquement des données dans une liste. Je pense que cela pourrait correspondre ...
Destino
En déclarant la Variable, elle est allouée,n'est ce pas?
faudrait-il faire appel à une fonction pour allouer une variable?
Dans ce cas toutes les variables de mon appli devront être allouées alors.
Patrice
CITATION(Destino)
En déclarant la Variable, elle est allouée,n'est ce pas?
faudrait-il faire appel à une fonction pour allouer une variable?
Dans ce cas toutes les variables de mon appli devront être allouées alors.

Tu as alloué un tableau de 255 pointeurs sur des chars. C'est peut-être ce que tu veux mais j'ai un doute... Fais voir le code de InitListCp() on pourra voir...
Patrice
CITATION(oupsman)
Ou est la déclaration de callback ?

Dans la ligne d'après : LstSetDrawFunction(listP, ListDrawCallback);
CITATION(oupsman)
Pourquoi les données sont chargées la première fois en dur ?

Parce que ce sont 2 listes différentes...
oupsman
CITATION(Patrice)
CITATION(oupsman)
Ou est la déclaration de callback ?

Dans la ligne d'après : LstSetDrawFunction(listP, ListDrawCallback);
CITATION(oupsman)
Pourquoi les données sont chargées la première fois en dur ?

Parce que ce sont 2 listes différentes...



icon_bla.gif icon_bla.gif ca m'apprendra à lire trop vite.

patapé patapé
Destino
Voici la déclaration et la définition de la fonction ListDrawCallback

static void ListDrawCallback(Int16 itemNum, RectangleType *bounds,Char **itemsText)
{
Char s[255],s1[255];
Int32 rr,vo;
rr = (Int32)itemNum;
vo = ((Int32)itemNum + 1);

StrCopy(s1,"0");
StrIToA(s,vo);
if(vo<10)
{
StrCat(s1,s);
StrCopy(s,s1);
}

StrCat(s,"-");
StrCat(s,TabExp[itemNum]);
//StrCopy(s,ti[itemNum]);
if((rr%2)==0)
UIColorSetTableEntry(UIFieldBackground,&Ptrs.rgbP1);
else
UIColorSetTableEntry(UIFieldBackground,&Ptrs.rgbP);

WinSetBackColor(UIColorGetTableEntryIndex(UIFieldBackground));
WinFillRectangle (bounds,0);
// the font and colors have already been set; just draw.
WinDrawChars(s, StrLen(s), bounds->topLeft.x-2,bounds->topLeft.y);

UIColorSetTableEntry(UIObjectFill,&Ptrs.rgbP);
}


et voici la fonction InitListCp

UInt16 InitListCp(Char**ti_ini)
{
UInt16 index = -1;
MemHandle recH;
ComPDB*recP;
UInt16 i,numRecs = DmNumRecords(gDB);
FormPtr frmP= FrmGetActiveForm();
for(i=0;i<=numRecs;i++)
{
recH=DmQueryRecord(gDB,i);
if(recH)
{
recP = (ComPDB*)MemHandleLock(recH);
ti_ini[i]=recP->ComP;
MemHandleUnlock(recH);
}
}

return numRecs;
}

voila. I'm waiting for U
Patrice
Donc tu n'as pas de problème d'allocation (mais tu ne peux pas récupérer plus de 255 enregistrements sans planter allègrement, ce que tu ne testes nulle part).

En revanche, il est clair qu'il y a un handle qui devient invalide :!: Tu récupères des pointeurs sur les enregistrements de ta base, puis tu fermes celle-ci. Les pointeurs sont alors totalement invalides :!: Ca ne peut que finir par exploser quand tu essaies de les utiliser...
oupsman
Pourquoi ne pas déclarer TabExp en Char ** et faire un tabexp = Memptrnew (sizeof(char *)*nbrecs) ?

Ce serait plus propre à mon avis.
Destino
Si je comprend bien, je dois d'abord afficher le contenu de la base avant de fermer celle-ci. c ça?

Qd tu dis :"il ya un handle invalide", il s'agit duquel?

Sinon pour l'instant, je n'ai pas + de 2 enregistrements dc je ne pense pas que c ça qui plante l'appli.

En passant, comment faire pour avoir + de 255 enregistrements? kel est le maximum possible que je peux avoir en enregistrement sur le Clié?

Pourquoi ça ne plante que dans simulator et non sur le Clié?
Merci de votre coup de main
Patrice
CITATION(Destino)
Si je comprend bien, je dois d'abord afficher le contenu de la base avant de fermer celle-ci. c ça?

Comme tu ne peux pas contrôler à quel moment la liste est "affichée" (l'OS peut le faire de sa propre initiative, genre quand tu scrolles la liste), ça veut surtout dire que tu ne dois pas fermer la base tant que la form est affichée.
CITATION(Destino)
Qd tu dis :"il ya un handle invalide", il s'agit duquel?

Celui des enregistrements dans la base rolleyes.gif
CITATION(Destino)
En passant, comment faire pour avoir + de 255 enregistrements? kel est le maximum possible que je peux avoir en enregistrement sur le Clié?

65535 (à peu près). C'est dans la doc.
CITATION(Destino)
Pourquoi ça ne plante que dans simulator et non sur le Clié?

Déjà répondu à cette question.
Destino
je teste ça et vous dirai le résultat des courses
Guy-Lux
CITATION(Guy-Lux)
J'ai eu un comportement comparable de mon pgm car la taille du heap que j'avais laissée par défaut était trop petite. L'allocation mémoire fonctionnait mais j'écrasais des bouts de mémoire au petit bonheur la chance.


C'était pas le heap, mais la stack (je mélange tout en ce moment...).
Elle était à 4ko par défaut et je l'ai passée à 8ko.
Et puisque tu es sur codewarrior, ca se passe là :
Destino
Ca yé. g nè plus de Fatal Error. c cool!!!
En fait si vous regardez bien mon code, vous verrez que j'avais redéfini les variables Err error et UInt16 numRecs chaque fois que j'appellai la fct OpenCreateDB().
Merci de votre aide

Sinon c koi le Stack?
Patrice
CITATION(Destino)
En fait si vous regardez bien mon code, vous verrez que j'avais redéfini les variables Err error et UInt16 numRecs chaque fois que j'appellai la fct OpenCreateDB().

Ca risque pas de faire planter grand chose. Surtout pour ce que tu fais de l'error rolleyes.gif
CITATION(Destino)
Sinon c quoi le Stack?

Je te recommande d'acheter un bouquin de base sur le développement anim_wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.