Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Dynamisches Array und "Inkompatible Typen"
Jojojoxx - Mi 28.12.05 15:27
Titel: Dynamisches Array und "Inkompatible Typen"
Hallo!
Ich habe ein dynamisches Array vom Typen String erzeugt, jedoch lassen sich komischerweise nur CHAR darauf speichern und keine Strings. Hier ist der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var Matrix:Array of String;
Setlength(Matrix,Pos1); for j:=1 to high(Matrix) do setlength(Matrix[j],2);
Matrix[1,Pos1]:=Nickname; |
Das Array ist doch ein Array of String, wieso akzeptiert der PC nur CHAR???
Danke euch!
mfg
Jojo
Moderiert von
raziel: Quote- durch Delphi-Tags ersetzt
BenBE - Mi 28.12.05 15:37
Titel: Re: Dynamisches Array und "Inkompatible Typen"
Jojojoxx hat folgendes geschrieben: |
Hallo!
Ich habe ein dynamisches Array vom Typen String erzeugt, jedoch lassen sich komischerweise nur CHAR darauf speichern und keine Strings. Hier ist der Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var Matrix:Array of String;
Setlength(Matrix,Pos1); for j:=1 to high(Matrix) do setlength(Matrix[j],2);
Matrix[1,Pos1]:=Nickname; |
Das Array ist doch ein Array of String, wieso akzeptiert der PC nur CHAR???
Danke euch!
mfg
Jojo |
Strings sind für Delphi teilkompatibel mit Arrays (Compiler Magic). Du nutzt die Routinen hier falsch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var Matrix:Array of String;
Setlength(Matrix,Pos1);
Matrix[1]:=Nickname; |
Keldorn - Mi 28.12.05 15:40
Hallo
was genau willst du den tun? irgendwie vermischt du hier 2 Sachen.
Zitat: |
Matrix[1,Pos1]:=Nickname;
|
kannst du auch anders schreiben:
Delphi-Quelltext
1:
| Matrix[1][Pos1]:=Nickname; |
also den 1. Eintrag der Matrix (=ein string) und diesen string an Pos1 ändern, und das ist ein char. Das ist bestimm t nicht das, was du willst ;)
Zitat: |
setlength(Matrix[j],2);
|
warum?
mfg Frank
Jojojoxx - Mi 28.12.05 15:45
Hi!
Danke für eure Hilfe!
Ich möchte ein zweidimensionales Array, dass zwei Stellen Breit ist.
Während der Laufzeit werden nur die Y-Werte angepasst, und zwar so, wie die Variable Pos1 groß ist.
Danach möchte ich nur auf die einen Bereich dieses Arrays einen String schreiben.
mfg
Jojo
Keldorn - Mi 28.12.05 15:53
Hallo
du deklarierst aber nur ein eindimensionales Array
Delphi-Quelltext
1:
| var Matrix:Array of array of String; |
und ich denke, daß du
Matrix[1,Pos1] umdrehen muß -> Matrix[Pos1,1]:= ...
sonst sehe ich keinen Sinn dahinter.
Mfg Frank
Jojojoxx - Mi 28.12.05 16:16
Hi!
Wie kann ich denn ein mehrdimensionales Array deklarieren??
Zitat: |
und ich denke, daß du
Matrix[1,Pos1] umdrehen muß -> Matrix[Pos1,1]:= ... |
Wieso das? Zuerst gebe ich doch die X-Stelle an, die heir 1 ist, also die Spalte1 und danach die Y-Werte, also die Reihen, und diese sind Variabel, oder?
mfg
Jojo
Keldorn - Mi 28.12.05 17:07
Jojojoxx hat folgendes geschrieben: |
Wie kann ich denn ein mehrdimensionales Array deklarieren?? |
steht doch schon oben:
Delphi-Quelltext
1:
| var Matrix:Array of array of String; |
Jojojoxx hat folgendes geschrieben: |
Wieso das? Zuerst gebe ich doch die X-Stelle an, die heir 1 ist, also die Spalte1 und danach die Y-Werte, also die Reihen, und diese sind Variabel, oder?
|
nein, es ist genau andersrum. Bzw je nach dem, wie du es betrachtest.
Das wird auch deutlich, wenn du dein mehrdimensionales array erstellst
Delphi-Quelltext
1: 2:
| setlength(matrix, Anzahl der Reihen); (Anzahl der Reihen = variabel) |
Delphi-Quelltext
1: 2:
| setlength(matrix[Reihe], Anzahl der Spalten in dieser Reihe); (Anzahl der Spalten in dieser Reihe = 2) |
bei einem dynamischen Array kannst du in jeder Reihe eine unterschiedliche Anzahl von Spalten erstellen. Da du dies nicht tust, kannst du auch gleich
Delphi-Quelltext
1:
| setlength(matrix, Anzahl der Reihen, Anzahl der Spalten); |
nehmen, und sparst dir die for-schleife. Wenn du denkst, du kommst mir der x,y-denkweise besser, mußt du halt die beiden Werte tauschen.
Mfg Frank
Jojojoxx - Mi 28.12.05 18:26
Hi!
Danke, das hab ich soweit verstanden.
Aber wenn ich nun auf eine Stelle des Arrays etwas schreiben will, in diesem Falle will ich einen String an der Stelle [Pos1,2] setzen, bekomme ich immer eine Fehlermeldung:
Hier der Code:
Zitat: |
var Array of Array of String;
setlength(Matrix, Pos1, 2);
Matrix[Pos1,2]:=Nickname; // In dieser Zeile kommt die Fehlermeldung
|
Zu diesem Zeitpunkt hat Pos1 den Wert "1".
mfg
Jojo
Allesquarks - Mi 28.12.05 18:51
Wenn deine Problemstellung noch gültig ist vergiss das zweidimensionale Array.
Du hast ein dynamisches Array (nebenbei: das ist Null-basiert, das heißt deine Schleife
Zitat: |
for j:=1 to high(Matrix) do
setlength(Matrix[j],2); |
wird irgendwann zu einem Fehler führen).
Nun möchtest du in das Array Matrix of string an die STelle 1 oder Pos1 etwas schreiben also musst du an Stelle 1-1 oder Pos1-1 deinen String schreiben:
Delphi-Quelltext
1:
| matrix[pos1-1]:='Nickname'; |
P.s.:In gewisserweise ist dein Array zweidimensional, da Strings ja auch eine Dimension haben. Eine Anweisung:
Delphi-Quelltext
1:
| matrix[pos1,3]:=Nickname |
versucht in den pos1.ten String im Array Matrix an die Stelle 3 (denn STrings sind 1-basiert) ein Wort zu schreiben, eine Stelle in einer Zeichenkette ist nunmal ein Char
Jojojoxx - Mi 28.12.05 19:16
Hi!
Stimmt, Arrays sind Null-basiert, hab ich nicht dran gedacht.
Aber eins verstehe ich nicht so ganz.
Zitat: |
matrix[pos1-1]:='Nickname'; |
ist doch nicht eindeutig bei einem 2-dimensionalen Array, da kommt bei mir auch die Fehlermeldung "Inkompatible Typen String und dynamic Array". :?
Und wieso versucht der Computer bei Matrix[Pos1,3] an der Stelle 3 etwas am String zu ändern? Die eckige Klammer bezieht sich doch auf den Array und sind die x/y-Koordinaten!? :(
Danke für deine Hilfe!
btw: Es geht darum, eine Art Datenbank anzulegen. Über jeden User sollen bestimmte Daten gespeichert werden, diese werden allerdings nach und nach wieder gelöscht und neue kommen dazu, muss also flexibel sein. Außerdem ist nicht vorgeschrieben aus wievielen Usern die Datenbank besteht. Evtl. gibts dafür ja auch eine bessere und einfachere Lösung!?
mfg
Jojo
Allesquarks - Mi 28.12.05 21:41
Meine Antwort bezog sich auf dein Ursprüngliches Problem: dort fragtest du nach einem array of string welches eindim. ist. Folglich vertägt es auch nur eine Zahl als index Punkt... Das das in deinem Fall auch anders ging liegt daran, was ich oben andeuten wollte, dass Strings ebenfalls eine Dimension haben (Zeichen"Kette"). Der Compiler interpretiert also ein Array of string bei einem Zugriff über zwei Zahlen als Index wie Matrix[i,j]:=Nickname; als ein zweidimensionales Array of char.
Da ich annehme, dass Nickname selber ein Sting ist brauchst du diesen zweiten index nicht. Wenn du ihn aber benutzt dann dann greifst du auf einen einzelnen Character zu.
delfiphan - Mi 28.12.05 21:53
Wenn die Spaltenanzahl fix ist, dann macht es nicht unbedingt Sinn, das dynamisch zu lassen. Geschickter wäre folgende Konstruktion:
Delphi-Quelltext
1:
| array of array[1..2] of String |
Oder -- um semantische Fehler zu vermeiden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| type TXyString = record col1, col2: String; end; var MyArray: array of TXyString; |
Jojojoxx - Do 29.12.05 14:51
Hi!
@Allesquarks: Achso! Dann versteh ich´s auch! :D
@delfiphan:Scheint so zu klappen, danke dir! Werde es jetzt mal ausführlicher testen...
mfg
Jojo
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!