Autor Thema: Einem String-Array ein Array zuordnen  (Gelesen 4893 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Einem String-Array ein Array zuordnen
« am: 11.09.04 - 21:50:31 »
Hi,

ich habe folgende Sub:

Code
Sub Exp (strFieldNameArray() As String, strFieldTitleArray() As String)

   'Ist strFieldNameArray ein Array?
   If Not Isarray(strFieldNameArray) Then
      Error 1002, "strFieldNameArray ist kein Array !"
   End If
   
   'Ist LBound = 0
   If Lbound(strFieldNameArray) <> 0 Then
      Error 1003, "LBound vom Array 'strFieldNameArray' ist nicht 0 !"
   End If
   
   'Check strFieldTitleArray
   If (Not Isarray(strFieldTitleArray)) Or (Lbound(strFieldTitleArray) <> 0) Then
      'XXXXX
   End If   

   'usw.

Bei dem Teil "XXXXX" möchte ich in die String-Array-Variable "strFieldTitleArray" die Variable "strFieldNameArray" setzen.

Nur da geht das Gezeter los:

Z.B. ein
   strFieldTitleArray = strFieldNameArray

Oder ein
   Redim strFieldTitleArray(0)
   strFieldTitleArray = Arrayappend(strFieldTitleArray, strFieldNameArray)
lässt sich nicht kompilieren, da "Illegal reference to array or list "strFieldTitleArray".

Würde ich in der Sub das strFieldTitleArray als Variant deklarieren, dann würde es imo gehen. Ich will aber hier, dass das ein String-Array ist.

Was will ich machen:
Wenn eine bestimmte Bedingung zutrifft, dann soll String-Array "strFieldTitleArray" = "strFieldNameArray"

Ich hoffe es gibt da eine einfache Lösung (ohne das Array komplett neu aufzubauen oder auf Variant switchen zu müssen).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #1 am: 11.09.04 - 22:31:39 »
Wo siehst Du einen Unterschied zwischen einem Variant vom Typ String und einem Array of Strings ? Warum nimmst Du nicht Variant ?

Was machst Du eigentlich mit dieser Abfrage:
Code
   If Lbound(strFieldNameArray) <> 0 Then
      Error 1003, "LBound vom Array 'strFieldNameArray' ist nicht 0 !"
   End If

By the way: Das von Dir angesprochene ArrayAppend arbeitet mit VARIANTS ...

Sag' mal genaueres  ;)

Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #2 am: 11.09.04 - 22:49:45 »
Zu 1) (warum ich nicht Variant nehme)
Ich will es eingrenzen soweit es geht.
Dim myArray() as String erscheint mir sauberer, weil eingegrenzter, als Dim myArray() as Variant.
Außerdem: Wenn ein "User" meiner Routine das "... as String" liest, ist sofort klar, dass da nix anderes reindarf. Steht da "...as Variant", ist das u.U. unklar (auch wenn die Routine sauber dokumentiert ist).

Zu 2) (was ich mit der Abfrage mache)
Ich prüfe, ob das lower bound des übergebenen Arrays = 0 ist. Wenn nicht, greift ein Errorhandling. Ist ein Scriptentwurf, später kommt diese Abfrage direkt in die Weiterverarbeitung des Arrays.

Ich bin aber für Tipps immer aufgeschlossen :-) So wie ich es deute, kann ich das mit meinem StringArray nicht so einfach händeln, und muss wohl doch leider auf Variant switchen  ::)
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #3 am: 11.09.04 - 23:06:44 »
Warum willst Du es denn eingrenzen ? Allgemeine Routinen versuche ich immer so zu schreiben, dass ich damit möglichst beliebige Datentypen verarbeiten kann. Arrays verketten ? Da würde ich doch später nicht darüber nachdenken wollen, ob das Strings, Date/Times oder Zahlen sind.

Das mit dem Ubound verstehe ich noch immer nicht. Jedes Array hat als UBound den Wert 0 (es sei denn, Option Base ist gemeinerweise verstellt). Schwieirg ist zu entscheiden, ob das Array "leer" ist und was mit leer überhaupt gemeint ist. Das ist jetzt aber eine ganz neue Frage  ;D

Bernhard

PS: Was soll das mit dem "User" ? Dem späteren Nutzer kannst Du doch Vorschriften machen (aussagekräftiger Header) UND den Datentyp abprüfen. Du musst doch bei sowas sowieso sehr viel prüfen: IsEmpty, IsArray, IsScalar usw.

Marinero Atlántico

  • Gast
Re:Einem String-Array ein Array zuordnen
« Antwort #4 am: 11.09.04 - 23:07:41 »
Ich würd das nicht so eng sehen.
Du kannst ja bei der Weiterverarbeitung des Arrays überprüfen, ob alle Elemente des Arrays vom Datentyp String sind.

Viele Programmiersprachen kennen überhaupt keine strenge Typisierung (in JavaScript ist es sehr optional, Python). Es gibt nicht wenige Leute, die strenge Typisierung (Java ist normal auch streng typisiert) als unproduktiv kritisieren.

Um mal beim Vergleich zu bleiben: In den dynamisch erweiterbaren "ArrayTypen"* von Java wie HashSet und ArrayList sind auch alle Elemente Objekt und können nicht weiter spezifiziert werden. In Java1.5 wird es da aber eine Erweiterung geben.

Gruß Axel

----
*populistisch gesprochen. Eigentlich sind das Collection-Klassen.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #5 am: 11.09.04 - 23:22:38 »
@Bernhard:
Und genau das, also ob UBound = 0 und nicht 1, muss ich abfangen. Gehört für mich zu Errorhandling. Ich kann ja nicht 100% sicher sein, dass das übergebende Array nicht mit 0 anfängt sondern mit 1.

Ich will auch keine Arrays verketten, war nur ein Versuch, um Array B in Array A zu übernehmen (siehe oben). Ich will in meiner Routine nur Arrays vom Typ String. Andere scalare Datentypen machen hier vom Kontext keinen Sinn (es werden u.a. Itemnamen übergeben, daher mein Wunsch dieser Einschränkung von vorne weg auf String, damit alles klar ist - und nicht wer auf die Idee kommt da ein Integer oder so reinzukippen).

@Axel: Danke für die Infos über andere Programmiersprachen.

Fazit:
Es führt wohl kein simpler Weg daran vorbei, Variant zu nehmen.
Schade, aber wie Axel erwähnte, wird das wohl eh in vielen Programmiersprachen nicht so streng gehandhabt, wie ich das im Moment mache.

Ich nehme jetzt Variant  ;D
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #6 am: 11.09.04 - 23:30:27 »
Jetzt haben wir beide von Ubound geschrieben, aber Lbound gemeint (wie Du in Deinem ersten Posting ja schon schriebst). Das Lbound ist Dir aber durch Option Base bekannt. Bei sowas darf nix schief gehen (oder in dem Programm werden gar keine Regeln eingehalten).

Ich habe den Eindruck, Du suchst in Deinem Fall keine allgemeingültige Routinen, sondern eine ganz spezielle. Wenn Du trotz Deines speziellen Falles (da haben dann also auch keine "User" etwas daran zu suchen !) noch Prüfungen durchführen möchtest, dann kannst Du das simpelst mit der Datatype-Function machen.

Auch wenn Deine Routine sehr speziell sein sollte: Sauberes Coding erfordert trotzdem Prüfung auf Isempty und Isscalar - Du kannst wohl kaum sicherstellen, dass Dir nicht doch selber ein Fehler durchrutscht und Du mal die "falsche" Variable an Deine Routine übergibst.

Bernhard

Marinero Atlántico

  • Gast
Re:Einem String-Array ein Array zuordnen
« Antwort #7 am: 11.09.04 - 23:34:37 »
@Mathias: Ich hatte vor gar nicht allzu langer Zeit den Wahn jeden dämlichen Fehler abzufangen. Aus meiner Erfahrung wurde das irgendwann wirklich unproduktiv und unnötig anstrengend.
Sich über Error Condition und nachvollziehbaren code nachzudenken finde ich wirklich gut, aber es es gibt echt Punkte, wo das übertrieben ist. Dies ist so einer, würde ich sagen.

Gruß Axel

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #8 am: 11.09.04 - 23:40:38 »
Oh ja, da haben wir UBound und LBound verwechselt (aber jeder wusste wohl was gemeint war)  ;)

Option Base hin oder her, Default ist ja 0. Trotzdem muss ich abfangen, ob jemand nicht sowas macht: Dim strArr(1 to 2) as String. Das kann aber auch simpelst im zu verarbeitenden Teil abgefangen und korrigiert werden.

IsEmpty, IsScalar etc. is klar, das muss i.d.R. sein bei Array-Funktionen.

Hier muss ich jetzt noch zusätzlich abfragen, ob ich ein gültiges String bekomme, da ich ja mit Variant als Array arbeiten will.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #9 am: 11.09.04 - 23:44:18 »
Full ack, Axel. Fehlerhaft zugeordnete Datentypen geben ja spätestens zur Laufzeit sowieso einen "Fehler !"-Schrei von sich.

Interessanter wird es, wenn ich (im gewissen Rahmen) "irgendwas" in eine Function 'reinkippen will, aber ein definiertes Ergebnis von ihr erwarte.

Ein Musterbeispiel ist das "neue" ArrayAppend - es erwartet von mir schon Arrays. Aber die habe ich vielleicht noch gar nicht ...
Bei ArrayAppend (Variable1, Variable2) = Variable3 (was bei mir also nach wie vor eine eigene Routine übernimmt) erwarte ich, das Variable1 EMPTY, SCALAR oder ARRAY sein kann. Variable2 kann EMPTY, SCALAR oder ARRAY sein. Heraus kommt immer entweder ARRAY oder EMPTY. Das macht die Reaktion leichter  ;D

Bernhard

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #10 am: 11.09.04 - 23:48:40 »
Hier muss ich jetzt noch zusätzlich abfragen, ob ich ein gültiges String bekomme, da ich ja mit Variant als Array arbeiten will.

Das verstehe ich jetzt überhaupt nicht. Was ist ein "gültiger String" in bezug auf Array oder Variant ?

Was Ubound <-> Lbound angeht - da haben wir uns wie immer blind verstanden  ;D Halt nur was anderes geschrieben, als wir gemeint haben  ;D

Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #11 am: 11.09.04 - 23:49:18 »
Ich hatte vor gar nicht allzu langer Zeit den Wahn jeden dämlichen Fehler abzufangen.

Da bin ich wohl auch gerade dabei  ;D

Zumal auch Iris das nicht sehr genau sieht mit den Data types.

Typische Beispiele siehe Designer Help.

Da gibt es OnBoard-Routinen, die True / False zurückgeben.

Da heißt es dann sinngemäß: Variant. True if ...., False if .... Also nix mit Integer bzw. Boolean (ab ND6).
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #12 am: 11.09.04 - 23:57:57 »
Auch in R6 kannst Du True Variablen vom Typ Variant, Integer oder Byte zuordnen. Single geht auch und ...
True =1
False = 0

Gemeiner ist vielmehr, dass @True / @False in Formelsprache andere Werte haben. Das ist beklagenswert, das andere in keinster Weise.

Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #13 am: 11.09.04 - 23:58:31 »
Hier muss ich jetzt noch zusätzlich abfragen, ob ich ein gültiges String bekomme, da ich ja mit Variant als Array arbeiten will.

Das verstehe ich jetzt überhaupt nicht. Was ist ein "gültiger String" in bezug auf Array oder Variant ?

Anders gesagt: Ein Variant kann halt alles (un)mögliche beinhalten. Und das muss ich speziell abfangen. Bei String-Arrays ist das etwas klarer: Mein Array enthält nur Strings.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #14 am: 12.09.04 - 00:02:58 »
Auch in R6 kannst Du True Variablen vom Typ Variant, Integer oder Byte zuordnen.
Schon klar, aber das wollte ich auch nicht damit sagen, sondern dass auch IBM "großzügig" True/False" wohl als Variant deklariert (zumindest so in die Designerhelp schreibt), und nicht Boolean bzw. Integer nimmt.

Wenn man da 1 + 1 zusammenzählen würde, könnte man gleich wieder hergehen und Option Declare streichen und gleich mal alle Variablen als Variant durchlaufen lassen.  :P
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #15 am: 12.09.04 - 00:10:39 »
Wenn man da 1 + 1 zusammenzählen würde, könnte man gleich wieder hergehen und Option Declare streichen und gleich mal alle Variablen als Variant durchlaufen lassen.  :P

Uiii, da bin ich mir aber sicher, dass Du weisst, dass das hinten und vorne nicht stimmt und Du da Äpfel und Birnen vergleichst.
Option Declare hat mit den Datentypen nicht primär etwas zu tun:

Code
%REM
Option Declare
%ENDREM

Dim MeineMeldung

MeineMelldung = "BlaBla"

MessageBox MeineMeldung

Woran liegt es jetzt, das die Massagekiste leer bleibt ?

Andererseits:

Function QuickSort (vOrigValues as Variant) as Variant

Damit kann ich ich jetzt ein String - oder ein Zahlen-Array sortieren lassen. Sträflich ?

Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #16 am: 12.09.04 - 00:23:48 »
Function QuickSort (vOrigValues as Variant) as Variant

Damit kann ich ich jetzt ein String - oder ein Zahlen-Array sortieren lassen. Sträflich ?

Ich möchte jetzt keine Grundsatzdiskussion auslösen, Bernhard.

Aber was machst Du, wenn Du nur String haben möchtest? Du setzt trotzdem "OrigValues as Variant" ? Genau das wollte ich vermeiden.

Setzt Du alles in Functions gleich mal auf Variant?
Was machst Du, wenn Du ein Integer (scalar) erwartest? Trotzdem erstmal myInteger as Variant in der Function?

Ich halte das für nicht richtig.
« Letzte Änderung: 12.09.04 - 00:25:25 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Einem String-Array ein Array zuordnen
« Antwort #17 am: 12.09.04 - 00:31:06 »
Warum keine Grundsatzdiskussion, Matthias ?

Aber wir reden hier aneinander vorbei, befürchte ich.

Will ich "irgendwas" sortieren, brauche ich Variant. Logisch sicherlich.

Erwarte ich einen speziellen Datentyp, übergeb ich diesen explizit. Auch logisch.

Übergebe ich Arrays, muss ich mit Variants arbeiten. Das geht leider nicht anders - ausser ByVal. ByVal ist aber auch nicht ohne (falls der "User" nicht daran denkt, dass das Original dabei "verfälscht" wird). Und in Deinem Beispiel - ein Array einem anderen zuordnen - geht das natürlich auch nicht. Wobei das auch aus meiner Sicht nicht sauber war - Deine Sub hätte eigentlich eine Function sein müssen (wegen ByVal und so  ;) )

Bernhard

PS: Warum eigentlich überhaupt "Grundsatzdiskussion" oder nicht ? Dafür ist das Forum doch da, denke ich. Und bei derartigen Threads hat noch jeder von uns gelernt, oder ?

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #18 am: 12.09.04 - 00:44:29 »
Erwarte ich einen speziellen Datentyp, übergeb ich diesen explizit. Auch logisch.

Klar logisch. Genau so erwarte ich aber auch, dass die Function (egal ob von einem Programmierer oder fest im Client verdrahtet) bei True/False NICHT mit Variants sondern eben mit weniger Speicherfressendem wie Boolean arbeitet.
Das halte ich schon für beklagenswert, auch wenn Du das nicht so siehst oben (der Bezug war auf mein Posting, wo IBM für True/False Variants verwendet):
Auch in R6 kannst Du True Variablen vom Typ Variant, Integer oder Byte zuordnen. Single geht auch und ...
True =1    False = 0
Gemeiner ist vielmehr, dass @True / @False in Formelsprache andere Werte haben. Das ist beklagenswert, das andere in keinster Weise.

Aber Du hast Recht, Grundsatzdiskussionen sind oft sehr lehrreich hier  :)
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Einem String-Array ein Array zuordnen
« Antwort #19 am: 12.09.04 - 00:53:01 »
Übergebe ich Arrays, muss ich mit Variants arbeiten.

Meinst Du das allgemein, Bernhard?

Ich habe schon mehrere Routinen geschrieben, wo ich z.B. String-Arrays übergebe bzw. erwarte in der Routine.
Den einzigsten Haken, den ich bisher damit hatte, war der Auslöser dieses Threads.

Ansonsten sah ich da nur Vorteile, und afaik schlägt auch der Compiler mit einer Fehlermeldung zu, wenn kein String-Array übergeben wird an die Sub/Function - was bei einem Variant nicht passiert.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz