none
Basics zu Arrays RRS feed

  • Frage

  • Hallo,

     

    ich bin neu hier und auch in VB.

     

    Daher habe ich ein paar Fragen zum Array.

     

    Es muss doch möglich sein, ein Array nicht mit Werten vorzubelegen, sondern diese im Ablauf eines Codes

    variabel zuweisen zu können.

     

    Also folgendes Problem:

    Ich will aus einer Textbox heraus Zahlen und Zeichen herausfiltern und diese in Variablen ablegen, um dann damit rechnen zu lassen.

    Dazu bietet sich ein Array an. Was in der Box drinsteht, ist nicht vorher bekannt, sondern wird erst eingegeben.

    Hier der vereinfacht Code, den ich hier zur Demo erstellt habe. Funktioniert auch nicht.

     

    dim array(100) as integer

    dim zahl() as string

    dim i as integer

     

    i=textbox1.text.length

    for i=0 to i-1

    zahl(i)=textbox1.text

    next

     

     

    NullRefereenceException wurde nicht behandelt.

     

    bzw bei Verwendung von

    dim zahl as string={}

     

    IndexOutOfRangeException wurde nicht behandelt.

     

     

     

    Wie macht man das richtig?

     

     

    Danke im voraus

    hf1

     

     

     

    Donnerstag, 15. Januar 2009 17:59

Alle Antworten

  • Also ich verstehe noch nicht wirklich was du vor hast.

    Du möchtest jedes einzelne Zeichen einer Textbox in eine seperate Stelle in einem Array schreiben ?

    Erkläre doch bitte nocheinmal was passieren soll.

     

    Donnerstag, 15. Januar 2009 21:52
  •  BastiCC Schrieb:

    Also ich verstehe noch nicht wirklich was du vor hast.

    Du möchtest jedes einzelne Zeichen einer Textbox in eine seperate Stelle in einem Array schreiben ?

    Erkläre doch bitte nocheinmal was passieren soll.

     

     

    Also ich habe eine Lösung gefunden, indem ich einfach Leerstrings vorgegeben habe.

    Sieht dann so aus:

     

    dim feld() as object ={"", "", "", "", "", "", "", "", "", ""}

    das Feld hat jetzt 10 Speicherplätze, die mit Leerstrings gefüllt sind.

    Während der Laufzeit des Programmes werden Zeichen zugewiesen, mit denen weiter gearbeitet wird.

    Ich hatte nicht richtig verstanden, dass man definitiv Werte vorgeben muss und zwar so viel wie ich Speicherplätze haben will für jedes Feld.

     

    Das klappt so wie oben.

    Nur leider ist diese Schreibweise etwas umständlich.

    Vielleicht kann man das ja abkürzend schreiben z.B.

    10{""} oder so.

     

     

    hf1
    Dienstag, 20. Januar 2009 00:08
  •  BastiCC Schrieb:

    Also ich verstehe noch nicht wirklich was du vor hast.

    Du möchtest jedes einzelne Zeichen einer Textbox in eine seperate Stelle in einem Array schreiben ?

    Erkläre doch bitte nocheinmal was passieren soll.

     

     

    Also ich habe eine Lösung gefunden, indem ich einfach Leerstrings vorgegeben habe.

    Sieht dann so aus:

     

    dim feld() as object ={"", "", "", "", "", "", "", "", "", ""}

    das Feld hat jetzt 10 Speicherplätze, die mit Leerstrings gefüllt sind.

    Während der Laufzeit des Programmes werden Zeichen zugewiesen, mit denen weiter gearbeitet wird.

    Ich hatte nicht richtig verstanden, dass man definitiv Werte vorgeben muss und zwar so viel wie ich Speicherplätze haben will für jedes Feld.

     

    Das klappt so wie oben.

    Nur leider ist diese Schreibweise etwas umständlich.

    Vielleicht kann man das ja abkürzend schreiben z.B.

    10{""} oder so.

     

     

    hf1
    Dienstag, 20. Januar 2009 00:08
  • also ich habe Früher viel mit älteren VB Versionen gearbeitet, manches ist also auch für mich eine Umstellung oder meine Methoden sind altbacken, das musst du mir nachsehen.

     

    Wenn du eine Variable bzw. ein Array definierst kannst du den Typ und die Größe für das ganze Array festlegen :

     

    also ein DIM MeinArray (200) as STRING erzeugt dir ein Array mit 201 Strings (0 kommt dazu).

    Wenn du jetzt in jede Variable des Arrays etwas setzen möchtest kannst du das mit einer Schleife machen, gehen wir davon aus in jeder Variable soll "Text" stehen :

     

     

    DIM MeinArray(200) as STRING

    DIM Schritt as INTEGER                       (kann auch anders als Schritt heißen)

     

    FOR Schritt = 0 to 200

    MeinArray(Schritt) = "Text"

    NEXT Schritt

     

     

    das FOR ... NEXT bewirkt das für eine Variable eine Schleife so oft durchlaufen wird wie angegeben, in diesem Fall von 0 bis 200, und bei jedem Schritt z.B. dem 176. Steht in der Variable Schritt der Wert 176 ...

    also heißt zum dem Zeitpunkt die Zeile MeinArray(176) = "Text" ... im nächsten Durchlauf dann 177 usw.

     

    Du schreibst das du mit den Variablen arbeiten willst, wie sieht das arbeiten aus ?

    Es gibt z.B. die Möglichkeit einen String wie in einer Textbox Buchstabe für Buchstabe zu durchlaufen und jedesmal wenn z.B. ein A kommt eine Variable für A um 1 zu erhöhen.

     

    Ist das das was du vor hast ? Buchstaben zählen ?

    Dienstag, 20. Januar 2009 00:29
  •  

    Ja, so in etwa solls laufen.Genauer gesagt programmiere ich einen Taschenrechner für den Eigenbedarf. Just for fun, um es mal gemacht zu haben.

    Zahlen und Rechenzeichen gibt man in eine Textbox ein. Buttons sind die Tasten usw..

    Die Zeichen werden dann spariert und nach den Rechenregeln ausgewertet. Ist nicht ganz trivial die Sache. Klappt aber.

     

    Ich befasse mich erst seit 2-3 Wochen mit VB, habe aber füher schon mal codiert. Altes PowerBasic, Fortran 77, ein wenig C, aber das ist 20 Jahre her seit meiner Diplomarbeit.

    Ich meine, mich erinnern zu können, dass man Felder simpel mit z.B. A(20) oder B(20) definieren konnte und sie nicht zu füllen brauchte. Mehrdimensionale dann mit A(20,20) oder B(20,20,20) usw.. Bin mir da aber nicht mehr sicher.

     

    Auf die Idee, in einer Schleife zu füllen, bin ich nicht gekommen. Das erschien mir zu abwegig. Ist aber offensichtlich der einzige Weg.

     

     

     

    hf1

    Dienstag, 20. Januar 2009 09:43
  • das geht auch heute noch, wenn du als String declarierst musst du nicht füllen. Es ging früher auch Bereiche eines Arrays zu declarieren, z.B. dim TestArray (10 to 40, 20 to 99), aber ich meine da hat sich was geändert ... probier es am besten aus.

     

    Um einen String zu zerlegen gibts heute eine eigene Funktion, aber dazu steht in nem anderen Forumsbeitrag noch etwas, ich mache es noch immer auf die alte Art und Weise, mit MID ... das funktioniert prima.

     

    so könntest du jetzt z.B. ein Array declarieren nach der Stringlänge deines Textfeldes, Das sollte mit

    Dim Zeichen(LEN (TextBox1.Text)) as String (Varriant ginge auch, ist aber nie günstig) gehen ...

    dann würde ich in einer Schleife den String ins Array zerlegen.

     

    Bei MID ist das simpel, Zeichen (Position) = MID(Stringname, Position, Länge)

     

    oder du lässt solange weiter anfügen bis ne andere art zeichen kommt, das könntest du am Asciiwert unterscheiden,

    Zahlen sind wenn ich mich richtig erinnere von 49 bis ... der Ausdruck ASC (Stringname) gibt den Asciiwert als Zahl wieder, umgekehrt CHR(Zahl) das Zeichen.

    anfügen bei Strings erreichst du mit & ... also z.B. String = String & NeuesZeichen (müssen aber 2 Strings sein)

     

    wenn du jetzt aber mit den Zahlen rechnen willst sind sie abgelegt als Strings, aber VAL(Stringname) macht sie zu zahlen.

     

    Es sind dann ein paar Schleifen und ein paar IFs aber so würde es gehen.

     

    Hilft das soweit ?

    Dienstag, 20. Januar 2009 23:07
  •  

    Mein Problem ist aber nach wie vor die Syntax zur Definition der Arrays.

     

    Dim b As String

    Dim array(0 To 100) As Integer

    Dim zahl() As Object = {"", "", "", "", "", "", "", "", "", ""}

    Dim sign() As Object = {"", "", "", "", "", "", "", "", "", ""}

    Dim ergebnis As Double

    Dim i As Integer = 0

    Dim j As Integer = 0

    Dim z As Integer = 0

    Dim k As Integer = 0

     

     

    Die DIMs stehen unter public class form1. So klappts zwar, ist aber ungeschickt, denke ich (oberer Code)

     

    "Die Anweisung kann nicht außerhalb ds Methodentextes stehen"

    kommt dann als Hinweis:

     

    for z=0 to 9

    zahl(i)=""

    sign(i)=""

    next

     

     

    Nur kann ich hier keine Schleife laufen lassen zum Füllen der Felder, weil die Befehle (for ...next z.B.) nur in den Subs erkannt werden. Ich kann zwar ein Sub in form1 erstellen, das diese Füllschleife innehat, kann sie aber von nirgends aus

    aufrufen, weil in allen Button-Subs Werte übergeben werden, die dann gelöscht würden.

     

     

     

     

    Wohin setzt man das üblicherweise?

     

     

     

     

     

    Mittwoch, 21. Januar 2009 16:04
  •  

    Mein Problem ist aber nach wie vor die Syntax zur Definition der Arrays.

     

    Dim b As String

    Dim array(0 To 100) As Integer

    Dim zahl() As Object = {"", "", "", "", "", "", "", "", "", ""}

    Dim sign() As Object = {"", "", "", "", "", "", "", "", "", ""}

    Dim ergebnis As Double

    Dim i As Integer = 0

    Dim j As Integer = 0

    Dim z As Integer = 0

    Dim k As Integer = 0

     

     

    Die DIMs stehen unter public class form1. So klappts zwar, ist aber ungeschickt, denke ich (oberer Code)

     

    "Die Anweisung kann nicht außerhalb ds Methodentextes stehen"

    kommt dann als Hinweis:

     

    for z=0 to 9

    zahl(i)=""

    sign(i)=""

    next

     

     

    Nur kann ich hier keine Schleife laufen lassen zum Füllen der Felder, weil die Befehle (for ...next z.B.) nur in den Subs erkannt werden. Ich kann zwar ein Sub in form1 erstellen, das diese Füllschleife innehat, kann sie aber von nirgends aus

    aufrufen, weil in allen Button-Subs Werte übergeben werden, die dann gelöscht würden.

     

     

     

     

    Wohin setzt man das üblicherweise?

     

     

     

     

     

    Mittwoch, 21. Januar 2009 16:04
  • die DIMs setzt man direkt unter die class wenn sie für die ganze class gelten und ansonnsten in die subs, du kannst dir aber jederzeit eine eigene sub schreiben, die führst du dan im load_event der form aus ... einfach mit dem namen der sub.

    wenn ein DIM in einer sub steht wird es evtl. mehrfach aufgerufen, jedes neue DIM überschreibt das alte, da müsste man REDIM benutzen.

     

    aber du solltest dich von einem DIM als object fernhalten, besser ist immer einen typ festzulegen, wie vorher beschrieben kannst du alles was du mit der textbox machst als string festlegen und später in eine Zahl umwandeln.

     

    das was du machst mit DIM array() as object = {"","","","",""}

    ist das selbe wie DIM array(5) as string

     

    weil deine klammer die die die werte angibt das object dann als string festlegt.

    Mittwoch, 21. Januar 2009 21:24