Array Probleme...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Kaeru Gaman hat geschrieben:also, wenn ich ein festes Array habe, dann hab ich dort ja den entsprechenden wert,
wie groß mein Array ist, den verwende ich ja beim Dim, und der ändert sich nicht.

also um sowas zu machen:

Code: Alles auswählen

For i=0 to CountArray(Array()) 
benutzt man halt

Code: Alles auswählen

Dim Array( #ArraySize )
...
...
For i=0 to #ArraySize
wenn ich ein array des öfteren ReDim, dann habe ich auch dort den wert für das ReDim angegeben,
den kann ich dann auch dementsprechend mitführen, zurückgeben, was auch immer.

also, in den allermeisten fällen ist es ein zeichen für schlechte konzeption wenn man die größe seines Arrays erfragen muss.
Nicht unbedingt.
Wenn man Userlibs oder andere möglichst flexibel wiederverwandbaren Codes schreiben möchte werden solche Befehle dringend benötigt, da diese Informationen innerhalb der Routinen nicht unbedingt zur Verfügung stehen.

Das von Dir vorgebrachte Argument ist das gleiche was Freak mal auf die Frage nach Befehlen wie IsScreen(), ScreenWidth(), ScreenHeight und ähnlichen bzw. den Zugriff auf PB-internen Informationen heran gebracht hat: "In einem guten Code muss man solche Werte wissen." :roll:
Wenn mann jedoch möglichst flexibel und modular programmieren möchte (wobei diese Möglichkeit meiner Meinung nach auch eine gute Programmiersprache ausmacht) ist man bei PB teilweise aufgeschmissen.

Wie leicht so Dinge wie z.B. UBound() umzusetzen sind sieht man ja am Beispiel von Thomas. Dass sie dennoch nicht in PB integriert sind ist meines Erachtens nach unverständlich.
Die meisten der irgendwo benötigten Informationen sind ja BP-intern da - PB bietet nur keine offiziell befehlsbasierte Möglichkeit diese Informationen abzurufen. /:->
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja ok, das sind durchaus argumente... teilweise..

wenn ich ne lib oder ein modul schreiben will, kann ich andere informationen über das array auch anders zurückgeben,
z.b. indem ich komplexe structures verwende, was ja bei der WinAPI durchaus gang und gebe ist.

oder ich verwende kein array, sondern selber allocierten speicher, den ich anders verwalte...

beim screen verstehe ich die argumente, denen sich ja Freak letztendlich gebeugt hat,
weil man bei universellen routinen diese dinge nicht unbedingt so zur hand hat.

...wobei auch gilt, wenn ich erweiterte befehle für sprites programmiere,
dann setzen die den screen genauso voraus, wie die normalen sprite-befehle,
also, ab ner bestimmten grenze kann mans auch übertreiben.

ebenso wie erweiterte Draw-Befehle.
ich würde ebenso die existenz eines Drawing-Kanals voraussetzen.

natürlich, für so kleinigkeiten wie die obergrenze eines Arrays...
sollte vielleicht wirklich mal eingepflegt werden.
...obwohl ich es auch niemals benutzt habe, in sprachen, wo es zur verfügung stand.

...viele solcher kleinigkeiten werden auch deshalb vernachlässigt, weil Fred halt andere Prioritäten setzt...

also, es ist immer die frage, für wie nötig man sowas hält.

für ein array sind die infos definitiv so einfach zu erlangen,
dass man mit so nem kurzen Macro auskommt,
also kann es ruhig auch nen befehl dafür geben.

bei vielem anderen denke ich doch, dass es höhere prioritäten gibt.

...mir persönlich zum beispiel läge die einführung von 64bit-argumenten für API calls am herzen,
im hinblick auf die volle funktionalität von openGL,
und natürlich auch eine möglichst systemnahe einbindung von DX9.

...das wär ein hit, wenn Fred dem Priorität gäbe, würde ich freudig auf UBound() verzichten.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Schlingel
Beiträge: 30
Registriert: 28.06.2007 20:06

Beitrag von Schlingel »

tut mir ja leid ich bin nunmal faul....
Klar gibts die Möglichkeit die Grenzen des Arrays irgendwie zu ermitteln.. aber es sind halt weniger Tastenschläge, wenn ich eine PB Funktion um das Array schreibe als irgendwelche Variablen oder Strukturen zu setzen..

Aber auch solche Kleinigenkeiten geben dem Eis noch ein Sahnehäufchen manschmal... und ich mag Eis mit Sahne xD
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Schlingel hat geschrieben:Aber auch solche Kleinigenkeiten geben dem Eis noch ein Sahnehäufchen manschmal... und ich mag Eis mit Sahne xD
aber eben nur manschmal... :wink:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

Gibts i-wie ne Möglichkeit die Größe eines reservierten Speicherbereichs zu bekommen, der nicht mittels API oder AllocateMemory() allociert wurde?
Dann wärs nämlich ganz einfach sowas zu schreiben, was den maximalen Array-Index ermittelt.

Pseudo-

Code: Alles auswählen

Structure xyz
  byte.b
  irgendwas.l
  ;...u.s.w.
EndStructure

Procedure.l GetMaxIndex(*Array,SizeOfEntry)
  Size=GetAllocatedSize(*Array) ; <-- Sowas bräuchte man halt
  MaxIndex=Size/SizeOfEntry
  ProcedureReturn MaxIndex
EndProcedure

Dim Array.xyz(10)

Debug "MaxIndex: "+Str(GetMaxIndex(@Array(0),SizeOf(xyz)))
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Olaf
warum so umständlich? hast du das posting von ts übersehen?
ts-soft hat geschrieben:

Code: Alles auswählen

Macro Ubound(array)
  (PeekL(@array - 8) - 1)
EndMacro
Desweiteren können Arrays auch als Parameter an eine Procedure
übergeben werden. Lbount wäre allerdings sinnlos, da Arrays in PB immer bei
0 beginnen :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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

Beitrag von ts-soft »

Verstehe nicht? Funktioniert doch:

Code: Alles auswählen

Macro Ubound(array)
  (PeekL(@array - 8) - 1)
EndMacro

Structure xyz
  byte.b
  irgendwas.l
  ;...u.s.w.
EndStructure 
Dim Array.xyz(10)

Debug "MaxIndex: " + Str(Ubound(Array()))
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.
Bild
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Beitrag von Olaf »

@Kaeru & ts:
1. Ja, hab ts's Posting übersehen :oops:
2. Hab außerdem noch vergessen, dass die Arrays ja sowas wie nen Header haben, wo die Länge drinsteht :oops:
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Kaeru Gaman hat geschrieben:beim screen verstehe ich die argumente, denen sich ja Freak letztendlich gebeugt hat,
weil man bei universellen routinen diese dinge nicht unbedingt so zur hand hat.
Echt? Wann und wo?
Hab ich was verpasst?
Kommt da was in der Richtung? :o
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
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

Beitrag von ts-soft »

PureLust hat geschrieben:
Kaeru Gaman hat geschrieben:beim screen verstehe ich die argumente, denen sich ja Freak letztendlich gebeugt hat,
weil man bei universellen routinen diese dinge nicht unbedingt so zur hand hat.
Echt? Wann und wo?
Hab ich was verpasst?
Kommt da was in der Richtung? :o
Ich denke er meint die IsFunktionen:
IsSprite, IsGadget, IsHübsch ...
Die sind schon wichtig bei dynamischen Sachen und in Callbacks
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.
Bild
Antworten