Seite 2 von 5
Verfasst: 30.07.2007 21:46
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:
benutzt man halt
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."
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.

Verfasst: 30.07.2007 23:03
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.
Verfasst: 31.07.2007 08:51
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
Verfasst: 31.07.2007 09:18
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 man
schmal...

Verfasst: 31.07.2007 13:47
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)))
Verfasst: 31.07.2007 13:56
von Kaeru Gaman
@Olaf
warum so umständlich? hast du das posting von ts übersehen?
ts-soft hat geschrieben:
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

Verfasst: 31.07.2007 13:58
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()))
Verfasst: 31.07.2007 14:39
von Olaf
@Kaeru & ts:
1. Ja, hab ts's Posting übersehen
2. Hab außerdem noch vergessen, dass die Arrays ja sowas wie nen Header haben, wo die Länge drinsteht

Verfasst: 31.07.2007 17:34
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?

Verfasst: 31.07.2007 17:40
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?

Ich denke er meint die IsFunktionen:
IsSprite, IsGadget, IsHübsch ...
Die sind schon wichtig bei dynamischen Sachen und in Callbacks