| |
VB.NET - Ein- und UmsteigerRe: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: Kuno60 | Datum: 16.06.14 22:21 |
| Hallo TZeRo,
hier ein kleines Beispiel, wie man es auch lösen kann (ab FW 3.5):
Function SplitWerte(Werte() As Double, Teilung As Double) As Double()()
Dim swl As New List(Of Double())
Dim a() As Double, t = Teilung, z = 1, i = 0
Do
t = z * Teilung : z += 1
a = Werte.Skip(i).TakeWhile(Function(x) x <= t).ToArray
swl.Add(a)
i += a.Length
Loop Until t > Werte.Last
Return swl.ToArray
End Function und so wird es aufgerufen:
Dim a = {200, 300, 400, 400.5, 500, 801, 900, 1200, 1640}
Dim t = 400
Console.WriteLine("Werte: {0}", String.Join(", ", a))
Console.WriteLine("Teilung: {0}", t)
Console.WriteLine()
Dim res = SplitWerte(a, t)
For Each w In res
Console.WriteLine("{0} Werte: {1}", w.Length, String.Join(" ", w))
Next und das ist die Ausgabe:
Werte: 200, 300, 400, 400,5, 500, 801, 900, 1200, 1640
Teilung: 400
3 Werte: 200 300 400
2 Werte: 400,5 500
3 Werte: 801 900 1200
0 Werte:
1 Werte: 1640 | |
Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 15.06.14 19:56 |
| Hallo,
diese Funktion soll das 1D-Array, bei einer Teilung splitten und in einem 2D-Array schreiben!
Dim Werte() As Double = {100, 200.5, 300, 800, 1900} ' Millimeterangaben als
' Beispiel
Dim Teilung AS Double = 200.5 Funktion:
Function _SplitWerte(ByVal Werte() As Double, ByVal Teilung As Double) As _
Double(,)
Dim MaxWert As Integer = Werte.GetUpperBound(0)
Dim i, j As Integer
For i = 0 To MaxWert
If Werte(i) < Teilung Then
ReDim _SplitWerte(j, i)
_SplitWerte(j, i) = Werte(i)
Else
j = j + 1
Teilung = j * Teilung
ReDim _SplitWerte(j, i)
_SplitWerte(j, i) = Werte(i)
End If
Me.listRaster.Items.Add(_SplitWerte(j, i))
Next i
End Function Nun taucht halt immer folgende Fehlermeldung auf!
Der Wert vom Typ "Integer" kann nicht in "1-dimensionales Array von Double" konvertiert werden.
Leider kann ich den Fehler nicht nachvollziehen! Ich hoffe ihr könnt mir helfen.
Gruß
TzeRo | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: ErfinderDesRades | Datum: 15.06.14 20:20 |
| 1) Fehlerzeile?
2) taucht das bereits im Editor auf (Designzeit) oder erst im Testlauf (Laufzeit)?
(Rechtschreibfehler urheberrechtlich geschützt) | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 15.06.14 20:32 |
| Der Fehler taucht im Editor auf!!!! Die Variabel j wird Rot unterstrichen!
Function _SplitWerte(ByVal Werte() As Double, ByVal Teilung As Double) As _
Double(,)
Dim MaxWert As Integer = Werte.GetUpperBound(0)
' Dim _SplitWerte(,) As Double
Dim i, j As Integer
For i = 0 To MaxWert
If Werte(i) < Teilung Then
ReDim _SplitWerte(j, i)
_SplitWerte(j, i) = Werte(i) ' <----- j hier in rot unterstrichen
Else
j = j + 1
Teilung = j * Teilung
ReDim _SplitWerte(j, i)
_SplitWerte(j, i) = Werte(i) ' <----- j hier in rot unterstrichen
End If
Me.listRaster.Items.Add(_SplitWerte(j, i))' <----- j hier in rot
' unterstrichen
Next i
End Function Lasse ich dieses automatisch vom Editor korrigieren wird dieses hinzugefügt!
Private Property _SplitWerte(j As Integer, i As Integer) As Double
Get
Return __SplitWerte
End Get
Set(value As Double)
__SplitWerte = value
End Set
End Property Und erhalte eine weitere Fehlermeldung in der Laufzeit bzw. beim starten!
Eigenschaftenzugriff muss der Eigenschaft zugewiesen werden oder deren Wert verwenden.
| |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: ErfinderDesRades | Datum: 15.06.14 20:43 |
| könnte eine Verwechslung sein, weil du den Funktionsnamen als Rückgabe-Variable verwendest.
Die Zuweisung eines Elements missversteht der Compiler wohl als rekursiven Aufruf der Methode.
Also deklarier besser eine Extra-Variable, und returne die ganz klassisch mit der Return-Anweisung.
(Rechtschreibfehler urheberrechtlich geschützt) | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: Kuno60 | Datum: 15.06.14 21:49 |
| Hallo,
dieser Code kann so nicht funktionieren.
ReDim innerhalb der Schleife löscht alle Werte.
Ständiges Hochzählen von j.
Und was soll diese Zeile "Teilung = j * Teilung" bewirken?
Was willst Du eigentlich genau erreichen?
Alle Werte die vor oder nach 200.5 stehen?
Alle Werte die kleiner oder größer als 200.5 sind?
Oder was? | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: Manfred X | Datum: 15.06.14 22:07 |
| Hallo!
Ich weiß nicht, was genau dieser Code bewirken soll,
aber vermutlich geht es irgendwie so oder ähnlich .....
Function Splitwerte(ByVal werte() As Double, _
ByVal Teilung As Double, _
ByRef splits As List(Of Double)) As Double(,)
splits = New List(Of Double)
Dim iTeilung As Double = Teilung
Dim j As Integer = 0
'Erforderliche Arraydimension ermitteln
For i As Integer = 0 To werte.GetUpperBound(0)
If werte(i) >= iTeilung Then
j = j + 1
iTeilung = j * iTeilung
End If
Next i
'Array für Rückgabe einrichten
Dim ret(j, werte.GetUpperBound(0)) As Double
j = 0 'reinit
For i As Integer = 0 To werte.GetUpperBound(0)
If werte(i) < Teilung Then
ret(j, i) = werte(i)
Else
j = j + 1
Teilung = j * Teilung
ret(j, i) = werte(i)
End If
splits.Add(ret(j, i))
Next i
Return ret
End Function Anwendung:
Dim Werte() As Double = {100, 200.5, 300, 800, 1900} ' Millimeterangaben als
Dim Teilung As Double = 200.5
Dim splits As List(Of Double) = Nothing
'Operation durchführen - Ergebnis im Array "sw" und im Ref-Param. "splits"
Dim sw As Double(,) = Splitwerte(Werte, Teilung, splits)
'Anzeige der gelisteten Splitwerte in einer Listbox (Datenbindung)
Dim splitlist As New ListBox With {.Parent = Me}
splitlist.DataSource = splits
Beitrag wurde zuletzt am 15.06.14 um 22:20:18 editiert. | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: sv00010 | Datum: 16.06.14 19:06 |
| Zitat: | | Nun taucht halt immer folgende Fehlermeldung auf!
Der Wert vom Typ "Integer" kann nicht in "1-dimensionales Array von Double" konvertiert werden.
Leider kann ich den Fehler nicht nachvollziehen! Ich hoffe ihr könnt mir helfen.
Gruß
TzeRo | |
Das kommt vom rekursiven Aufruf der Function.
Insgesamt kann man sehen, dass du versuchst mit der Visual Basic 6-Vorgehensweise,
einen Function in .net zu schreiben. Das kann so aber nicht funktionieren. 0
Beitrag wurde zuletzt am 16.06.14 um 19:07:52 editiert. | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: Manfred X | Datum: 16.06.14 20:22 |
| Auch in VB6 wäre ein Zugriff auf die Funktionsrückgabe, wie TZeRo sie
macht (einzelnes Array-Element), nicht möglich.
Sowohl in VB6 als auch in VB.Net kann aber ein intern (VB6: dynamisch, Redim)
deklariertes Array "als Ganzes" zur Rückgabe auf den Funktionsnamen
zugewiesen werden. (Bei VB.Net muß dabei die im Rückgabe-Parameter vorgegebene
Anzahl der Dimensionen stimmen).
Die hier vermutlich benötigte Anweisung "Redim Preserve" kann sowohl in VB6
als auch in VB.Net nur die letzte Array-Dimension ändern.
Die von TZeRo vorgenommene Anpassung der Arraygrenze ist deshalb so nicht möglich.
Beitrag wurde zuletzt am 16.06.14 um 20:26:37 editiert. | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 16.06.14 20:59 |
| Hallo Kuno,
ist ReDim nicht eine Neudimensionierung des Array, d.h. die Werte bleiben unberührt. Ich hab da noch das Schlüsselwort Preserve vergesseen. Und in Schleife durch aus sinnvoll, wenn man die Dimensionsgröße nicht kennt.
Den Code habe ich auch in einer Sub vorher ausprobiert (mit Preserve) und es lief. Da ich den Teil häufiger benötige, wollte ich eine Funktion bauen! Vielleicht ist es nicht gut gelöst!!
Ich möchte mit den Code erreichen, daß ein 1D Array in einen 2D Array umgewandelt wird! Für die Praxis bedeutet dieses ein Art Repositionierung einer X-Achse in mm!
Das 2D-Array müsste zum Beispiel so aussehen Teilung 400:
(1D Array = 200,300,400,400.5,500,801,900,1200,1640)
1 200,300,400 <= Teilung ist 400
2 400.5,500 <= Teilung ist 800
3 801,900,1200 <= Teilung ist 1200
4 <= Teilung ist 1600
5 1640 <= Teilung ist 2000
Ich hoffe ich könnte es etwas entwirren.
TZeRo
| |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 16.06.14 21:11 |
| Selbst mit Preserve hat es nicht funktioniert....allerdings funktioniert es in einer Sub problemlos! D.h. ich muss die Dimensionierung ermitteln wie in Manfreds Code der Fall ist!
@Manfred: Danke für den Lösungsansatz!!!!
TZeRo
| |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: Kuno60 | Datum: 16.06.14 21:29 |
| Hallo TZeRo,
danke für die Entwirrung. Jetzt ist die Sache klar: also eine Mehrfachteilung.
Gut ich probier mal was. | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 16.06.14 22:47 |
| Das mit den Löschen konnte nachvollziehen! In der Tat werden die Werte durch ReDim gelöscht!
Kuno60 schrieb:
Zitat: | | Hallo TZeRo,
hier ein kleines Beispiel, wie man es auch lösen kann (ab FW
3.5):
Function SplitWerte(Werte() As Double, Teilung As
Double) As Double()()
Dim swl As New List(Of Double())
Dim a() As Double, t = Teilung, z = 1, i = 0
Do
t = z * Teilung : z += 1
a = Werte.Skip(i).TakeWhile(Function(x) x <=
t).ToArray
swl.Add(a)
i += a.Length
Loop Until t > Werte.Last
Return swl.ToArray
End Function und so wird es aufgerufen:
Dim a = {200, 300, 400, 400.5, 500, 801, 900, 1200,
1640}
Dim t = 400
Console.WriteLine("Werte: {0}",
String.Join(", ", a))
Console.WriteLine("Teilung: {0}", t)
Console.WriteLine()
Dim res = SplitWerte(a, t)
For Each w In res
Console.WriteLine("{0} Werte: {1}", w.Length,
String.Join(" ", w))
Next und das ist die Ausgabe:
Werte: 200, 300, 400, 400,5, 500, 801, 900, 1200, 1640
Teilung: 400
3 Werte: 200 300 400
2 Werte: 400,5 500
3 Werte: 801 900 1200
0 Werte:
1 Werte: 1640 | |
Danke für den Code! So nun muss ich es nur noch es nachvollziehen bzw. verstehen! Das bekomme ich jetzt hin!
Danke......
| |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 16.06.14 22:53 |
| Danke euch allen für eure Unterstützung ..nun muss ich aber meinen Kopf selber anstrengen! Sonst lernt man ja VB.Net nie!!!
Besonderes Danke an Kuno60 und Manfred X...für die unterschiedlichen Lösungsansätze!!!
TZeRo | |
Re: Problem mit Funktionen Rückgabewert als mehrdimensionales Array!!! | | | Autor: TZeRo | Datum: 16.06.14 22:56 |
| Du hattest Recht mit der Verwechslung, aber ein weiteres Problem war auch das Redim....siehe Beiträge von Manfred x und Kuno60
Danke!!! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|