Seite 2 von 2

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 19:40
von SebastianJu2
Nicht übel nehmen ok? Ich denke das Ganze mal üben kann nicht schaden. Langsamer als PB-Funktionen wird es ja hoffentlich nicht werden.

Strukturen sind das... jetzt hab ich sie auch im Strukturverzeichnis gefunden. Macht dann Sinn. Ich hab mich schon gewundert wie die Variablen benutzt wurden. In diesem übersetzten Buch und in einigen Tutorial auf der Tutorialseite habe ich aber diese Strukturen nicht erwähnt gefunden. Auch in der Hilfe hab ich keinen Hinweis darauf gefunden.
Na ich denke ich komme jetzt klar damit.

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 19:53
von ts-soft
Hier mal parameterübergabe ByVal und ByRef:

Code: Alles auswählen

Procedure Foo(a, *b.Integer)
  a = 15
  *b\i = 20
EndProcedure

Define a = 5
Define b = 10

Foo(a, @b)

Debug a
Debug b
Man könnte die 20 auch in *b poken, aber mit der Strukture spart man sich diesen call.

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 20:00
von SebastianJu2
Danke fürs Beispiel...

Schade dass das Danke-Skript nicht fähig sein wird unter dem jeweiligen Post anzugeben wer sich bedankt hat. Das find ich in anderen Foren immer recht nützlich. Aber da man in der Signatur keine PostID auswerten kann... man könnte höchstens den Referrer auswerten bzw die URL der Seite die die Grafik abruft, aber dann wären die Danke seitenweise gezählt.

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 21:47
von SebastianJu2
Ich hab jetzt mal versucht möglichst viel mit Pointern zu machen in der Funktion. Besonders gut ist mir das nicht gelungen denke ich. Daher mal die Frage wie ich die Funktion von Zeile 41 bis 58 (Der Bereicht ist von 2 Leerzeilen jeweils abgegrenzt) besser hätte schreiben können...

Code: Alles auswählen

EnableExplicit

Define *MainWindowHandle, *InputEditorHandle, *InputListIconHandle
Define *InputEditorList, *c.Character, *LineStart, *InputTransferButtonHandle
Define.i EventID, CharCount = 0
Define.s InputEditorList$
NewList InputList.String()

Procedure Msg(Msg$,Type.a = 0)
Define Type$
  If Not Type : Type$ = "Error" : Else : Type$ = "Message" : EndIf
  MessageRequester(Type$, Type$+": " + Msg$, 0)
  If Not Type : End : EndIf
EndProcedure

Procedure ChkCreated(*Handle.i, Type$, Action$ = "create", Addition$ = "")
  If Not *Handle : Msg("Couldnt " + Action$ + " " + Type$ + " " + Addition$) : End : EndIf
EndProcedure

Macro ListAdd(List,Value)
  AddElement(List) : List = Value
EndMacro
Macro ListAddS(List,Value)
  AddElement(List) : List\s = Value
EndMacro

*MainWindowHandle = OpenWindow(#PB_Any, 0, 0, 661, 680, "URLTool", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
ChkCreated(*MainWindowHandle,"Window")
*InputEditorHandle = EditorGadget(#PB_Any, 10, 10, 200, 100)
*InputTransferButtonHandle = ButtonGadget(#PB_Any, 10, 120, 30, 30, "V")
*InputListIconHandle = ListIconGadget(#PB_Any, 10, 160, 200, 100, "title", 50, #PB_ListIcon_MultiSelect)

Repeat
  EventID = WaitWindowEvent()
  
  If EventWindow() = *MainWindowHandle And EventID = #PB_Event_Gadget
    
    If EventGadget() = *InputTransferButtonHandle
      
      
      InputEditorList$ = GetGadgetText(*InputEditorHandle)
      *LineStart = @InputEditorList$
      *c = @InputEditorList$
      Repeat
        If *c\c <> 10 And *c\c <> 13
          CharCount + 1
        Else
          If CharCount <> 0 ;When Linebreak contains more than one char
            ListAddS(InputList(), PeekS(*LineStart,CharCount))
            CharCount = 0
          EndIf
        EndIf
        *c + SizeOf(Character)
        If CharCount = 0 : *LineStart = *c :EndIf
      Until  *c\c = 0
      If CharCount > 0
        ListAddS(InputList(), PeekS(*LineStart,CharCount))
      EndIf
      
      
      ForEach InputList()
        Debug InputList()\s
      Next
    EndIf
    
  EndIf
  
Until EventID = #PB_Event_CloseWindow
Ich habe auch versucht mit Verschieben des Pointers das Listenelement zu füllen aber mir scheint das ist nicht wirklich möglich. Ansonsten hätte ich nämlich die Chr(10) und Chr(13) mit 0 gefüllt und dann das neue Listenelement bzw der String in der Struktur des Listenelements auf den Teilstring verweisen lassen. Da der String der mit GetGadgetText gefüllt wurde so wie so nicht mehr gebraucht wird wenn der Text in der Liste eingeschrieben wurde hätte das vermutlich auch keine Gefahr dargestellt.
Aber den Pointer eines Listenelements so einfach verschieben geht nicht oder?

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 21:59
von SebastianJu2
Oh man... ich hätte ja einfach eine Pointerliste bauen können... dann geht das auch mit dem Zuweisen an Teile des Ursprungstrings... das probier ich gleich mal...

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 22:08
von ts-soft
Zu Deiner Frage: Nimm Stringfield in einer Schleife und es geht schneller :lol:

Deine ganze Pointerei erfüllt keinen Zweck, macht den Code schwer lesbar
und Fehleranfällig ohne auch nur den geringsten Vorteil zu haben.

Der einzige "Vorteil" Deiner Pointere: so geht auch kein Unicode mehr :mrgreen:

Mit Pointern kann man in bestimmten Situation Zeit schinden oder zustätzliche
Variablen sparen, aber dies alles ist nicht der Fall in diesem Beispiel.

So wird das nie was, mit Gewalt pointer reindrücken macht den Code nur
schwer lesbar und fehleranfällig, lass das besser sein, so strampelst Du
auf der Stelle.

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 22:22
von SebastianJu2
Aber ich muss es doch auch mal lernen. Bisher hatte ich noch keine so zeitaufwändige Funktion wo das mit den Pointern wirklich Sinn machte aber ich will trotzdem mal kapiert haben wie man das macht... :)

Re: Kurze Frage zu Pointern

Verfasst: 06.03.2011 22:37
von SebastianJu2
Ich glaub ich habs... und diesmal werden keine neuen Stringvariablen geöffnet. Ich nutze einfach den Ausgangsstring, ersetze die Zeilenumbrüche mit 0, also Stringendezeichen und setze Pointer einer Liste auf die Anfänge der Teile. Ich bin der Meinung das sollte schnell sein wenn es darauf ankäme...
Gibt es bei so etwas eigentlich nicht ein Problem wenn der Speicherort des Strings fragmentiert ist?

@ts-soft

Du meintest vorhin dass Unicode nicht mehr funktionieren könnte. Allerdings wenn man nicht einfach nur Zahlen auf die Pointer addiert um vorwärtszugehen sondern SizeOf, dann sollte das doch funktionieren oder? Auch die Zeilenumbrüche in Unicode sollte man doch mit 10 und 13 auslesen nicht?

Hier mal der Code: Die Funktion ist in Zeile 42-54.

Code: Alles auswählen

EnableExplicit

Structure Pointer
  *p
EndStructure

Define *MainWindowHandle, *InputEditorHandle, *InputListIconHandle
Define *InputEditorList, *c.Character, *lastc.Character, *LineStart, *InputTransferButtonHandle
Define.i EventID, CharCount = 0
Define.s InputEditorList$
NewList InputList.Pointer()

Procedure Msg(Msg$,Type.a = 0)
Define Type$
  If Not Type : Type$ = "Error" : Else : Type$ = "Message" : EndIf
  MessageRequester(Type$, Type$+": " + Msg$, 0)
  If Not Type : End : EndIf
EndProcedure

Procedure ChkCreated(*Handle.i, Type$, Action$ = "create", Addition$ = "")
  If Not *Handle : Msg("Couldnt " + Action$ + " " + Type$ + " " + Addition$) : End : EndIf
EndProcedure

Macro ListAdd(List,Value) : AddElement(List) : List = Value : EndMacro
Macro ListAddS(List,Value) : AddElement(List) : List\s = Value : EndMacro
Macro ListAddP(List,Value) : AddElement(List) : List\p = Value : EndMacro

*MainWindowHandle = OpenWindow(#PB_Any, 0, 0, 661, 680, "URLTool", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
ChkCreated(*MainWindowHandle,"Window")
*InputEditorHandle = EditorGadget(#PB_Any, 10, 10, 200, 100)
*InputTransferButtonHandle = ButtonGadget(#PB_Any, 10, 120, 30, 30, "V")
*InputListIconHandle = ListIconGadget(#PB_Any, 10, 160, 200, 100, "title", 50, #PB_ListIcon_MultiSelect)

Repeat
  EventID = WaitWindowEvent()
  
  If EventWindow() = *MainWindowHandle And EventID = #PB_Event_Gadget
    
    If EventGadget() = *InputTransferButtonHandle
      
      
      InputEditorList$ = GetGadgetText(*InputEditorHandle)
      *c = @InputEditorList$
      *lastc = @InputEditorList$
      ListAddP(InputList(),*c)
      Repeat
        If *c\c = 10 Or *c\c = 13
          *c\c = 0
        ElseIf *lastc\c = 0
          ListAddP(InputList(),*c)
        EndIf
        *lastc = *c
        *c + SizeOf(Character)
      Until  *c\c = 0
      
      
      ForEach InputList()
        Debug PeekS(InputList()\p)
      Next
    EndIf
    
  EndIf
  
Until EventID = #PB_Event_CloseWindow