Problem mit Prozedur und For To

Für allgemeine Fragen zur Programmierung mit PureBasic.
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Problem mit Prozedur und For To

Beitrag von Graffiti »

Wie kann ich einen Prozedurnamen mit einer Variablen verknüpfen,
so das ich beim Combogadget jeder aktiven Zeile eine seperate
Prozedur zuordnen kann

der Code unten funktioniert leider nicht

Code: Alles auswählen

For i = 1 To 10
ix = GetGadgetState(#Gadget_1 +i-1)
If ix > 0
Buttonxx_1() + ix -1 ; hier liegt mein Problem eine Prozedur zuzuweisen
EndIf
Next
gruß Graffiti
Zuletzt geändert von Graffiti am 04.11.2004 12:57, insgesamt 1-mal geändert.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Geht, glaube ich, währender der Laufzeit nicht. Vielleicht erzeugst du eine
externe Datei bzw. eine DLL , die du nachher wieder einfügst oder ausführst.
Beispielsweise könnte das in etwa so aussehen:

Code: Alles auswählen

Anzahl=5
CreateFile(0,"MyProcedure.pb")
 For i= 0 To Anzahl
  WriteString("Procedure Test_"+Str(i)+"(a)"+Chr(10))
  WriteString("a=a+1"+Chr(10))
  WriteString("Debug a"+Chr(10))
  WriteString("EndProcedure"+Chr(10))
 Next i
For i= 0 To Anzahl
WriteString("Test_"+Str(i)+"("+Str(10+i)+")"+Chr(10))
Next i
CloseFile(0)
RunProgram("pbcompiler","MyProcedure.pb /debugger","",1)
Bild
Win11 Pro 64-Bit, PB_6.11b1
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

Hallo Falco,

ich glaube dann ist es einfacher 120 mal

if ix = 1 : Buttonxx_1() : EndIf

........

if ix = 120 : Buttonxx_120() : EndIf

oder nicht
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Nein, in so einem Fall, glaube ich, sollte man auf jeden Fall Select verwenden.

also:

Code: Alles auswählen

Select ix
   Case 1
      Buttonxx_1()

   Case 2
      Buttonxx_2()

   ...

EndSelect
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Wenn du die 120 Zeilen oder mehr schreiben willst, wohl kaum. :mrgreen:
Dann währe dieses vielleicht doch schneller, oder??
Leider kann man das im Programm nicht nachträglich mit
include einfügen. Geht leider nicht, da die Datei "MyProcedure.pb"
vorher vorhanden sein muß.

Code: Alles auswählen

Anzahl=120; variabel
CreateFile(0,"MyProcedure.pb")
 For i= 0 To Anzahl
  WriteString("Procedure Buttonxx_"+Str(i)+"(a)"+Chr(10))
  WriteString("a=a+1"+Chr(10))
  WriteString("Debug a"+Chr(10))
  WriteString("EndProcedure"+Chr(10))
 Next i
For i= 0 To Anzahl
string$="if ix="+Str(i)
string$=string$+":Buttonxx_"+Str(i)+"("+Str(10+i)+")"
string$=string$+":Endif"+Chr(10)
WriteString(string$)
Next i
CloseFile(0)
RunProgram("MyProcedure.pb","","",1)
;RunProgram("pbcompiler","MyProcedure.pb /debugger","",1)
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Ein weiteres Beispiel:

Code: Alles auswählen

Procedure Test_001(val)
  MessageRequester("","Test_001" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_002(val)
  MessageRequester("","Test_002" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_003(val)
  MessageRequester("","Test_003" + #CRLF$ + Str(val))
EndProcedure
Procedure Test_004(val)
  MessageRequester("","Test_004" + #CRLF$ + Str(val))
EndProcedure

Dim FunctionList(3)

FunctionList(0) = @Test_001()
FunctionList(1) = @Test_002()
FunctionList(2) = @Test_003()
FunctionList(3) = @Test_004()

For i = 1 To 4
  Debug i
  CallCFunctionFast(FunctionList(i-1),i*10)
Next
@Graffiti:
Aber eine frage habe ich schon noch: Unterscheiden sich die Prozeduren denn so voneinander, dass es nicht möglich ist für alle Zeilen des Combo-Gadgets eine Prozedur zu verwenden, die als Argument dann die ausgewählte Zeile erhalten?

cu, helpy
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

bluejoke hat geschrieben:Nein, in so einem Fall, glaube ich, sollte man auf jeden Fall Select verwenden.

also:

Code: Alles auswählen

Select ix
   Case 1
      Buttonxx_1()

   Case 2
      Buttonxx_2()

   ...

EndSelect
aber nur wegen der Übersichtlichkeit

zumindest ein ASM-Output per PB zeigt dass if : endif Entscheidungen weniger Befehle benötigen als Select case endselect Entscheidungen und damit womöglich etwas schneller sind.

ist mir aber eigentlich auch egal
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Graffiti hat geschrieben:ich glaube dann ist es einfacher 120 mal

if ix = 1 : Buttonxx_1() : EndIf
........
if ix = 120 : Buttonxx_120() : EndIf
Oder Du nimmst ein Array dazu.

Code: Alles auswählen

Dim Buttonxx.l(120)

Buttonxx(1)   = @Buttonxx_1()
...
Buttonxx(120) = @Buttonxx_120()


Aufruf von Procedure-Nr i:
CallFunctionFast( Buttonxx(nr) )
Viel schneller als If..EndIf oder Select..Case, aber trotzdem
platformunabhängig.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Graffiti
Beiträge: 173
Registriert: 30.08.2004 08:34
Wohnort: Thailand

Beitrag von Graffiti »

Danke erstmal für die verschiedenen Möglichkeiten, jetzt habe ich
wieder was zu testen und tüfteln

aber warum geht das prinzipiell nicht so wie bei den Gadgets
einfach ein + i - 1 dranhängen und gut ists.
schätze das könnten mehrere mal gebrauchen.

@Danilo

wäre doch noch ne Idee für deine PureTools oder nicht


gruß Graffiti
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Graffiti hat geschrieben:@Danilo
wäre doch noch ne Idee für deine PureTools oder nicht
Nein.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten