Array kann aus einem mir nicht bekannten Grund nicht deklariert werden

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von ThomasG82.

    Array kann aus einem mir nicht bekannten Grund nicht deklariert werden

    Hallo Community,


    nachdem ich zuletzt so tolle, hilfreiche Antworten erhalten habe, komme ich nun mit einem neuen "Problem" daher :-).

    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Sub GetData()
    2. Dim GetFilename, GetHeading, GetSubItem, GetStringComplete As String
    3. GetStringComplete = frmAddNewFile.SendeStr
    4. Dim lines() As String = GetStringComplete
    5. For Each line In lines
    6. Dim ParseStr() As String = line.Split(";")
    7. If ParseStr(1).Trim <> "" Then
    8. If ParseStr(0).Trim = "" Then
    9. 'no Filename
    10. Else
    11. GetFilename = ParseStr(0).Trim
    12. End If
    13. GetHeading = ParseStr(1).Trim
    14. GetSubItem = ParseStr(2).Trim
    15. End If
    16. Next
    17. MsgBox("Empfange: " & GetHeading & " " & GetSubItem)
    18. End Sub


    Diese Zeile: Dim lines() As String = GetStringComplete wird anmoniert. Und zwar kommt die Meldung "Der Wert vom Typ String kann nicht in "String()" konvertiert werden.
    Ebenso in meinem rudimentären Pseudo-Test: MsgBox("Empfange: " & GetHeading & " " & GetSubItem) werden beide Variablen nicht anerkannt, da diese verwendet würden, bevor deren ein Wert zugewiesen wird. Verstehe ich nicht, denn dies geschieht doch hier:
    GetHeading = ParseStr(1).Trim
    GetSubItem = ParseStr(2).Trim
    Hintergrund: Von einem anderen Form befinden sich mehrere Textfelder, die ich an dieses "schicke". Klappt auch wenn ich sie mir ungeparst ausgeben lasse. Aber da ich diesen kompletten String (Trennzeichen ist ";") ja zerlegen möchte... weiß ich eben nicht wie man es sonst und vor allem: richtig machen könnte ;-).

    Ich danke euch fürs Lesen und vielleicht kann mir ja jemand von den Cracks hier helfen. Meine Programmierkenntnisse sind wie gesagt noch etwas rudimentär (Programmiererfahrung liegt etwa 11 Jahre zurück), daher bitte ich um etwas Nachsicht :)
    lines ist ein String-Array, also eine Ansammlung von Strings. GetStringComplete ist ein String. Zwei Paar Schuhe. In Deinen Gedanken vielleicht nicht, aber für den Compiler.
    Die Frage ist: Wenn GetStringComplete ein einziger String ist, warum willst Du dann eine For-Schleife darüber laufen lassen? Das ergibt keinen Sinn. Oder das Ding ist mehrzeilig. Dann musst Du aber den erstmal am Zeilenumbruch aufspalten.

    Bezüglich der Meckerei, dass GetHeading und GetSubItem nicht wertmäßig festgelegt wurden: Das ist korrekt. Denn die Zuweisung in Zeile#13 und #14 ist mit einem If in Zeile#7 verknüpft. Der Compiler kann nicht davon ausgehen, dass die Initialisierung definitiv erfolgt, von daher die berechtigte Meckerei. Selbst wenn Du denkst: Naja, meine Daten sind aber immer so, dass die Bedingung bei If zutrifft, glaubt Dir der Compiler da einfach nicht. Einfaches Umgehen:
    Dim GetHeading = String.Empty oder Dim GetHeading As String = Nothing usw.

    btw:

    FeelingCodeAgain schrieb:

    Von einem anderen Form befinden sich mehrere Textfelder, die ich an dieses "schicke"
    Da bahnt sich ggf. was an, siehe: Warum »Form1.Show« und Co. einem irgendwann ins Bein schießen

    und
    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort MsgBox
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @FeelingCodeAgain Kann es sein, da das Splitten am ";" an der Variable GetStringComplete gemacht werden muss, dann macht da etwas mehr Code sinn.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm, vielen Dank für eure Antworten. Aber so wirklich kapiert habe ich das nicht, bzw. habe keinen Ansatz für eine Lösung. Wäre es unverschämt nach einem Beispiel oder einer Korrektur zu fragen..? :saint:


    // Edit: Ich kann aus irgendeinema Grund nicht antworten, daher hier noch ein Nachtrag:

    Ich habe es nun mal wie folgt geändert:

    VB.NET-Quellcode

    1. Sub GetData()
    2. Dim GetFilename, GetHeading, GetSubItem, GetStringComplete As String
    3. GetStringComplete = frmAddNewFile.SendeStr
    4. 'Dim lines() As String = GetStringComplete
    5. 'For Each line In lines
    6. Dim ParseStr() As String = GetStringComplete.Split(";")
    7. If ParseStr(1).Trim <> "" Then
    8. If ParseStr(0).Trim = "" Then
    9. 'no Filename
    10. Else
    11. GetFilename = ParseStr(0).Trim
    12. End If
    13. GetHeading = ParseStr(1).Trim
    14. GetSubItem = ParseStr(2).Trim
    15. End If
    16. 'Next
    17. MsgBox("Empfange: " & GetHeading & " " & GetSubItem)
    18. End Sub


    das hier: MsgBox("Empfange:
    " & GetHeading & " " & GetSubItem) wird nach wie vor als
    falsch dargestellt und ich verstehe den Grund nicht, die Variablen
    werden doch gesetzt..?

    // Edit Nr. 2:
    Ein Hoch auf Euch, es klappt!!! Ganz herzlichen Dank an euch!!! Bis zum nächsten Mal (Problem) ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FeelingCodeAgain“ ()

    FeelingCodeAgain schrieb:

    Wäre es unverschämt nach einem Beispiel oder einer Korrektur zu fragen..
    Poste einen vollständigen String GetStringComplete.
    Beschreibe präzise, was damit passieren soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da ich in meinem obigen Posting immer nacheditieren muss (weil es keinen "Antwort"-Button gibt - ober ich bin blind ;) ),
    kam dies vermutlich nicht richtig zur Geltung.
    Es funktioniert nun dank eurer Hilfe. Hier der Code dazu:

    VB.NET-Quellcode

    1. Sub GetData()
    2. Dim GetFilename, GetHeading, GetSubItem, GetStringComplete As String
    3. GetStringComplete = frmAddNewFile.SendeStr 'get data from frmAddNewFile-Textfields
    4. Dim ParseStr() As String = GetStringComplete.Split(";")
    5. If ParseStr(1).Trim <> "" Then
    6. If ParseStr(0).Trim = "" Then
    7. 'no Filename
    8. Else
    9. GetFilename = ParseStr(0).Trim
    10. End If
    11. GetHeading = ParseStr(1).Trim
    12. GetSubItem = ParseStr(2).Trim
    13. End If
    14. MsgBox("Empfange: " & GetHeading & " " & GetSubItem)
    15. End Sub


    Noch einmal an alle, herzlichen Dank und bis zum nächsten Problem X/ :thumbup:

    FeelingCodeAgain schrieb:

    Ich kann aus irgendeinema Grund nicht antworten

    FeelingCodeAgain schrieb:

    Da ich in meinem obigen Posting immer nacheditieren muss (weil es keinen "Antwort"-Button gibt - ober ich bin blind )
    Nicht blind, aber überlesen kannst Du doppelt gut:

    VaporiZed schrieb:

    Wenn der letzte Post von Dir selbst ist, kannst Du 30 Minuten nicht antworten, sondern nur jenen letzten Beitrag bearbeiten. Diese Funktion soll vor SPAM schützen.

    und

    VaporiZed schrieb:

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    Denn Dim ParseStr() As String = GetStringComplete.Split(";")geht nur mit Option Strict Off. Das am besten zeitnah auf On schalten.

    ##########

    Das Problem mit dem

    FeelingCodeAgain schrieb:

    da diese verwendet würden, bevor deren ein Wert zugewiesen wird
    ist mit dem Code aber noch nicht gelöst …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    jetzt geht auch "antworten" (yeah) :-). Es wurde noch gefragt was überhaupt passieren soll bzw. ich meine Frage präzisieren solle. Hier die ursprüngliche Fragestellung (diesmal ohne Code). Auf einer Form befinden sich Textfelder. Diese schicke ich an eine andere Form, wo sie entsprechend Verarbeitung finden. Das Senden ging - Ich habe diese (absichtlich) in eine einzige Variable gepackt mit dem Delimiter ";" um sie danach wieder zu trimmen. Hat ja letztlich auch geklappt durch eure Unterstützung.

    FeelingCodeAgain schrieb:

    Dim ParseStr() As String = GetStringComplete.Split(";")
    If ParseStr(1).Trim <> "" Then
    Birgt eine Stolperfalle.
    Wenn in dem String kein ; vorhanden ist, gibt es kein ParseStr(1) und der Code fliegt auf die Schnauze.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wie @petaod oben schon erwähnt musst du anstatt nach nichts ("") zu fragen schauen ob dein Array größer 0 oder 1 ist. Heißt, du solltest lieber den Lenght Wert abfragen.
    If ParseStr.Lenght > 0 Then
    Denn dann weißt du ob überhaupt etwas drin steht und wenn ja auch wie viel und du kannst dementsprechend reagieren
    (Fast-)Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed

    @VaporiZed:

    Jetzt wirds mir zu "wild". Wenn ich das auf "on" stelle - und es dann nicht mehr funktioniert - dann kann ich euch wieder damit nerven, eben weil es nicht mehr geht. Und ich nicht weiß, warum. Ist quasi vorprogrammiert :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ja aber dafür wird dir zu 100% durch VS gesagt wo du was falsch machst. Und dadurch lernst du. Und fragen sind nichts schlimmes, nur auf Antworten nicht hören ist unfreundlich. Ich :)
    Also immer die Grundlagen beachten und die höchste Regel lautet halt: Option Strict ON
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Nicht geantwortet..? Unhöflich? Weiß nicht welches Posting genau gemeint ist, aber ich bin bemüht sehr wohl zu antworten, wenn ich etwas übersehen habe: Bitte um Entschuldigung..!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Nein das geht nicht gegen dich - das war allgemein. Du hast ja geantwortet - alles gut. Es geht nur darum OPTION STRICT ON immer - bei Problemen fragen immer!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()