Kurze Frage zu Pointern
-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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.
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.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Kurze Frage zu Pointern
Hier mal parameterübergabe ByVal und ByRef:
Man könnte die 20 auch in *b poken, aber mit der Strukture spart man sich diesen call.
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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.
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.
-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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...
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?
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
Aber den Pointer eines Listenelements so einfach verschieben geht nicht oder?
-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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...
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Kurze Frage zu Pointern
Zu Deiner Frage: Nimm Stringfield in einer Schleife und es geht schneller
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
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.

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

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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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... 

-
- Beiträge: 180
- Registriert: 24.09.2010 10:39
Re: Kurze Frage zu Pointern
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.
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