Destino
06/10/2004 à 13:46
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
06/10/2004 à 13:47
En simplifiant un poil : tu utilises un handle invalide.
Destino
06/10/2004 à 14:06
tu peux etre un peu + clair STP.
Merci
Patrice
06/10/2004 à 14:08
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
06/10/2004 à 14:26
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
06/10/2004 à 15:17
CITATION(Destino)
Supposons que tu dis vrai:
Hum
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
06/10/2004 à 16:49
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
06/10/2004 à 19:44
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
06/10/2004 à 20:06
CITATION(oupsman)
Par contre, la ligne de code executée au moment du plantage est celle qui le fait planter (logique là aussi)

t'es sur ?
Patrice
06/10/2004 à 20:20
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)

t'es sur ?

on verra les enchaînements tragiques en leçon 7
oupsman
06/10/2004 à 20:21
Dans le cas d'un Handle foireux oui quasiment. J'ai eu beaucoup de messages comme Destino pendant le développement de LPS
Schtunks
06/10/2004 à 20:27
CITATION(Schtunks)

t'es sur ?

Désolé, ce n'était pas tout à fait une vraie question...
CITATION(oupsman)
J'ai eu beaucoup de messages comme Destino pendant le développement de
LPS 
Puisque tu en parles, ça en est où !?
oupsman
06/10/2004 à 20:29
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
06/10/2004 à 20:33
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é...
oupsman
06/10/2004 à 20:47
CITATION(Patrice)
Si ça peux te rassurer, depuis le DOS, la programmation graphique a
légèrement évolué...

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
07/10/2004 à 08:59
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
07/10/2004 à 09:11
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
07/10/2004 à 10:53
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;
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
07/10/2004 à 11:35
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
07/10/2004 à 12:14
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
07/10/2004 à 12:16
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.

c'est une liste à callback

Il y a des chances que l'erreur soit dans le callback, d'ailleurs.
Destino
07/10/2004 à 12:27
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
07/10/2004 à 12:31
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
07/10/2004 à 12:33
g rien compris
Patrice
07/10/2004 à 12:38
CITATION(Destino)
- Char*TabExp[255]; est une variable globale
8O Et il sont alloués tes 255 pointeurs ???
oupsman
07/10/2004 à 12:40
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.

c'est une liste à callback

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
07/10/2004 à 12:45
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
07/10/2004 à 12:46
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
07/10/2004 à 12:48
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
07/10/2004 à 12:49
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...

ca m'apprendra à lire trop vite.
patapé patapé
Destino
07/10/2004 à 12:54
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
07/10/2004 à 12:56
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
07/10/2004 à 13:05
Pourquoi ne pas déclarer TabExp en Char ** et faire un tabexp = Memptrnew (sizeof(char *)*nbrecs) ?
Ce serait plus propre à mon avis.
Destino
07/10/2004 à 13:13
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
07/10/2004 à 13:15
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
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
07/10/2004 à 13:29
je teste ça et vous dirai le résultat des courses
Guy-Lux
07/10/2004 à 19:04
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
08/10/2004 à 09:36
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
08/10/2004 à 09:48
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
CITATION(Destino)
Sinon c quoi le Stack?
Je te recommande d'acheter un bouquin de base sur le développement
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.