[GM7]Crash

Démarré par Zaki, 27 Janvier 2008 à 08:35

0 Membres et 1 Invité sur ce sujet

27 Janvier 2008 à 08:35 Dernière édition: 27 Janvier 2008 à 08:38 par Zaki
Kikou à tous,

Je me suis levé ce matin et j'ai commencé à programmer, tout marche nikel, jusqu'au moment où je passe au message, là, je crée un script de plus d'un quart d'heure de reflexion et de codage, et quand je le teste, le jeu bloque.
Pour info, voici le script en question :
Citationif dou
    {
    var parole, mes1, mes2, mes3, j, i;
    parole = "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM";
    if (string_length(parole)/30 > 1)
        {
        j = 1;
        i = 30;
        while j
            {
            if string_char_at(parole,i)=" "
                {
                j = 0;
                }
            else
                {
                i-=1;
                }
            }

        message1 = string_copy(parole,0,30);
        if (string_length(string_copy(parole,31,string_length(parole)-31))/30 > 1)
        {
        parole = string_copy(parole,31,string_length(parole)-31);
        j = 1;
        i = 30;
        while j
            {
            if string_char_at(parole,i)=" "
                {
                j = 0;
                }
            else
                {
                i-=1;
                }
            }
        message2 = string_copy(parole,0,30);
        message3 = string_copy(parole,31,string_length(parole)-31);
        }
        else
            {
            message2 = string_copy(parole,31,string_length(parole)-31);
            message3 = "";
            }
        }
    else
    {
    message1 = parole;
    message2 = "";
    message3 = "";
    }
}
Ce script sert à décomposer, au bon endroit, le message que j'ai inscrit, qui est ici (MMMM...), et le tout en trois lignes.

Merci d'avance.

Edit : J'ai mis en rouge la partie sur laquelle j'ai un doute,car si ça se trouve, c'est ça qui crée une boucle infinie.

Si j'ai bien compris, tu souhaites que ton texte soit découpé pour l'afficher sur trois lignes successives au lieu d'une seule ?
Je ne sais pas d'où viens ton problème, je ne connais pas très bien l'utilisation des while (enfin si le jeu bloque ça vient surement de l'une de tes boucles), mais si c'est bien ce que tu veux faire, je trouve plus pratique d'utiliser la fonction suivante :
draw_text_ext(x,y,string,sep,w)
CitationSimilaire à la fonction draw_text(x,y,string) mais cette fois-ci, vous pourrez indiquer deux valeurs supplémentaires. En premier lieu, le paramétre sep indiquera la distance de séparation entre deux lignes pour tout texte s'affichant sur plusieurs lignes. Utilisez la valeur -1 afin d'obtenir la distance par défaut. Employez le paramétre w pour préciser la largeur du texte en pixels. Les lignes dépassant cette longueur seront sectionnées avec un espace ou un trait d'union. Utilisez la valeur -1 pour interdire le sectionnement des lignes.

Je pense que ça serait plus pratique, mais je ne sais pas ce que tu veux faire exactement. ^_^

Mais sinon, au niveau des while, "while j" ça veut dire quoi ? Normalenent il me semble qu'on doit mettre une expression, par exemple "while j = quelquechose" et le tout entre parenthèses, mais là je comprend pas ce que ça veut dire. :unsure:

 :blink:


Je me suis cassé la tête pour rien ?
En tout cas, merci beaucoup, ça va abréger de beaucoup mon travail.

La prochaine fois commente ton code, je me demandais ce que tu voulais faire...  :)
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

Le problème vient uniquement de "while j", car la boucle continuera tant que j = true, et la variable j ne peut logiquement pas changer, même après 2 millions de boucles. ;)

En fait, j'ai capté un truc : je n'avais pas mis d'espaces dans mon message, du coup, il ne trouvera jamais d'espaces dans le message, et c'est là tout le problème ^^' .

En effet il y a deux conditions pour l'arrêt de ta boucle, avoir trouvé un espace et avoir lu tout le texte.

Hé hé  si tu commentais correctement t'aurais pas eu ce problème, ou en tout cas tu l'aurais vu plus vite.  :P
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

Citation de: Octorok le 27 Janvier 2008 à 10:26
Mais sinon, au niveau des while, "while j" ça veut dire quoi ? Normalenent il me semble qu'on doit mettre une expression, par exemple "while j = quelquechose" et le tout entre parenthèses, mais là je comprend pas ce que ça veut dire. :unsure:

Il me semble que le GML partage cette particularité avec pas mal de langages: quand tu mets "while [variable]", c'est une manière raccourcie de dire "while [variable] /= 0".

27 Janvier 2008 à 11:59 #8 Dernière édition: 27 Janvier 2008 à 12:02 par mooglwy
Oui oui bien sur.  ^_^
Ca ressemble énormément au C, mais c'est pas a ça que je pensai.
Plutot un truc du genre
While (j && i)
{
instruction;
}


Edit je suis un boulet je croyais que tu me parlais a moi nox...

Donc nan néo while j est équivalent while (j != 0)
Si j=0 alors c'est faux sinon c'est vrai, donc la boucle ne s'arrête que quand j=0.
L'erreur la était d'oublier qu'il fallait s'arrêter a la fin de la chaine.
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

"while j" signifie "Tant que j n'est pas nulle".

Citation de: mooglwy le 27 Janvier 2008 à 11:59
Oui oui bien sur.  ^_^
Ca ressemble énormément au C, mais c'est pas a ça que je pensai.
Plutot un truc du genre
While (j && i)
{
instruction;
}



En C, il me semble que le && agit comme un "et alors" algorithmique non ? Ce qui n'est pê pas le cas avec GM...

Citation de: Zaki le 27 Janvier 2008 à 12:01
"while j" signifie "Tant que j n'est pas nulle".
kthxbye.


Citation de: Noxneo le 27 Janvier 2008 à 12:02
En C, il me semble que le && agit comme un "et alors" algorithmique non ? Ce qui n'est pê pas le cas avec GM.

Pour le gml je sais plus,  ça fait trop longtemp que je m'en suis pas servis.

Sinon pour le C tu me mets un doute. comme opérateur et, il y a & et &&, l'un agit comme un et bit a bit et l'autre travaille sur des valeur booléennes. Par exemple j=0 donc j est faux ... bla bla bla. 
Mais tu m'as mis un doute je sais plus lequel est lequel.
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

Il me semble que c'est & qui est bit à bit, et && qui est en booléen. Ce qui expliquerait que && soit un "et alors".

C'est quoi que tu appelles "et alors"? Le et classique de l'algèbre de bool?
D'ailleurs je sais même pas si le et commercial peut s'écrire en gml, c'ets pas and qu'on utilise ?
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table

Nan je crois que l'esperluette n'existe pas en GML.

Sinon, dans le "et" les deux conditions sont évaluées, alors que dans le "et alors" c'est d'abord la première puis, si elle est vrai, alors la 2ème.
Ca sert quand tu parcours un tableau par exemple - imagine un algo du genre ou on cherche la valeur 10:

tant que i<=tabmax et tab(i)/=10 faire;
  blabla
  i++;
fin faire;

Si le tableau fait 10 cases, à la fin de la dernière boucle i va valoir 11. Quand on va évaluer l'expression on va avoir:

11<=tabmax, qui va renvoyer faux et
tab(11)/= 10 qui va renvoyer...un joli segfault.

Avec le et alors, il voit que 11<=tabmax est faux, et par conséquent il déduit que tout l'expression est fausse sans évaluer le 2ème membre.

Ah je le connaissais pas celui la. Faudra que je teste pour savoir lequel on a en C, mais ça veut qu'il me manque une notation.. Ou alors qu'on se sert de & comme d'un opérateur et bit a bit  et comme du "et" tout simple.

Reste a voir.  :)
Je t' lily.

Regex / Les ravages de linux
CitationDites, dans un CV, faut mettre si on préfère vim ou emacs ?
Dis papa comment on fait les bébé
[/table