2D-Array 1D-Array zuweisen

Hallo, ich möchte einem 2D-Array ein 1D-Array zuweisen:

dim Array(70) as string
dim Matrix(12,70) as string

for i = 1 to 12

for j = 1 to 70
Array(j) = random(1,2)
next j

Matrix(i) = Array()

next i

Leider kommt da diese Fehlermeldung: „Cannot assign whole array“. Was ist das Problem?

Die Idee ist, dass Matrix(1) das gesamte Zufallszahlen-Array zugewiesen wird, dann Matrix(2) das nächste Zufallszahlen-Array etc…

Danke und Gruß,
Jan

Hallo,

die Syntax erinnert an VB6 oder VBA. Schreib bitte noch, ob Du mit VBA oder VB6 arbeitest.

ich möchte einem 2D-Array ein 1D-Array zuweisen:

Dim Array(70) As String
Dim Matrix(12,70) As String

for i = 1 to 12
 for j = 1 to 70
 Array(j) = random(1,2)

Was soll die Zeile bewirken? Geschreiben hast Du: Übergib den Inhalt von Array ‚random‘ (mit den angegebenen Indizes) an das Array ‚Array‘.

Deine Arrays sind vom Typ String, Du weist ihnen Zahlen zu. VB wandelt die Zahlen für Dich in Strings um, statt zu meckern.

Weiter unten schreibst Du etwas von Zufall. Die Syntax dafür wäre:

Array(j) =CSstr(Int(Rnd(1) * Maimalwert))
Ich habe die Umwandlung in einen String mitgeschrieben, Lässt Du das weg, macht das VB für Dich, aber dann sieht man dem Code nicht an, was er tut.

 next j

 Matrix(i) = Array()

next i

Matrix ist zweidimensional, Du musst 2 Indizes angeben. Für Array musst Du auch einen Index angeben.

Leider kommt da diese Fehlermeldung: „Cannot assign whole
array“. Was ist das Problem?

Keine Ahnung, über welchen der Fehler das Programm zuerst meckert. :smile:

Die Idee ist, dass Matrix(1) das gesamte Zufallszahlen-Array
zugewiesen wird, dann Matrix(2) das nächste
Zufallszahlen-Array etc…

Matrix(1) kannst Du nur einen Wert zuweisen, kein Array.
Ich verstehe nicht ganz, was Du vor hast. Scheinbar etwas, das VB nicht kann.

Gruß Rainer

(vielleicht) falsches Brett

dim Array(70) as string
dim Matrix(12,70) as string
for i = 1 to 12
for j = 1 to 70
Array(j) = random(1,2)
next j
Matrix(i) = Array()
next i

Hallo Jan,

random() kennt weder mein Excel-Vba noch mein VB 5.0
Von welcher Sprache sprichst du?
.Net hat ein eigenes Brett.

Zu der Variablen Array(), würde ich in Excel-Vba nie benutzen als Variablennamen, geht aucg gar nicht da der Debugger meckert,
denn Excel-Vba kennt selbst Array().

Zu deiner Anfrage, wenn deine Sprache das nicht kann
Matrix(i) = Array()
mußt du höchstwahrscheinlich anstelle dessen eine For Schleife von 1-70 benutzen.

Oder, was in VB geht, in Vba nicht weil es da den Zeiger nicht gibt
könntest du im Speicher umkopieren, dazu brauchst du einen
Zeiger auf den Variablenbereich der evtl. „varptr“ oder so
heißt.

Genaueres, sehr genaueres dazu, wissen u.a. Cheepapa und Anno74.

Gruß
Reinhard

Random() und VB

die Syntax erinnert an VB6 oder VBA. Schreib bitte noch, ob Du
mit VBA oder VB6 arbeitest.

Hallo Rainer,

Vba nicht.
VB6.0 kennt Random()?
Mein VB5.0 mag es nicht so:
http://www.uploadagent.de/show-184165-1335028975.html

Gruß
Reinhard

Hallo Reinhard,

Vba nicht.
VB6.0 kennt Random()?

Nein. Da ist aber so viel falsch, daß ich das für geraten halte. :smile:

Aber ich habe verstanden, was Du meinst, was gesucht wird und hab’s mal gebaut …

Gruß Rainer

Hallo,

Reinhard hat mich auf die Fährte gebracht, was Du vorhaben könntest.
Der Weg mit CopyMemory, den Reinhard angedeutet hat, funktioniert mit Strings variabler Länge nicht. Deine Arrays sind ja vom Typ String.

Suchst Du eventuell etwas ähnliches wie das hier … ?

Option Explicit

Private Sub Command1\_Click()
 Dim ArrSrc(3) As String, ArrDest(3, 10) As String, ArrRnd(3) As String
 Dim i As Integer, j As Integer, z As Integer, m As Integer

 Randomize Timer

 ArrSrc(0) = "Test"
 ArrSrc(1) = "Versuch"
 ArrSrc(2) = "Probe"
 ArrSrc(3) = "oder so"

 For i = LBound(ArrDest, 2) To UBound(ArrDest, 2)
 For j = LBound(ArrRnd) To UBound(ArrRnd)
 ArrRnd(j) = j
 Next
 For j = UBound(ArrRnd) To LBound(ArrRnd) Step -1
 z = Int(Rnd(1) \* j)
 m = ArrRnd(j)
 ArrRnd(j) = ArrRnd(z)
 ArrRnd(z) = m
 Next
 For j = LBound(ArrRnd) To UBound(ArrRnd)
 ArrDest(j, i) = ArrSrc(ArrRnd(j))
 Next
 Next
End Sub

Deine ‚Abkürzung‘ kann VB nicht.

Gruß Rainer

Mit Copymemory auf Arrays zugreifen

Reinhard hat mich auf die Fährte gebracht, was Du vorhaben
könntest.
Der Weg mit CopyMemory, den Reinhard angedeutet hat,
funktioniert mit Strings variabler Länge nicht. Deine Arrays
sind ja vom Typ String.

Hallo Rainer,

ja, ich meinte Copymemory. Und für mich erstaunlich genug,
nach vier Jahren wußte ich sogar noch den Namen des Zeigers
*sehr staun und freu*

Ich habe mal was recherchiert zu unsrer beiden Erinnerung und auch
und grad für interessierte VB-Mitleser.
**/t/vb-excel-vba-array-vergroessern/4820024/13
Tipp für dich, such dort mit Strg+f nach varptr, dann biste
schneller bei dem Code wo es benutzt wird.

Gruß
Reinhard**

Hallo Reinhard,

/t/vb-excel-vba-array-vergroessern/4820024/13
Tipp für dich, such dort mit Strg+f nach varptr, dann biste
schneller bei dem Code wo es benutzt wird.

ja, ist schon klar, aber das geht nur mit Zahlen.

Bei Strings fester Länge kann man die Strings noch mit Hilfe des StrPtr umkopieren, aber in einem Array aus Strings mit variabler Länge geht das nicht.

Durch umkopieren kann man den String " Test" nicht gegen den String „Versuch“ austauschen. Die müssen die selbe Länge haben. Kopiert man „Versuch“ an die Stelle, an der " Test" stand, stürzt das Programm ab. Umgekehrt käme heraus: " Test uch" :smile:

Gruß Rainer

Strings fester Länge

funktioniert mit Strings variabler Länge nicht.

Hallo Rainer,

vor zig Jahren wußte ich das vielleicht mal, k.A.
Wie erzeuge ich Stringvariablen mit fester Länge?
So jedenfalls nicht
Dim x As String(10)
Dim x(1 to 4) As String(10)

Danke ^ Gruß
Reinhard

Hallo Reinhard,

Wie erzeuge ich Stringvariablen mit fester Länge?

Dim Txt As String \* 10

Das ist besonders wichtig, wenn du z.B. mit Type eigene Variablen erzeugst, die Strings enthalten, daraus ein Array baust und das mit ‚put‘ und ‚get‘ schreiben und lesen willst. Das geht nur mit Strings fester Länge.

Gruß Rainer

Hallo Rainer,

Wie erzeuge ich Stringvariablen mit fester Länge?

Dim Txt As String * 10

alles klar, ich hatte schon noch im Hinterkopf daß die Lösung einfach
ist. Nützt mir aber nothing wenn ich in der Hilfe „string“ eingebe.
Da wird mir in Vba die String-Funktion erklärt.
Und der String-datentyp und es wird der äh „Wertebereich“ (=max. Länge) von variablen und festen Strings angezeigt.
Wie man aber so einen festen String erzeugt, naja, zumindest ich fand da nix zu.

Mal angenommen, die Arrays wären Strings fester Länge, ging es dann
zu lösen mit Copymemory?
Du hast was geschrieben „geht nur mit Zahlen“.
Das kann m.E. doch nur bedeuten daß der Typ der Zahlen Integer,
long, single bekannt ist, dann weiß man die Bytelänge.
Was soll da der Unterschied sein zu Strings mit bekannter Länge?

Gruß
Reinhard

Hallo reinhard,

Wie man aber so einen festen String erzeugt, naja, zumindest
ich fand da nix zu.

Ich weiß auch nicht, wo es da steht. Ich hab’s bei AVB gelesen.

Mal angenommen, die Arrays wären Strings fester Länge, ging es
dann
zu lösen mit Copymemory?
Du hast was geschrieben „geht nur mit Zahlen“.
Das kann m.E. doch nur bedeuten daß der Typ der Zahlen
Integer,
long, single bekannt ist, dann weiß man die Bytelänge.
Was soll da der Unterschied sein zu Strings mit bekannter
Länge?

Ob es mit Strings fester Länge geht, weiß ich nicht. Das müsste ich erst erforschen. :smile: Bei Strings variabler Länge gibt es einen VarPtr in dem stehen die StrPtr als Long. VarPtr ist ein ‚normales‘ Long-Array, die Werte stehen direkt hintereinander. Die Adressen des StrPtr stehen nicht hintereinander, da sucht sich Windows freien Speicher und reserviert den für das Programm. Ob für Strings fester Länge wie bei Zahlen ein Speicher mit dem gesamten Ptatzbedarf am Stück reserviert wird, habe ich mir noch nicht angesehen.

Gruß Rainer

getestet …
Hallo Reinhard,

Option Explicit

Private Sub Command1\_Click()
Dim i As Integer
Dim txt(10) As String \* 1
For i = 0 To 10
 txt(i) = "a"
 List1.AddItem StrPtr(txt(i))
Next
End Sub

Nein, die stehen nicht hintereinander, kann man nicht im Stück kopieren.

Gruß Rainer

Dim i As Integer
Dim txt(10) As String * 1
For i = 0 To 10
txt(i) = „a“
List1.AddItem StrPtr(txt(i))
Next
End Sub

Nein, die stehen nicht hintereinander, kann man nicht im Stück
kopieren.

Hallo Rainer,

dankeschön. Also geht es so nicht.

Gruß
Reinhard

Ich benutze E-Prime, eine experimentalpsychologische Programmierumgebung, laut Hersteller basierend auf „E-Basic - Underlying scripting language of E-Prime (nearly identical to Visual Basic for Applications“

Ich benutze E-Prime, eine experimentalpsychologische Programmierumgebung, laut Hersteller basierend auf „E-Basic - Underlying scripting language of E-Prime (nearly identical to Visual Basic for Applications“

Hi,

Ich benutze E-Prime, eine experimentalpsychologische
Programmierumgebung, laut Hersteller basierend auf „E-Basic -
Underlying scripting language of E-Prime (nearly identical to
Visual Basic for Applications“

nahezu identisch klingt gut. Ich kenne es ber nicht und damit auch nicht die Unterschiede. Meine Syntax kann richtig sein, muss aber nicht.

Ein ganzes, eindimensilnales String-Array ohne Schleife in ein zweidimensionales Array kopieren wird vermutlich nicht gehen.

Hast Du meinen Code gesetet? Läuft der? Wenn ja, tut er, was Du möchtest? Wenn nein, an welcher Stelle wird welcher Fehler angezeigt, b.z.w. was ist nicht wie Du es möchtest?

Gruß Rainer

Ich habe es jetzt etwas anders gelöst und ein 3D-Array gemacht. Die Daten werden also gar nicht erst in ein 2D-Array geschrieben sondern direkt in das mit 3D, somit muss ich auch nichts mehr kopieren. Ist unterm Strich vielleicht sogar die elegantere Methode. Vielen Dank jedenfalls!

gelöst
Hi,

Ich habe es jetzt etwas anders gelöst und ein 3D-Array
gemacht. Die Daten werden also gar nicht erst in ein 2D-Array
geschrieben sondern direkt in das mit 3D, somit muss ich auch
nichts mehr kopieren. Ist unterm Strich vielleicht sogar die
elegantere Methode.

OK, Problem erledigt ist doch gut. :smile:

Zeigst Du uns noch den funktionierenden Code? Der könnte uns etwas über Dein Basic verraten.

Gruß Rainer

Hallo Rainer,

Zeigst Du uns noch den funktionierenden Code?

richtig, immer interessant.

Der könnte uns etwas über Dein Basic verraten.

Hier ist Random auch mit zwei Parametern.
http://www.uni-saarland.de/fak5/excops/download/Epri…
Scheint sowas zu sein wie der Anfrager hat *möglicherweise*

Gruß
Reinhard

Gruß Rainer