Un nouveau sur le forum qui a un problème...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Un nouveau sur le forum qui a un problème...

Message par mangatome »

Bonjour a tous :) je suis un ptit nouveau, je viens de m'inscrire ici. Je savais que PB avait une ramification française mais je n'ai pas eu l'idée de m'inscrire jusqu'au jour où ... un problème se présenta.
Bon en gros je code depuis quelques années en basic essentiellement (PureBasic, BlitzBasic3d) mais aussi en C/C++ et accessoirement en DIV (lol je sais oui DIV Games Studio).
Je code en ce moment un éditeur de niveaux pour un projet de jeu en B3D que j'ai. Je code ce tool en B3D, et j'ai attaqué un petit module en PB pour la gestion des évenements. Comme je n'avais pas approché les objets en PB (alors que je les maitrisais en B3D) je ne savais pas a quoi m'attendre. Enfin bref je vous livre mon code et vous fait part de mon problème : il semble que le programme plante a chaque appel a une fonction comme CountList(), ou mon_event()\champ
Je m'en remet a vos mains expertes, et merci d'avance :)
Dernière modification par mangatome le mer. 29/déc./2004 18:14, modifié 1 fois.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message par mangatome »

Code : Tout sélectionner

;- Window Constants
;
Enumeration
  #Main
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Btn_Apply
  #Btn_OK
  #Btn_Cancel
  #Frm_E
  #Lst_E
  #Btn_E_Add
  #Btn_E_Edit
  #Btn_E_Del
  #Lbl_Credits
  #Frm_C
  #Frm_Effet
  #Lbl_E_Name
  #Str_E_Name
  #Lbl_E_Type
  #Cmb_E_Type
  #Chk_E_Actif
  #Chk_E_Started
  #Chk_E_Loop
  #Lbl_C_Type
  #Cmb_C_Type
  #Btn_C_Add
  #Btn_C_Apply
  #Btn_C_Del
  #Lst_C
  #Lst_Effet
  #Lbl_Effet_Type
  #Cmb_Effet_Type
  #Btn_Effet_Add
  #Btn_Effet_Apply
  #Btn_Effet_Del
  #Lbl_C_List
  #Lsl_C_List
EndEnumeration

;-Variables
Global ProjectFP$,EventFP$
Structure TEvent
  name$
  type.l
  actif.l
  lance.l
  boucle.l
EndStructure
NewList TEventList.TEvent()

Procedure.l EventExists(eventname$)
    
;    Debug "CountList()"
;    Debug "Recherche de doublons sur "+Str(CountList(TEventList()))
    Debug "ResetList()" : ResetList(TEventList())
    While NextElement(TEventList())
        Debug "TEventList()"       
        If TEventList()\name$=eventname$ : ProcedureReturn 1 : EndIf    
    Wend
    Debug "Terminé"
    ProcedureReturn 0

EndProcedure

Procedure ShowEventInfos(eventname$)
    Debug "Recherche des infos..."
    ResetList(TEventList())
    While NextElement(TEventList())       
        If TEventList()\name$=eventname$ 
           SetGadgetText(#Str_E_Name,TEventList()\name$)
           SetGadgetState(#Cmb_E_Type,TEventList()\type)
           SetGadgetState(#Chk_E_Actif,TEventList()\actif)
           SetGadgetState(#Chk_E_Started,TEventList()\lance)
           SetGadgetState(#Chk_E_Loop,TEventList()\boucle)
        EndIf    
    Wend
EndProcedure

Procedure CreateEvent(name$,type,actif,lance,boucle)
r=EventExists(name$)
If r=0 
   AddGadgetItem(#Lst_E,-1,name$)  
  DefType.TEvent *dev  
  *dev=AddElement(TEventList())
  If *dev<>0 
    *dev\name$=name$ 
    *dev\type=type 
    *dev\actif=actif
    *dev\lance=lance
    *dev\boucle=boucle
    Debug "Added!"
  Else 
    MessageRequester("Erreur", "Impossible d'allouer de la mémoire pour un nouvel évenement !", 16) 
  EndIf
Else
  MessageRequester("Erreur","Un évenement avec un nom identique existe déja.",#MB_ICONEXCLAMATION)
EndIf  

EndProcedure

Procedure OpenProjectEvents()

  If ProjectFP$="omicronle" : ProjectFP$="test.olp" : EndIf
  EventFP$=Left(ProjectFP$,len-3)+"event"
  If FileSize(EventFp$)>-1
    fp=ReadFile(0,EventFP$)
    If fp
      Repeat
        name$=ReadString()
        type=Val(ReadString())
        actif=Val(ReadString())
        lance=Val(ReadString())
        boucle=Val(ReadString())
        ReadString()
        CreateEvent(name$,type,actif,lance,boucle)
      Until Eof(0)<>0
    Else
      MessageRequester("Erreur","Impossible de lire le fichier des évenements !",16)
    EndIf
  EndIf

EndProcedure

Procedure SaveProjectEvents()
  If ProjectFP$="omicronle" : ProjectFP$="test.olp" : EndIf
  len=Len(ProjectFP$)
  EventFP$=Left(ProjectFP$,len-3)+"event" 

  fp=CreateFile(0,EventFP$)
  
  If fp  
    ResetList(TEventList())
    Debug "saving"   
    While NextElement(TEventList()) 
        WriteStringN(TEventList()\name$)
        WriteStringN(Str(TEventList()\type))
        WriteStringN(Str(TEventList()\actif)) 
        WriteStringN(Str(TEventList()\lance))
        WriteStringN(Str(TEventList()\boucle))
        WriteStringN("")     
    Wend
    Debug "saved"
    CloseFile(0)  
  Else
    MessageRequester("Erreur","Impossible de créer le fichier "+EventFP$,16)
  EndIf
EndProcedure

Procedure EventItemRequester(event_type,event_id)

  

EndProcedure

Procedure Open_Main()
  If OpenWindow(#Main, 137, 52, 1000, 665,  #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Editeur d'évenements - ("+ProjectFP$+")")
    If CreateGadgetList(WindowID())
      ButtonGadget(#Btn_Apply, 885, 630, 110, 30, "Appliquer")
      ButtonGadget(#Btn_OK, 655, 630, 110, 30, "OK")
      ButtonGadget(#Btn_Cancel, 770, 630, 110, 30, "Annuler")
      Frame3DGadget(#Frm_E, 5, 0, 215, 625, "Evenements")
      ListViewGadget(#Lst_E, 10, 15, 205, 300)
      ButtonGadget(#Btn_E_Add, 10, 595, 60, 25, "Ajouter")
      ButtonGadget(#Btn_E_Edit, 80, 595, 60, 25, "Appliquer")
      ButtonGadget(#Btn_E_Del, 150, 595, 65, 25, "Supprimer")
      TextGadget(#Lbl_Credits, 5, 635, 325, 20, "Event Editor pour OMICRON Level Editor v0.5 - CYBISOFT")
      Frame3DGadget(#Frm_C, 230, 0, 765, 310, "Conditions : causes de l'évenement")
      Frame3DGadget(#Frm_Effet, 230, 315, 765, 310, "Effets : conséquences de l'évenement")
      TextGadget(#Lbl_E_Name, 10, 330, 205, 15, "Nom de l'évenement")
      StringGadget(#Str_E_Name, 10, 345, 205, 20, "")
      TextGadget(#Lbl_E_Type, 10, 375, 205, 15, "Type d'évenement")
      ComboBoxGadget(#Cmb_E_Type, 10, 390, 205, 140)
        ;items
        AddGadgetItem(#Cmb_E_Type,0,"Camera Collision")
        AddGadgetItem(#Cmb_E_Type,1,"Mesh Collision")
        AddGadgetItem(#Cmb_E_Type,2,"Processus Parallèle")
        
      CheckBoxGadget(#Chk_E_Actif, 10, 425, 205, 15, "Actif")
      CheckBoxGadget(#Chk_E_Started, 10, 445, 205, 15, "Lancé au demarrage")
      CheckBoxGadget(#Chk_E_Loop, 10, 465, 205, 15, "Répéter en boucle")
      ButtonGadget(#Btn_C_Add, 760, 280, 75, 25, "Ajouter")
      ButtonGadget(#Btn_C_Apply, 845, 280, 65, 25, "Modifier")
      ButtonGadget(#Btn_C_Del, 920, 280, 70, 25, "Supprimer")
      ListIconGadget(#Lst_C, 235, 15, 520, 290, "Condition", 200)
      AddGadgetColumn(#Lst_C,1,"Description",320)
        ;items
        ;AddGadgetItem(#Lst_C,0,"Code Blitz3d"+Chr(10)+"Code source au langage Blitz3d.")
        AddGadgetItem(#Lst_C,0,"Toujours"+Chr(10)+"Les effets se produisent toujours.")
        
      ListIconGadget(#Lst_Effet, 235, 330, 520, 290, "Effet", 200)
      AddGadgetColumn(#Lst_Effet,1,"Description",320)
        ;items
        AddGadgetItem(#Lst_Effet,0,"Code Blitz3d"+Chr(10)+"Code source au langage Blitz3d.")

      ButtonGadget(#Btn_Effet_Add, 760, 595, 75, 25, "Ajouter")
      ButtonGadget(#Btn_Effet_Apply, 845, 595, 65, 25, "Modifier")
      ButtonGadget(#Btn_Effet_Del, 920, 595, 70, 25, "Supprimer")
      TextGadget(#Lbl_C_List, 760, 15, 230, 15, "Liste des conditions de l'évenement")
      ListViewGadget(#Lsl_C_List, 760, 30, 230, 245)
            
      OpenProjectEvents()
           
      Repeat
        e=WaitWindowEvent()
        If e=#PB_Event_Gadget
          Select EventGadgetID()
            ;MAIN WINDOW
            Case #Btn_Cancel
              e=#PB_Event_CloseWindow
            Case #Btn_Ok
              SaveProjectEvents()
              e=#PB_Event_CloseWindow
            Case #Btn_Apply
              SaveProjectEvents()
              
            ;EVENT FRAME
            Case #Btn_E_Add
              eventname$=GetGadgetText(#Str_E_Name)
              eventtype=GetGadgetState(#Cmb_E_Type)
              If eventname$="" Or GetGadgetText(#Cmb_E_Type)=""
                MessageRequester("Erreur","Vous n'avez pas indiqué le nom et/ou le type de l'évenement")
              Else
                CreateEvent(eventname$,eventtype,GetGadgetState(#Chk_E_Actif),GetGadgetState(#Chk_E_Started),GetGadgetState(#Chk_E_Loop))
              EndIf
            Case #Lst_E
              ShowEventInfos(GetGadgetText(#Lst_E)) 
              
            ;CONDITIONS FRAME
            Case #Lst_C
               
          EndSelect
        EndIf
        
      Until e=#PB_Event_CloseWindow
      
      End
      
    EndIf
  EndIf
EndProcedure

Procedure CheckFrom()
  ProjectFP$=ProgramParameter()
If projectfp$<>"omicronle"
  If FileSize(ProjectFP$)=-1 : MessageRequester("Erreur","Le fichier spécifié par OmicronLE n'existe pas !",16) : End : EndIf  
EndIf
  Open_Main()
EndProcedure
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

Bonjour
et Bienvenu Dans le Monde de purebasic

d'abord j'ai lancer ton programme et il ya un probleme de boucle
quand je lance ton programme j'ai rien
je pense que tu as mal programmer ta boucle pour afficher ta fenetre principale
Jbernard13
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu es sur que tout le code est là ?

Je trouve pas CountEvent() ni mon_event()\champ
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message par mangatome »

merci d'avoir répondu :)

@jbernard13 : c'est vrai, j'ai oublié de préciser que mon programme se lance d'un autre fichier qui appelle la fonction Open_Main()

@denis : désolé, je m'étais trompé aussi je parlais de CountList() et des autres fonctions liées aux listes chainées. apparament le programme plante (au dela de 1 évenement dans ma liste) quand j'appelle une fonction linkedlist.
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'ai juste remplacé ton *dev\
et mis un ForEach dans une procédure ,parce que j'aime bien le ForEach :)

Code : Tout sélectionner

;- Window Constants 
; 
Enumeration 
  #Main 
EndEnumeration 

;- Gadget Constants 
; 
Enumeration 
  #Btn_Apply 
  #Btn_OK 
  #Btn_Cancel 
  #Frm_E 
  #Lst_E 
  #Btn_E_Add 
  #Btn_E_Edit 
  #Btn_E_Del 
  #Lbl_Credits 
  #Frm_C 
  #Frm_Effet 
  #Lbl_E_Name 
  #Str_E_Name 
  #Lbl_E_Type 
  #Cmb_E_Type 
  #Chk_E_Actif 
  #Chk_E_Started 
  #Chk_E_Loop 
  #Lbl_C_Type 
  #Cmb_C_Type 
  #Btn_C_Add 
  #Btn_C_Apply 
  #Btn_C_Del 
  #Lst_C 
  #Lst_Effet 
  #Lbl_Effet_Type 
  #Cmb_Effet_Type 
  #Btn_Effet_Add 
  #Btn_Effet_Apply 
  #Btn_Effet_Del 
  #Lbl_C_List 
  #Lsl_C_List 
EndEnumeration 

;-Variables 
Global ProjectFP$,EventFP$ 
Structure TEvent 
  Name$ 
  Type.l 
  actif.l 
  lance.l 
  boucle.l 
EndStructure 
NewList TEventList.TEvent() 

Procedure.l EventExists(eventname$) 
    
    Debug "CountList()" 
    Debug "Recherche de doublons sur "+Str(CountList(TEventList())) 
    Debug "ResetList()" 
    ForEach TEventList() 
      Debug "TEventList()"        
      If TEventList()\Name$=eventname$ 
        Trouve=1
        Break 
      EndIf    
    Next
    Debug "Terminé" 
    ProcedureReturn Trouve 
EndProcedure 

Procedure ShowEventInfos(eventname$) 
    Debug "Recherche des infos..." 
    ResetList(TEventList()) 
    While NextElement(TEventList())        
        If TEventList()\Name$=eventname$ 
           SetGadgetText(#Str_E_Name,TEventList()\Name$) 
           SetGadgetState(#Cmb_E_Type,TEventList()\Type) 
           SetGadgetState(#Chk_E_Actif,TEventList()\actif) 
           SetGadgetState(#Chk_E_Started,TEventList()\lance) 
           SetGadgetState(#Chk_E_Loop,TEventList()\boucle) 
        EndIf    
    Wend 
EndProcedure 

Procedure CreateEvent(Name$,Type,actif,lance,boucle) 
r=EventExists(Name$) 
If r=0 
   AddGadgetItem(#Lst_E,-1,Name$)  
  DefType.TEvent *dev  
  If AddElement(TEventList()) 
    TEventList()\Name$=Name$ 
    TEventList()\Type=Type 
    TEventList()\actif=actif 
    TEventList()\lance=lance 
    TEventList()\boucle=boucle 
    Debug "Added!" 
  Else 
    MessageRequester("Erreur", "Impossible d'allouer de la mémoire pour un nouvel évenement !", 16) 
  EndIf 
Else 
  MessageRequester("Erreur","Un évenement avec un nom identique existe déja.",#MB_ICONEXCLAMATION) 
EndIf  

EndProcedure 

Procedure OpenProjectEvents() 

  If ProjectFP$="omicronle" : ProjectFP$="test.olp" : EndIf 
  EventFP$=Left(ProjectFP$,len-3)+"event" 
  If FileSize(EventFP$)>-1 
    fp=ReadFile(0,EventFP$) 
    If fp 
      Repeat 
        Name$=ReadString() 
        Type=Val(ReadString()) 
        actif=Val(ReadString()) 
        lance=Val(ReadString()) 
        boucle=Val(ReadString()) 
        ReadString() 
        CreateEvent(Name$,Type,actif,lance,boucle) 
      Until Eof(0)<>0 
    Else 
      MessageRequester("Erreur","Impossible de lire le fichier des évenements !",16) 
    EndIf 
  EndIf 

EndProcedure 

Procedure SaveProjectEvents() 
  If ProjectFP$="omicronle" : ProjectFP$="test.olp" : EndIf 
  len=Len(ProjectFP$) 
  EventFP$=Left(ProjectFP$,len-3)+"event" 

  fp=CreateFile(0,EventFP$) 
  
  If fp  
    ResetList(TEventList()) 
    Debug "saving"    
    While NextElement(TEventList()) 
        WriteStringN(TEventList()\Name$) 
        WriteStringN(Str(TEventList()\Type)) 
        WriteStringN(Str(TEventList()\actif)) 
        WriteStringN(Str(TEventList()\lance)) 
        WriteStringN(Str(TEventList()\boucle)) 
        WriteStringN("")      
    Wend 
    Debug "saved" 
    CloseFile(0)  
  Else 
    MessageRequester("Erreur","Impossible de créer le fichier "+EventFP$,16) 
  EndIf 
EndProcedure 

Procedure EventItemRequester(event_type,event_id) 

  

EndProcedure 

Procedure Open_Main() 
  If OpenWindow(#Main, 137, 52, 1000, 665,  #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Editeur d'évenements - ("+ProjectFP$+")") 
    If CreateGadgetList(WindowID()) 
      ButtonGadget(#Btn_Apply, 885, 630, 110, 30, "Appliquer") 
      ButtonGadget(#Btn_OK, 655, 630, 110, 30, "OK") 
      ButtonGadget(#Btn_Cancel, 770, 630, 110, 30, "Annuler") 
      Frame3DGadget(#Frm_E, 5, 0, 215, 625, "Evenements") 
      ListViewGadget(#Lst_E, 10, 15, 205, 300) 
      ButtonGadget(#Btn_E_Add, 10, 595, 60, 25, "Ajouter") 
      ButtonGadget(#Btn_E_Edit, 80, 595, 60, 25, "Appliquer") 
      ButtonGadget(#Btn_E_Del, 150, 595, 65, 25, "Supprimer") 
      TextGadget(#Lbl_Credits, 5, 635, 325, 20, "Event Editor pour OMICRON Level Editor v0.5 - CYBISOFT") 
      Frame3DGadget(#Frm_C, 230, 0, 765, 310, "Conditions : causes de l'évenement") 
      Frame3DGadget(#Frm_Effet, 230, 315, 765, 310, "Effets : conséquences de l'évenement") 
      TextGadget(#Lbl_E_Name, 10, 330, 205, 15, "Nom de l'évenement") 
      StringGadget(#Str_E_Name, 10, 345, 205, 20, "") 
      TextGadget(#Lbl_E_Type, 10, 375, 205, 15, "Type d'évenement") 
      ComboBoxGadget(#Cmb_E_Type, 10, 390, 205, 140) 
        ;items 
        AddGadgetItem(#Cmb_E_Type,0,"Camera Collision") 
        AddGadgetItem(#Cmb_E_Type,1,"Mesh Collision") 
        AddGadgetItem(#Cmb_E_Type,2,"Processus Parallèle") 
        
      CheckBoxGadget(#Chk_E_Actif, 10, 425, 205, 15, "Actif") 
      CheckBoxGadget(#Chk_E_Started, 10, 445, 205, 15, "Lancé au demarrage") 
      CheckBoxGadget(#Chk_E_Loop, 10, 465, 205, 15, "Répéter en boucle") 
      ButtonGadget(#Btn_C_Add, 760, 280, 75, 25, "Ajouter") 
      ButtonGadget(#Btn_C_Apply, 845, 280, 65, 25, "Modifier") 
      ButtonGadget(#Btn_C_Del, 920, 280, 70, 25, "Supprimer") 
      ListIconGadget(#Lst_C, 235, 15, 520, 290, "Condition", 200) 
      AddGadgetColumn(#Lst_C,1,"Description",320) 
        ;items 
        ;AddGadgetItem(#Lst_C,0,"Code Blitz3d"+Chr(10)+"Code source au langage Blitz3d.") 
        AddGadgetItem(#Lst_C,0,"Toujours"+Chr(10)+"Les effets se produisent toujours.") 
        
      ListIconGadget(#Lst_Effet, 235, 330, 520, 290, "Effet", 200) 
      AddGadgetColumn(#Lst_Effet,1,"Description",320) 
        ;items 
        AddGadgetItem(#Lst_Effet,0,"Code Blitz3d"+Chr(10)+"Code source au langage Blitz3d.") 

      ButtonGadget(#Btn_Effet_Add, 760, 595, 75, 25, "Ajouter") 
      ButtonGadget(#Btn_Effet_Apply, 845, 595, 65, 25, "Modifier") 
      ButtonGadget(#Btn_Effet_Del, 920, 595, 70, 25, "Supprimer") 
      TextGadget(#Lbl_C_List, 760, 15, 230, 15, "Liste des conditions de l'évenement") 
      ListViewGadget(#Lsl_C_List, 760, 30, 230, 245) 
            
      OpenProjectEvents() 
            
      Repeat 
        e=WaitWindowEvent() 
        If e=#PB_Event_Gadget 
          Select EventGadgetID() 
            ;MAIN WINDOW 
            Case #Btn_Cancel 
              e=#PB_Event_CloseWindow 
            Case #Btn_OK 
              SaveProjectEvents() 
              e=#PB_Event_CloseWindow 
            Case #Btn_Apply 
              SaveProjectEvents() 
              
            ;EVENT FRAME 
            Case #Btn_E_Add 
              eventname$=GetGadgetText(#Str_E_Name) 
              eventtype=GetGadgetState(#Cmb_E_Type) 
              If eventname$="" Or GetGadgetText(#Cmb_E_Type)="" 
                MessageRequester("Erreur","Vous n'avez pas indiqué le nom et/ou le type de l'évenement") 
              Else 
                CreateEvent(eventname$,eventtype,GetGadgetState(#Chk_E_Actif),GetGadgetState(#Chk_E_Started),GetGadgetState(#Chk_E_Loop)) 
              EndIf 
            Case #Lst_E 
              ShowEventInfos(GetGadgetText(#Lst_E)) 
              
            ;CONDITIONS FRAME 
            Case #Lst_C 
                
          EndSelect 
        EndIf 
        
      Until e=#PB_Event_CloseWindow 
      
      End 
      
    EndIf 
  EndIf 
EndProcedure 

Procedure CheckFrom() 
  ProjectFP$=ProgramParameter() 
If ProjectFP$<>"omicronle" 
  If FileSize(ProjectFP$)=-1 : MessageRequester("Erreur","Le fichier spécifié par OmicronLE n'existe pas !",16) : End : EndIf  
EndIf 
  Open_Main() 
EndProcedure
Open_Main()
mangatome
Messages : 80
Inscription : mer. 29/déc./2004 13:19
Contact :

Message par mangatome »

tiens, je connaissais pas ForEach. on a pareil en BB.
ok merci ça marche super :) merci beaucoup :D
http://www.cybisoft.net - mes jeux, mods, tools en PB et autres languages :)
Répondre