Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Bizarre bizarre | |
| | Auteur | Message |
---|
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Bizarre bizarre Jeu 25 Aoû 2022 - 20:23 | |
| Salut les panoramiciens ! Bon, je vois c'est le temps des vacances ! (d'ailleurs, j'avoue que j'y suis toujours moi-même) Mais apparemment, il y en a d'encore fidèle au poste ! Mais même en vacances, je fais encore de la programmation ! Et j'ai eu une erreur bizarre, que je n'avais jamais vue, (alors qu'il n'y avait qu'une pendule en panoramic, qui marchait) Voici cette étrange erreur : Too much nested GOSUB or EVENTS (more than 1000)Je me demande à quoi ça correspond ????????? Je ne sais pas si quelqu'un connaît la réponse à cette question ???? | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Bizarre bizarre Jeu 25 Aoû 2022 - 21:24 | |
| Cette erreur arrive quand un GOSUB appelle un GOSUB qui appelle un GOSUB, et cela plus de 1000 fois ou un événement qui déclenche un événement qui déclenche un événement, et cela plus de 1000 fois.
Dans tous les cas, il s'agit d'une erreur dans la programmation. C'est pourquoi il y a apparition d'une erreur au bout de 1000 appels imbriqués pour stopper l'exécution. ("nested" veut dire "imbriqué").
Dans ton programme, il y a une boucle infinie de laquelle il ne sortira pas. C'est pourquoi il y a arrêt au bout de 1000 GOSUB qui s'appellent à la chaine ou de 1000 événements qui se déclenchent eux-même.
_________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Bizarre bizarre Jeu 25 Aoû 2022 - 22:41 | |
| Salut tout le monde. Voici un exemple pour illustrer cette erreur de programmation qui déclenche Too much nested GOSUB or EVENTS (more than 1000) - Code:
-
label calcul,suite dim a,n n = 1 suite: while n < 2 gosub calcul end_while end calcul: a = a+1 gosub suite return
Le sous-programme suite: appelle (par gosub) le sous-programme calcul qui appelle le s/p suite qui appelle ... Au bout de 1000 appels imbriqués, Panoramic se voit dans l'obligation de mettre fin à cette torture infernale! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Bizarre bizarre Ven 26 Aoû 2022 - 13:58 | |
| Merci de toutes ces réponses. Le problème, c'est qu'il n'y a pas de gosub, dans mon programme. Ce serait plutôt les events qui seraient excessifs, mais comment ? Le programme que j'utilisais, qui est très long, mais qui était simplement en attente, à ce moment-là, n'avait que la pendule qui fonctionnait, avec un timer. Il semblerait qu'au bout d'environ 1/4 d'heure (soit 1000 secondes, donc 1000 appels du timer) soit le programme plante et affiche l'erreur précisée plus haut, soit continue à fonctionner, mais avec l'aiguille des secondes qui se met à pétouiller, s'arrêtant pour sauter ensuite 2 secondes d'un coup, et se remettant à fonctionner correctement au bout d'un moment. N'y a-t-il pas un effacement des événements passés, qui ne se fait pas ? Je vous mets ici la partie du programme qui était active, à ce moment. (avec l'image qui permet de mieux se rendre compte) - Code:
-
rem ' Pendule dim CDP%(6) : rem Chiffres Digitaux de la Pendule dim V1M%, V2M% , V3M% , V4M$ , V5M label pendule : rem Fonctionnement de la pendule
timer 560 : rem Pour faire marcher la pendule timer_interval 560,1000 on_timer 560,pendule timer_off 560 alpha 830 : rem Base du calendrier left 830,10 top 830,36 width 830,285 height 830,32 color 830,0,0,0 alpha 832 : rem Affichage du calendrier left 832,15 top 832,36 color 832,0,0,0 font_size 832,20 font_color 832,0,255,0 font_name 832,"Arial" caption 832,date$ for V1M% = 1 to 6 : rem Digits de l`heure V2M%=V1M%*2+832 : rem N° 834 à 844 à pas de 2 digit1 V2M% if even(V1M%)=0 left V2M%,(int(V1M%/2)-1)*40+215 else left V2M%,((V1M%/2)-2)*40+231 end_if top V2M%,40 width V2M%,15 height V2M%,24 next V1M% picture 850 : rem Pendule analogique left 850,10 top 850,78 width 850,232 height 850,232 if file_exists("Pendule.jpg")=1 file_load 850,"Pendule.jpg" end_if
timer_on 560 end
pendule: : rem Fonctionnement de la pendule =================================== caption 832,date$ V4M$=time$ V3M%=instr(V4M$,":") if V3M%=3 CDP%(1)=val(left$(V4M$,1)) CDP%(2)=val(mid$(V4M$,2,1)) CDP%(3)=val(mid$(V4M$,4,1)) CDP%(4)=val(mid$(V4M$,5,1)) CDP%(5)=val(mid$(V4M$,7,1)) CDP%(6)=val(right$(V4M$,1)) else CDP%(1)=0 CDP%(2)=val(left$(V4M$,1)) CDP%(3)=val(mid$(V4M$,3,1)) CDP%(4)=val(mid$(V4M$,4,1)) CDP%(5)=val(mid$(V4M$,6,1)) CDP%(6)=val(right$(V4M$,1)) end_if for V3M% = 1 to 6 caption 832+V3M%*2,CDP%(V3M%) next V3M% if file_exists("Pendule.jpg")=1 file_load 850,"Pendule.jpg" end_if 2d_target_is 850 2d_pen_width 5 2d_pen_color 255,0,0 2d_fill_color 255,0,0 2d_circle 116,116,10 V3M%=CDP%(1)*10+CDP%(2) V5M=(CDP%(3)*10+CDP%(4))/12 if V3M%>12 V3M%=V3M%-12 end_if V3M%=(V3M%*5)+int(V5M) if V3M%>6 V5M=(V3M%-30)*(-0.33) else V5M=(30-V3M%)*0.33 end_if 2d_line 116,116,45*sin(V5M/pi)+116,45*cos(V5M/pi)+116 V3M%=CDP%(3)*10+CDP%(4) if V3M%>30 V5M=(V3M%-30)*(-0.33) else V5M=(30-V3M%)*0.33 end_if 2d_line 116,116,72*sin(V5M/pi)+116,72*cos(V5M/pi)+116 V3M%=CDP%(5)*10+CDP%(6) if V3M%>30 V5M=(V3M%-30)*(-0.33) else V5M=(30-V3M%)*0.33 end_if 2d_pen_color 0,255,0 2d_fill_color 0,255,0 2d_circle 116,116,6 2d_line 116,116,60*sin(V5M/pi)+116,60*cos(V5M/pi)+116 2d_pen_width 1 return
Est-ce que ce sont les calculs trigonométriques qui font cette erreur ? | |
| | | Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Bizarre bizarre Sam 27 Aoû 2022 - 9:52 | |
| - jjn4 a écrit:
- Est-ce que ce sont les calculs trigonométriques qui font cette erreur ?
Non. Les calculs trigonométriques ne peuvent pas provoquer cette erreur. J'ai fait tourner ton programme pendant plusieurs heures sans aucun soucis. Ce que je soupçonne, c'est que tu utilises un PC qui est lent et sur lequel le sous-programme pendule de traitement d'événement du TIMER 560 met plus d'une seconde à s'effectuer. Ainsi, le RETURN du premier appel n'est pas encore exécuté, qu'il y a un deuxième appel, qui ne se termine pas parce qu'il y a un troisième appel et ainsi de suite. La pile interne des adresses de retour de panoramic se sature à 1000 retours non effectués et l'erreur se déclenche. Je pense que ce qui prend du temps dans le traitement d'événement pendule, c'est qu'à chaque fois, donc toutes les secondes, il fait des accès disques: il teste la présence de Pendule.jpg et le recharge dans l'objet PICTURE 850. - Code:
-
if file_exists("Pendule.jpg")=1 file_load 850,"Pendule.jpg" end_if Je te propose 2 solutions (je ne les ai pas essayées): - soit tu fais tourner ton programme dans un disque dur virtuel (ainsi il n'y a plus d'accès physique au disque dur, mais que des appels en mémoire beaucoup plus rapides) - ou bien, dans le programme principal, tu charges une fois pour toutes le fichier Pendule.jpg dans un objet IMAGE de numéro XXX (je pense qu'il faut que le fichier soit en BMP, mais je ne suis pas sûr), tu mémorises son image par un 2D_IMAGE_COPY, tu détruits l'objet XXX (car on n'en a plus besoin), et dans pendule, tu remplaces - Code:
-
if file_exists("Pendule.jpg")=1 file_load 850,"Pendule.jpg" end_if par un appel à 2D_IMAGE_PASTE X,Y,850. Ainsi, il n'y a plus d'accès disque. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Bizarre bizarre Sam 27 Aoû 2022 - 13:32 | |
| Merci, je vais essayer ça. Ceci dit, mon ordinateur n'est pas lent. Par contre, j'ai pensé à autre chose : juste avant que seule la pendule marche, un « execute_wait » avait été utilisé, le programme Internet continuant à fonctionner, puisqu'il s'agissait d'une symphonie sur youtube. Peut-être que j'aurais dû plutôt mettre : « execute » sans le wait, puisque l'utilisation d'objets ayant une conséquence temporelle, comme « message » ou « open_dialog » sont plutôt incompatibles avec l'utilisation d'un timer, alors peut-être execut_wait aussi. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Bizarre bizarre Sam 27 Aoû 2022 - 15:51 | |
| @jjn4
Je pense que tu as bien ciblé d'où pourrait venir l'erreur. En effet execute_wait exécute le fichier et gèle toute autre action jusqu'à la fin. D'ailleurs tout comme wait qui gèle l'excécution du programme pendant n secondes y compris les actions en attente contrairement à pause qui fait la même chose mais les actions en attente sont effectuées.
Change execute_wait par execute et eventuellement wait par pause si ton programme l'utilse.
| |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Bizarre bizarre Dim 28 Aoû 2022 - 19:51 | |
| - Papydall a écrit:
- Change execute_wait par execute
Oui, c'est ce que j'ai fait. J'en ai aussi profité pour appliquer le conseil de Jack (on ne sait jamais), sauf que j'ai trouvé une autre solution : (j'aime bien les 3° solutions, surtout face aux dilemmes) J'ai effacé les aiguilles avant de les afficher à leurs nouvelles positions. C'est effectivement plus simple. J'espère que maintenant, cela va bien marcher. Merci pour tous ces conseils ! | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Bizarre bizarre Dim 4 Sep 2022 - 16:19 | |
| A essayer des solutions faciles (ma 3° solution), j'ai finalement oublié de poser LA question suivante : Dans sa première solution, Jack propose d'utiliser un disque virtuel. Gasp !!! - C'est sympa, comme idée ! Mais comment on fait pour avoir un disque virtuel ? Et une fois qu'on est arrivé à ça, comment on l'utilise en Panoramic ? Ah oui, ça c'est LA question ! | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Bizarre bizarre Dim 4 Sep 2022 - 17:06 | |
| Salut JJN4 ! Le disque virtuel est à créer sous Windows. C'est une portion de la mémoire vive (ram) qui est accessible comme un disque quelconque à l'aide d'une lettre dédiée comme un vrai disque. Le disque virtuel est volatil : si tu éteins le PC, le disque virtuel perd toutes ses données. Voici un article parmi tant d’autres : >> Cliquez ICI << | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Bizarre bizarre Dim 4 Sep 2022 - 18:34 | |
| Ouh là, oui ! Ca paraît lourd ! Et il y a des dangers ? | |
| | | Contenu sponsorisé
| Sujet: Re: Bizarre bizarre | |
| |
| | | | Bizarre bizarre | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |