Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: [Résolu/ML] Homebrew qui retourne directement à la HBC  (Lu 2760 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« 13 Avril 2010, 17:40:33 »

Bonjour à tous,

J'ai enfin trouvé un moyen de mettre mes fichiers sur ma carte SD et j'ai pu tester mon jeu.
Le truc c'est que quand je souhaite charger le niveau, j'ai un écran noir et puis je me retrouve à l'accueil de la chaîne Homebrew alors que mon code ne le demande pas.

A un moment, j'ai pu percevoir un texte écrit en haut à gauche de l'écran mais c'était tronqué et trop rapide…
J'ai juste eu le temps de lire : "…::substr… Abort called" ce qui m'étonne tout de même, une erreur qui s'affiche comme ça n'aurait-elle pas du être lue à la compilation ?

Mon code est truffé de string::substr, rien que dans les fonctions appelées à ce moment donc je vais avoir du mal à déterminer d'où viens l'erreur.

Vous avez une idée de quel genre d'erreur peut provoquer un tel évènement ?

En espérant votre aide,

Merci d'avance ! Cheesy

EDIT : A priori, le problème a disparu, je sais pas trop pourquoi mais bon…
« Dernière édition: 17 Avril 2010, 17:22:34 par Sheeft » Journalisée


Pas si petit…
Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #1 : 14 Avril 2010, 14:48:29 »

En fait, le problème n'a pas disparu malheureusement… Mais j'ai pu au moins le localiser (du moins je crois).

A priori, le problème se trouverait dans ces lignes :
Code: (cpp)
else if(label == "ball")
{
string reste = line.substr(line.find("=")+1);

while(1)
{
float x = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find(",")+1);
float y = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find(",")+1);
bool fixed = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find("|")+1);

m_Ball.push_back(new Ball(x,y,m_world,fixed));

if(reste.find("|") == string::npos) break;
}
}
else if(label == "level")
{
string reste = line.substr(line.find("=")+1);

while(1)
{
int b1 = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find(",")+1);
int b2 = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find(",")+1);

link(b1, b2);

if(reste.find("|") == string::npos) break;
}
}

Étant donné la structure semblable de ces deux morceaux de code (les deux else if), je pense que l'erreur doit être répétée dans les deux.

L'erreur peut-elle venir des boucles infinies et de if(reste.find("|") == string::npos) break; ?
Il me semble pourtant que string::find renvoie npos quand elle ne trouve rien non ?

Merci de votre aide Cheesy
« Dernière édition: 14 Avril 2010, 17:59:18 par Sheeft » Journalisée


Pas si petit…
archipel Hors ligne
Full Member
***
Messages: 181


Voir le profil WWW
« Réponse #2 : 15 Avril 2010, 18:50:01 »

je connais pas grand chose a la POO donc je peux pas t'aider Embarrassed mais je te conseillerai d'éviter de déclarer des variables à l'interieure d'une boucle

Code: (cpp)
...
float x,y;
while(1)
{
x = ctoi(reste.substr(0, line.find(",")).c_str());
reste = reste.substr(line.find(",")+1);
y = ctoi(reste.substr(0, line.find(",")).c_str());
...
Journalisée

DevBlog --------------->  Aanaa
Minishlink Hors ligne
Mega Member
***
Messages: 1439


Voir le profil WWW
Quand on veut, on peut !

« Réponse #3 : 15 Avril 2010, 19:44:54 »

Tu m'expliques les while(1) là ? o_O
Journalisée

Cid2Mizard Hors ligne
Super Mega Member
****
Messages: 4064


Voir le profil WWW
Disciple Kukulcanien

« Réponse #4 : 15 Avril 2010, 19:59:43 »

Moi aussi je trouve étrange ses while(1), ca ne devrait pas être while(label = ball) et while(label = level) plutôt !!
Journalisée

Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #5 : 16 Avril 2010, 17:36:03 »

Oui, okay, je devrais mettre while(!(reste.find("|") == string::npos)) plutôt…

Je vais essayer de déclarer les variables en dehors également…
Je suis pas très sûr que ça change quelque chose mais faut voir.
Journalisée


Pas si petit…
Minishlink Hors ligne
Mega Member
***
Messages: 1439


Voir le profil WWW
Quand on veut, on peut !

« Réponse #6 : 16 Avril 2010, 18:06:28 »

Ben c'est quand même très crade de faire ça sur un while(1) Wink
Journalisée

Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #7 : 16 Avril 2010, 19:21:19 »

Bon, j'ai apporté les modifs, mais je dois dire que ce n'est pas très concluant…
Il se produit toujours la même chose :/
Journalisée


Pas si petit…
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #8 : 16 Avril 2010, 19:46:10 »

Ben oui c'est normal le problème vient d'une fonction substr... Après c'est pas le fait de changer la déclaration de ta variable x et y qui va changer qq chose... D'ailleurs à mon avis c'est très bien de déclarer les variables à l'intérieur de la boucle... (J'aurais écris la même chose)

Le while(1) / break effectivement n'est pas terrible ici... Autant le remplacer par un do { } while ( ) qui sera équivalent ou bien un while { } si la condition doit également vérifiée avant de rentrer dans la boucle...

Par ailleurs il est difficile de débugguer ton programme sans avoir un échantillon des données en entrée

Sinon concernant la methode substring il faut faire attention que le premier paramètre soit < à la longueur de la chaine sinon cela déclenche une exception out_of_range et j'ai bien l'impression que c'est ce qui arrive...

Journalisée
Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #9 : 16 Avril 2010, 20:01:43 »

La ligne étudiée ici est : "ball=20,30,0|50,30,1" puis "link=0,1" (ce que j'utilise pour le test).

Par contre, je viens de remarquer que j'utilise tout le temps line.find au lieu de reste.find, je crois que le problème viens de là, étant donné que line ne bouge pas tout le long de la boucle, elle doit sûrement être infinie aussi non ?

Après, le while(reste.find("|") != string::npos) n'est pas super parce que ça veut dire que la dernière instruction ne sera pas prise en compte…

EDIT :
Code: (cpp)
else if(label == "ball")
{
string reste = line.substr(line.find("=")+1);
float x, y;
bool fixed;

while(reste.find("|") != string::npos)
{
x = ctoi(reste.substr(0, reste.find(",")).c_str());
reste = reste.substr(reste.find(",")+1);
y = ctoi(reste.substr(0, reste.find(",")).c_str());
reste = reste.substr(reste.find(",")+1);
fixed = ctoi(reste.substr(0, reste.find("|")).c_str());
reste = reste.substr(reste.find("|")+1);

m_Ball.push_back(new Ball(x,y,m_world,fixed));
}
}
else if(label == "level")
{
string reste = line.substr(line.find("=")+1);
int b1, b2;

while(reste.find("|") != string::npos)
{
b1 = ctoi(reste.substr(0, reste.find(",")).c_str());
reste = reste.substr(reste.find(",")+1);
b2 = ctoi(reste.substr(0, reste.find("|")).c_str());
reste = reste.substr(reste.find("|")+1);

link(b1, b2);
}
}

Ne serait-ce pas déjà mieux ?
Je vais tester.

EDIT : Avec ce nouveau code ça marche bien. Par contre, ça ne lit que jusqu'à l'avant dernière instruction…
Il va donc falloir que je modifie mon while. Ou alors que je mette un | à la fin de chaque ligne… Mais la dernière ligne modifiant reste risquerait alors de dépasser la mémoire non ?
« Dernière édition: 16 Avril 2010, 20:23:46 par Sheeft » Journalisée


Pas si petit…
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #10 : 16 Avril 2010, 20:47:58 »

Tu peux faire un while(1) et un test avec un break comme tu avais fait...

Sauf que je mettrais la ligne

reste = reste.substr(reste.find("|")+1);

en dernier dans la boucle pour être tranquille...

Journalisée
Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #11 : 16 Avril 2010, 21:03:17 »

Ah oui, ça me semble plus judicieux en effet Smiley
Donc pas d'autre moyen de le faire ?

Vu qu'a priori ça reste quand même moche à tes yeux une boucle infinie…
Journalisée


Pas si petit…
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #12 : 17 Avril 2010, 07:54:25 »

Tu peux toujours faire un do { } while ( ); si tu préféres + un test pour éviter de faire  le substr(reste.find("|")+1) lorsque le | n'est plus présent

mais moi personnellement la boucle infinie ne me choque dans ce cas de figure car on sort de la boucle avant la dernière instruction (dans le cas précédent tu sortais de la boucle à la dernière instruction donc autant faire un do { } while ();  en inversant la condition)
Journalisée
Sheeft Hors ligne
Petit slip
Vraiment petit
*
Messages: 924


Voir le profil WWW
sexe : oui (ndPyroh : Ouais ouais...)

« Réponse #13 : 17 Avril 2010, 17:14:47 »

D'accord, merci beaucoup ! Cheesy

EDIT :

En fait, il subsiste un dernier problème…
Cette fois, j'ai un écran blanc au lieu d'un retour à la HBC.
Le code y était mais je ne l'appelais, or maintenant oui, et l'erreur se trouve dans cette fonction :

Code: (cpp)
void Level::link(int b1, int b2)
{
b2Body* body1 = m_Ball[b1]->getBody();
b2Body* body2 = m_Ball[b2]->getBody();

b2DistanceJointDef jointDef;
jointDef.Initialize(body1, body2, body1->GetPosition(), body2->GetPosition());
jointDef.collideConnected = true;
jointDef.frequencyHz = 4.0f;
jointDef.dampingRatio = 0.5f;

m_Joint.push_back(m_world->CreateJoint(&jointDef));
}

Vous avez une idée ?
Journalisée


Pas si petit…
morukutsu Hors ligne
Sr. Member
****
Messages: 499


Voir le profil
Noctambule

« Réponse #14 : 17 Avril 2010, 18:58:41 »

Peut être que b1 et b2 ne sont pas des indices valides, d'où des b2Body incorrects.
Soit ton programme marche et qu'il t'affiche du blanc.
Journalisée
Pages: [1] 2   Haut de page
Imprimer

Aller à: