"Type mismatch error" in VB6

  • VB6

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    "Type mismatch error" in VB6

    Hallo,

    ich bin mittlerweile mit meinem Mergesort Projekt schon etwas weiter gekommen, allerdings bekomme ich einen "Type mismatch: array or user-defined type expected" Fehler.

    Visual Basic-Quellcode

    1. Dim test1(), ergebnis(), i, laenge As Integer
    2. Dim j As Integer
    3. Dim zwischenspeicher1, zwischenspeicher2, zwischenspeicher3, zwischenspeicher4() As Integer
    4. Private Sub cbStart_Click()
    5. ergebnis = Mergesort(test1) 'Aufrufen von Mergesort
    6. For i = 0 To UBound(test1) - 1
    7. List2.AddItem (ergebnis(i))
    8. Next i
    9. End Sub
    10. Private Function Mergesort(ByRef m() As Integer)
    11. Dim links1(), rechts1() As Integer
    12. Dim mlaenge As Integer
    13. Dim links1laenge As Integer
    14. Dim rechts1laenge As Integer
    15. mlaenge = UBound(m) 'Die Länge des Arrays "m" wird gezählt und in die Variable "mlaenge" geschrieben
    16. links1laenge = ((mlaenge / 2) - 1) 'Berechnung der Länge des Arrays der linken Liste
    17. ReDim links1(links1laenge)
    18. rechts1laenge = (mlaenge - links1laenge - 1) 'Berechnung der Länge des Arrays der rechten Liste
    19. ReDim rechts1(rechts1laenge)
    20. MsgBox (mlaenge)
    21. If mlaenge <= 1 Then 'Wenn mehr als ein Element in der Liste ist
    22. Else
    23. For i = 0 To links1laenge - 1 'Aufteilen
    24. links1(i) = m(i)
    25. Next i
    26. For i = 0 To rechts1laenge - 1 'Aufteilen
    27. rechts1(i) = m(i + links11aenge)
    28. Next i
    29. links1 = Mergesort(links1)
    30. rechts1 = Mergesort(rechts1)
    31. 'merge(links1, rechts1)
    32. End If
    33. End Function
    34. Private Function merge(ByRef x() As Integer, ByRef y As Integer)
    35. End Function
    36. Private Sub Form_Load()
    37. j = InputBox("Wie viele Elemente soll die Liste haben? (8)")
    38. ReDim test1(j)
    39. ReDim ergebnis(j)
    40. test1(0) = 11
    41. test1(1) = 23
    42. test1(2) = 87
    43. test1(3) = 55
    44. test1(4) = 8
    45. test1(5) = 43
    46. test1(6) = 66
    47. test1(7) = 99
    48. For i = 0 To UBound(test1) - 1
    49. List1.AddItem (test1(i))
    50. Next i
    51. laenge = UBound(test1)
    52. End Sub


    Dies ist der gesamte Code und der Fehler ist bei

    Visual Basic-Quellcode

    1. Private Sub cbStart_Click()
    2. ergebnis = Mergesort(test1) 'Aufrufen von Mergesort
    3. For i = 0 To UBound(test1) - 1
    4. List2.AddItem (ergebnis(i))
    5. Next i
    6. End Sub


    markiert. Bei "ergebnis = Mergesort(test1)" ist das "test1" hervorgehoben.
    Zudem sehe ich folgenden Fehler:

    Dim test1(), ergebnis(), i, laenge As Integer

    In .NET ist das erlaubt, in VB6 nicht. Dort muss es heißen:

    Dim test1() As Integer, ergebnis() As Integer, i As Integer, laenge As Integer

    (der Fehler kommt mehrfach vor)
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    @Marcus Gräfe
    Danke, das habe ich nun geändert.

    @ErfinderDesRades
    Spielst du auf "Return" an?

    Ich habe das Ganze jetzt so weit verändert und es "funktioniert":

    Visual Basic-Quellcode

    1. Dim test1() As Integer
    2. Dim ergebnis() As Integer
    3. Dim i As Integer
    4. Dim laenge As Integer
    5. Dim j As Integer
    6. Dim zwischenspeicher1 As Integer
    7. Dim zwischenspeicher2 As Integer
    8. Dim zwischenspeicher3 As Integer
    9. Dim zwischenspeicher4() As Integer
    10. Private Sub cbStart_Click()
    11. ergebnis = Mergesort(test1) 'Aufrufen von Mergesort
    12. For i = 0 To UBound(test1) - 1
    13. List2.AddItem (ergebnis(i))
    14. Next i
    15. End Sub
    16. Private Function Mergesort(ByRef m() As Integer)
    17. Dim links1() As Integer
    18. Dim rechts1() As Integer
    19. Dim mlaenge As Integer
    20. Dim links1laenge As Integer
    21. Dim rechts1laenge As Integer
    22. mlaenge = UBound(m) 'Die Länge des Arrays "m" wird gezählt und in die Variable "mlaenge" geschrieben
    23. links1laenge = ((mlaenge / 2) - 1) 'Berechnung der Länge des Arrays der linken Liste
    24. ReDim links1(links1laenge)
    25. rechts1laenge = (mlaenge - links1laenge - 1) 'Berechnung der Länge des Arrays der rechten Liste
    26. ReDim rechts1(rechts1laenge)
    27. MsgBox (mlaenge)
    28. If mlaenge <= 1 Then
    29. Return 'Wenn mehr als ein Element in der Liste ist
    30. Else
    31. For i = 0 To links1laenge - 1 'Aufteilen
    32. links1(i) = m(i)
    33. Next i
    34. For i = 0 To rechts1laenge - 1 'Aufteilen
    35. rechts1(i) = m(i + links11aenge)
    36. Next i
    37. links1 = Mergesort(links1)
    38. rechts1 = Mergesort(rechts1)
    39. End If
    40. End Function
    41. Private Function merge(ByRef x() As Integer, ByRef y As Integer)
    42. End Function
    43. Private Sub Form_Load()
    44. j = InputBox("Wie viele Elemente soll die Liste haben? (8)")
    45. ReDim test1(j)
    46. ReDim ergebnis(j)
    47. test1(0) = 11
    48. test1(1) = 23
    49. test1(2) = 87
    50. test1(3) = 55
    51. test1(4) = 8
    52. test1(5) = 43
    53. test1(6) = 66
    54. test1(7) = 99
    55. For i = 0 To UBound(test1) - 1
    56. List1.AddItem (test1(i))
    57. Next i
    58. laenge = UBound(test1)
    59. End Sub


    Allerdings bekomme ich nun den Error "Subscript out of Range" in dieser Zeile:

    Visual Basic-Quellcode

    1. ReDim links1(links1laenge)


    Vollzitate entfernt ~ EaranMaleasi

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

    lang11 schrieb:

    Spielst du auf "Return" an?
    Nein, ich spiele garnichts an, sondern sage genau, was ich meine - es sind 3 Dinge:
    1. Eine Function soll etwas zurückgeben
    2. Was gibt deine Function MergeSort zurück?
      - und das ist eine Frage, die ich bitte zu beantworten (eine Gegenfrage bringt dich nicht weiter)
    3. Weils so aussieht, dass du die Frage nicht beantworten kannst die Empfehlung, das vb6-Schlüsselwort Function zu recherchieren.
      Es ist imo ausgeschlossen, dass du deine Aufgabe lösen kannst, ohne dir das richtige Verständnis dieses fundamental wichtigen Schlüsselwortes zu erarbeiten.
    Erklärung:
    Diese Zeile:

    Visual Basic-Quellcode

    1. ergebnis = Mergesort(test1)
    kann nicht funktionieren, weil im Code von Mergesort() ist nichts zu finden (keine Deklaration, keine Rückgabe-Anweisung (vb6 kennt kein Return)), was veranlasst, dass die Function überhaupt zurückgäbe - schon garnet ein "ergebnis".
    Du musst es aber hinbringen, dass die Zeile funktioniert.

    Hu - nun binnich verunsichert - ich sehe:

    lang11 schrieb:

    Visual Basic-Quellcode

    1. Return 'Wenn mehr als ein Element in der Liste ist
    Das lässt sich ausführen?
    Wie gesagt - ich war bislang der ansicht, vb6 könne kein Return.
    (Tja, lange nicht mehr vb6 gemacht)

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Meine Function MergeSort soll am Ende dem "Ergebnis" Array 8 Werte wiedergeben, d.h. für Ergebnis(0) den kleinsten Wert, für Ergebnis(1) den zweitkleinsten Wert usw..
    Die Funktion "MergeSort" ist jetzt für das Aufteilen der aus 8 Elementen bestehende Liste zuständig, damit diese dann mit dem Mergesort Algorithmus wieder zusammengeführt/sortiert werden können. Deshalb möchte ich später dann aus der "MergeSort" Function eine weitere Function aufrufen, welche die Zahlen sortiert.
    Was @ErfinderDesRades meint, ist dass der Rückgabedatentyp bei einer Funktion angegeben werden muss. Wobei das in VB6 streng genommen gar nicht stimmt, denn keine Angabe = Datentyp Variant.

    Aber selbst wenn du Variant haben willst, würde ich Function xy() As Datentyp schreiben.

    Wenn du keine Rückgabe brauchst, dann nimm Sub.

    EDIT: Wenn ReDim links1(links1laenge) zu einem Fehler führt, dann ist wohl links1laenge nicht korrekt. Benutze den Debugger, um den Wert zu prüfen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    Visual Basic-Quellcode

    1. Dim test1(), ergebnis(), i, laenge As Integer

    In .NET ist das erlaubt, in VB6 nicht.
    Es ist sehr wohl "erlaubt", allerdings werden die nicht mit As Type deklarierten Variablen als Variablen vom Type Variant angelegt, und damit sind Laufzeiteffekte vorprogrammiert.
    Jedenfalls war das bei VB3 so.
    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!
    @Marcus Gräfe:

    Wenn ich hinter die Function "As Integer" schreibe, dann bekomme ich aber den Datentyp Error. Ohne funktioniert es. Ich verstehe nicht ganz warum, da ich ja die Variable "ergebnis" auch als Integer deklariert habe, deswegen müsste das dann doch derselbe Datentyp sein?

    Edit: Ich habe ja geschrieben "ergebnis =mergesort(test1)", aber habe gemerkt, dass es ja keinen Sinn macht nur "Ergebnis" zu nutzen, da es ja ein Array ist. Ich versuche mal weiter, ich denke mit einer For Next Schleife mit ergebnis(i) müsste es gehen?

    Edit 2: Ne das macht ja auch keinen Sinn, da mergesort dann ja mehrere male durchgeführt wird.

    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed

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

    lang11 schrieb:

    den Datentyp Error
    einen Datentyp Error gibt es nicht.

    lang11 schrieb:

    Ohne funktioniert es.
    Tut es ja nicht.
    Mag sein, dasses nicht abstürzt, aber "funktionieren" würde ja bedeuten, du bekommst ein sortiertes Ergebnis angezeigt.


    Wie kommst du voran beim Recherchieren der richtigen Verwendung des Function-Schlüsselwortes?
    Und wie man es hinbekommt, dass eine Function auch was zurückgibt?



    Mal eine andere Frage: Wieso quälst du dich mit dieser toten Sprache ab?
    Bedeutend leichter programmiert es sich in vb.net oder c#, und da gibt es auch viel mehr (und nettere) Leute, die dich dabei unterstützen können - bei vb6 erinnern sich nurnoch ein paar oldtimer wie zB meine Wenigkeit an längst vergangene Zeiten ;) .

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Bin noch am recherchieren, ich melde mich noch.

    Haben leider an der Schule diese Sprache und da meine Noten jetzt ins Abi eingehen muss ich mir ein bisschen Mühe geben und solche Projekte gut schaffen.
    Habe auch einen Mergesort Code für VB.NET gefunden, auf dem basiert meiner auch aber musste halt einiges umändern und daraus sind dann jetzt diese Error entstanden. Mache mich dann jetzt erstmal daran "Function" zu recherchieren.

    lang11 schrieb:

    "Function" zu recherchieren
    Auf Arbeit kann ich einfach auf das Wort im Code klicken, und dann [F1] - das öffnet das vb6-Hilfe-System auf dem Schlüsselwort.
    (Aber wir haben auch vb6-Enterprise-Edition, und Offline MSDN installiert.)



    Tja, ich sehe grade, dass eine Function wohl keine Arrays zurückgeben kann.
    Man kann allerdings Variant zurückgeben - aber ein Variant kann ja alles sein (wie der Name schon sagt).
    Mit dem Nachteil, dass man andererseits auch nie sicher sein kann, wasses nu ist, und wie es sich verhalten wird.

    Jo, das wird noch lausig, MergeSort in vb6 zu coden - weil es ist ein rekursiver Algorithmus.
    Zumindest deine Vorlage scheint rekursiv zu ticken, und mit Array-Rückgabetypen zu arbeiten, was vb6 nicht oder nur miserabel unterstützt.

    Aber dassis alles schon 3 Schritte zu weit gedacht - sieh erstmal zu, dass du dir eine fundierte Referenz-Doku verschaffst und verstehst - weil dassis nicht ganz unkompliziert, was da steht.
    weil ja sowohl die Argument-Liste als auch der RückgabeWert erklärt wird.



    (guck - und in unserer Hilfe das Beispiel ist auch in mehrfacher Hinsicht minderwertig - aber immerhin: es gibt eines)



    Ach - nochn Tipp: Wähl das fach ab, wenn du kannst.
    Ich habe bislang ausschliesslich von miserablem bis katastrophal miserablem VB-Schulunterricht gehört, und zwar schon so einiges.
    Und dass bei euch noch vb6 gegeben wird schlägt echt dem Fass die Krone ins Gesicht.

    Schlechter Unterricht ist verheerend, weil er bringt den schülern sog. "Anti-pattern" bei, also sie gewöhnen sich an Dinge so zu tun, wie man sie keinesfalls!!! jemals anfangen dürfte.
    Dressiert auf ihre Anti-Pattern fliegen diese Unterrichts-Opfer dann andauernd voll auf Nase, und haben auch extreme Widerstände, richtige Vorgehensweisen zu erlernen.
    (Weil sie dann als erstes anerkennen müssten, u.U. jahrelang nur Mist gecodet zu haben)
    Auch wissen sie garnet, dass sie garnet wissen, wies geht - weil sie glauben ja ihren Anti-Pattern.

    Also ein c#-Anfänger ganz ohne jede Programmier-Erfahrung kommt vielfach! schneller voran als ein durch Schul-Unterricht missgebildeter VB-Abkömmling.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich habe jetzt ein Programm geschrieben, welches auf Buttondruck eine Funktion aufruft und dann einen Wert wiedergibt.

    Visual Basic-Quellcode

    1. Dim i As Integer
    2. Dim k As Integer
    3. Private Sub Command1_Click()
    4. k = InputBox("Gib k ein")
    5. i = Minus(k)
    6. MsgBox (i)
    7. End Sub
    8. Private Function Minus(ByVal m As Integer) As Integer
    9. Do While m > 0
    10. If m < 0 Then
    11. Minus = m
    12. Else
    13. m = m - 1
    14. End If
    15. Loop
    16. End Function
    ja - super - Function richtig angewendet!
    Insbes. das ByVal ist wichtig und schützt vor unangenehmen überraschungen.
    Du vermeidest da bereits die vb6-AntiPattern-Katastrophe, wo alle Argumente defaultmässig byRef übergeben sind.


    Inhaltlich macht die Methode zwar voll Blödsinn, also es kann nur -1 bei rauskommen, es sei denn, jmd. gibt -5 als k ein - das ergibt 0 - und der Benutzer staunt.
    Aber egal.
    Ich nehme an, im wirklichen Leben rückst du die Code-Blöcke schon ein, oder?

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

    Alles klar, danke. Dann warte ich wohl auf die nächste Stunde mal gucken wie unser Lehrer das Ganze dann umsetzen will.

    Abwählen kann ich das Fach leider nicht mehr, da ich in ca. 6 Monaten Abi mache und die ganzen Prüfungsfächer schon feststehen. Außerdem habe ich bei den anderen Fächern weitaus schlechtere Noten als in Informatik.

    Danke für deine Hilfe.

    lang11 schrieb:

    wie unser Lehrer das Ganze dann umsetzen will
    jo, da wär ich auch gespannt.

    was du schoma vorarbeiten könntest wäre eine Anwendung, die Zufallszahlen aus einer Datei einliest oder sowas.
    Oder es sonstwie im Code anlegen.

    jdfs Beim Entwickeln ist enorm nützlich, dass man mit einem Klick einen aussagefähigen, reproduzierbaren testlauf durchführen kann, ohne immer wieder sonstwas wie viel noch eingeben zu müssen.

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

    hier - guckma:

    Visual Basic-Quellcode

    1. Public Sub CreateArray(ByRef items As Variant, ParamArray args() As Variant)
    2. ReDim items(UBound(args))
    3. For i = 0 To UBound(args): items(i) = args(i): Next
    4. End Sub
    5. Private Sub Form_Load()
    6. Dim ints() As Integer
    7. CreateArray ints, 3, 5, 1, 6, 5, 2, 8, 0, 9
    8. 'hier liegen die Zahlen nun im ints()-Array vor.
    So könnte man in vb6 ein int-Array als Test-Daten komfortabel, leserlich, reproduzierbar bereitstellen.
    CreateArray() kann sogar verschiedene Arrays - nicht nur Integer, und sollte in ein Modul, weil wird evtl. noch an mehreren stellen gebraucht werden.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    RodFromGermany schrieb:

    Es ist sehr wohl "erlaubt", allerdings werden die nicht mit As Type deklarierten Variablen als Variablen vom Type Variant angelegt

    Ja, schon klar, aber der TE wollte offensichtlich alle als Integer deklarieren – und das geht so nicht.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum