Liste mit Strings in String-Array casten
Übersicht

TritiumBetreff: Liste mit Strings in String-Array casten |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tag zusammen,
ich möchte eine TList, die nur Strings enthält, in ein Array von Strings überführen. Leider klappt das nicht so recht. Mein bisheriger Ansatz sieht so aus: BlitzMax: Framework BRL.Blitz Mein Array ist jetzt jedoch leer. Ich vermute, dass da was auf dem Weg vom TObject zum String nicht klappt. Weiß jemand, was ich falsch mache bzw. wie ich diese Umwandlung anders (und halbwegs effizient) hinbekomme? Schonmal Danke für's Lesen! ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst jedes Element einzeln Casten:
BlitzMax: SuperStrict Edit: Eine Funktion, die die Liste annimmt und ein String[] liefert, wäre wahrscheinlich am besten... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also bedeutet das, dass man eigentlich überhaupt nicht mit String[]() casten kann, es aber auch nicht als Fehler gemeldet wird? | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Versuch Code: String[](ListToArray(list)) zu casten wird einfach fehl schlagen und NULL liefern, das ist schon korrekt.
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mh, das ist schade, wär schön einfach gewesen... Naja, kann man nix machen. Danke für die Antworten! | ||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das verstehe ich allerdings nicht.
Ich nutze das auch meist so :O Sprich - MeinType[](Tlist.toArray) - und das funktioniert. :O |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax Version 1.43/Windows:
BlitzMax: Global list:TList = New TList Output: Code: Building untitled2
Compiling:untitled2.bmx flat assembler version 1.69.14 (553925 kilobytes memory) 3 passes, 4129 bytes. Linking:untitled2.debug.exe Executing:untitled2.debug.exe 3/0 Process complete ZEVS |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@PhillipK: Eben, deswegen wundert es mich, dass es mit Strings jetzt nicht funktioniert.
@ZEVS: Ja, bei mir gehts auch nicht. Oder was genau meinst Du? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mh.
Types funktionieren... BlitzMax: SuperStrict Hin und her casten geht... BlitzMax: SuperStrict Nur von einer Liste nicht... BlitzMax: SuperStrict Mh... Edit: Siehe hier (verständlicher wird mir das Verhalten dadurch auch nicht, aber scheint kein Bug zu sein) |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dein Link funktioniert leider nicht ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist unter "Hidden Forums" - vermutlich musst du auf bb.com eingeloggt sein.
marksibly hat Folgendes geschrieben: The issue here is that just because all the elements of the objs array are strings, they don't necessarily have to be - as far as the compiler's concerned, it's an Object[] which could contain *anything*.
|
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mh, das versteh ich nicht ganz. Ich war davon ausgegangen, dass beim Casten grundsätzlich erstmal versucht wird, aus einem TObject den spezifizierten Type zu machen. Sollte das nicht klappen, kommt Null als Ergebnis raus. Bei einem Array hab ich vermutet, dass das Element für Element passiert, also doch auch klappen müsste!? | ||
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist Banane ob das Array vom Typ String oder vom Typ Object ist:
BlitzMax:
|
||
Farbfinsternis.tv |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
So ganz "Banane" ist das nicht. Die For-EachIn list - Schleife castet nämlich automatisch.
Der bug wird durch Reflection offenbart: BlitzMax: Local obj:Object[] = ["A", "B", "C"] Output: Code: String[] Das mit Xeres' Beispiel:BlitzMax: SuperStrict Output: Code: A, B, C 3 A, B, C String[] Es scheint eine BMax-Funktion zu geben, die Array-Types spezialisiert. Das ganze geht aber auch noch eindrucksvoller: BlitzMax: SuperStrict Code: A, B, C 3 A, B, C String[] String[] TTimer Schon toll, einen Timer im String-Array zu haben... ZEVS |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also bedeutet das, dass alle Arrays grundsätzlich vom Type TObject sind, ganz egal, wie sie eigentlich initialisiert wurden?
Edit: Mh, allerdings scheints mir nach Deinem Post auch so zu sein, dass das Casten intern keinen großen Effekt hat, schließlich scheint das String-Array nach dem Casten zu einem Object-Array immer noch ein String-Array zu sein... Ich hab grad Schwierigkeiten, das geistig vollständig zu durchdringen... |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Der Type heißt (entgegen der Konvention) nur Object. Falls du mal damit arbeitest, wirst du schon noch an daran verzweifeln (zumindest ich tue das).
2. Alles (ok, es gibt Ausnahmen, aber String ist keine) ist vom Type Object. Das liegt daran, dass jeder Type Object quasi "automatisch" erweitert. 3. Das Beispiel zeigt einen anderen Umstand: Es wurde ein Array als Object[] intalisiert, wurde aber durch die Wertverteilung zu String[], was an sich inkompatibel ist (jeder String ist Object, aber nicht jedes Object ist String). Das kratzt BMax aber nicht mal, wenn man wirklich mal einen nicht-String in das Array tut. So hat man am Ende einen TTimer im String[], obwohl das inkompatibel ist. Wenn man aber eine Liste von Strings in ein Array umformt, dann ist das Ergebnis wirklich ein Object[], von Reflection bestätigt. Das gleiche gilt, wenn man die Werte nicht mit der Deklaration vorgibt. Xeres wollte sich bei seinem Beispiel Zeit sparen und hat die Werte kurz eingegeben - und dadurch unabsichtlich zu String[] gecastet. Deswegen funktioniert Xeres' Beispiel. ZEVS |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Da hast Du allerdings Recht.
2. Das ist mir schon klar. 3. Ich war bisher immer davon ausgegangen, dass Operationen wie bspw. Code: ["A","B"] + [42] ein Array erzeugen, das als Type den "kleinsten gemeinsamen Nenner" aller Elemente besitzt (im Beispiel also Object).
Heißt das jetzt im Klartext, dass das ein Bug seitens der Sprache ist? Oder dass sich Mark Sibly etwas dabei gedacht hat? Edith sagt: Man sollte den kleinsten gemeinsamen Nenner nicht mit dem größten gemeinsamen Teiler verwechseln. |
||
- Zuletzt bearbeitet von Tritium am Sa, Nov 19, 2011 23:26, insgesamt einmal bearbeitet
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
1. Man kann Arrays so addieren? Cool...
2. Es gibt keinen kleinsten gemeinsamen Nenner zwischen String und Int, denn Int ist eine der o.g. Ausnahmen (manchmal könnte ich diesen Mark *****! Man kann keine nativen Zahlen in TLists speichern!). 3. Da ist auf jeden Fall ein bug, wenn ein (ich schreibe es jetzt, glaube ich, zum dritten Mal), ein TTimer in einem String[] ist. Der kleinste gemeinsame Nenner wäre auf jeden Fall Object, das interessiert BMax aber nicht. Interessanterweise ist es nicht möglich, bei der Deklaration eines Object[]s, Werte verschiedener Typen anzugeben. Man muss sie alle einzeln, manuell casten. Für dein Problem sehe ich keine native Lösung durch casten... Schade. ZEVS |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Tja, dann bleibt mir wohl tatsächlich nur die Schleife, allerdings ohne EachIn, wenn ich das jetzt richtig verstanden habe.
Ich find es echt schade, dass eine Sprache, die so viele Vorzüge bietet, gleichzeitig auch solche Kinderkrankheiten nicht ablegen kann. Übrigens finden sich in der Hilfe unter "Language Reference" in den Unterpunkten "Arrays", "BASIC Compatibility" und "Slices" noch mehr solcher Operationen. |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, hier nochmal abschließend eine kurze Funktion, die ich mir grad geschrieben hab:
BlitzMax: Strict Gibt's Verbesserungsvorschläge, was die Geschwindigkeit angeht? |
||
- Zuletzt bearbeitet von Tritium am Di, Nov 22, 2011 15:05, insgesamt einmal bearbeitet
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group