PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Noch mehr Delphi Probleme


Einfachkrank
2004-01-09, 00:39:10
Hi,

ich werde noch jede Menge Verständnis für diese Sprache brauchen... :)

1. Warum funktioniert mein Programm nicht mehr, wenn ich den Komentar "{ $R, *.dfm }" hinter "implementation" weglasse?

2. Wie kann ich genau das in Delphi erreichen, was in C++ ungefähr so aussähe:
int *array;
array = new int[10];
Also, wie kann ich in Delphi aus nem Zeiger en Array erzeugen. Bitte sagt mir nicht, dass das nicht geht! :/

MFG Einfachkrank

x-dragon
2004-01-09, 08:59:56
zu 1.
Dein Programm funktioniert dann deshalb nicht mehr, da dies kein Kommentar ist sondern eine Zuweisung einer Ressource zu deiner Anwendung (*.dfm = dein Fenster zur jew. Unit). Also wenn in diesen Klammern "{}" irgendwas von "$R" steht, so werden dort grundsätzlich irgendwelche Ressourcen deinem Programm hinzugefügt wie z.B. auch dein Programm-Icon mit einer *.res-Datei in deiner Projektdatei (*.dpr). In der Richtung gibt es aber noch einige andere Funktionen wie z.B. "{$I-}" um Fehlermeldungen bei Dateioperationen zu unterdrücken, aber das kann man besser in der Hilfe nachschlagen :).

zu 2. Wie man ein normales, mehrdimensionales und/oder auch dynamisches Array verwendet kann ich dir wohl sagen, aber mit Zeigern lasse ich mich nur sehr selten ein (sollte man "normal" in Delphi auch nicht mehr verwenden).

aths
2004-01-09, 16:23:50
Afaik geht das mit dem ^-Operator.

Ein Feld legt man an mit

feld = array[0..9] of integer;

Mit ^ geht das afaik auch als Zeiger, habe aber nicht im Kopf, wie man das schreibt.

Crushinator
2004-01-09, 17:49:12
Original geschrieben von aths
(...)
feld = array[0..9] of integer;

Mit ^ geht das afaik auch als Zeiger, habe aber nicht im Kopf, wie man das schreibt.

type
feld = array[0..9] of integer;
other_feld = feld;
pfeld = ^feld;
...
end;
(* oder so *)
type
pfeld = array[0..9] of ^integer;
...
end;

bzw.

Var
pfeld : array[0..9] of ^integer;


Ein Code-Beispiel:

begin
pfeld := @feld; (* Adr auf feld setzen *)
MachWas(pfeld);
pfeld := @other_feld; (* Adr auf other_feld setzen *)
MachWas(pfeld);
...
end;

Haarmann
2004-01-09, 23:37:00
crushinator

Wo liegt der Sinn eigentlich in nem Array von Pointern auf Integer Werte?

Also das nur so mal nebenher ....

Einfachkrank
2004-01-10, 10:55:32
Es geht mir dabei hauptsächlich daraum, dass ich zur Initialisierung des Arrays flexibel sein möchte, was die Größe betrifft...
Die 10 war willkürlich gewählt. Es würde also so aussehen:

void InitArray(int **array, const int size)
{
*array = new int[size];
}
Ich hab das jetzt schon ungefähr mit nem dynamischen Array hinbekommen, den ich so angelegt habe:

var
test: array of integer;
// ...
begin
SetLenght(test, 5);
// ...
end.
Es würde mich aber trotzdem noch interessieren, wie das mit Zeigern möglich ist(also im Quellcode optisch sehbaren Zeigern ;))

Matti
2004-01-10, 15:14:37
mit getmem kannste für einen Pointer Speicher allokieren und mit freemem wieder freigeben. Und wenn du einer Variable vom Typ pByteArray einen Pointer zuweist, kannste byteweise oder mit Blockbefehlen (fillchar,move) auf den Speicher zugreifen.

Dann gibt's noch die Möglichkeit mit tMemoryStream auf einen beliebig großen und dynamischen Speicherbereich zuzugreifen.

Crushinator
2004-01-11, 17:24:34
Original geschrieben von Haarmann
crushinator

Wo liegt der Sinn eigentlich in nem Array von Pointern auf Integer Werte? Ja nun, es gibt quasi gar Keinen. Es ging viel mehr um die Schreibweise an sich. ;)
Original geschrieben von Einfachkrank
Es würde mich aber trotzdem noch interessieren, wie das mit Zeigern möglich ist(also im Quellcode optisch sehbaren Zeigern ;))

procedure InitArray(var myarray: array of Integer; const size: Integer);
begin
SetLength(myarray^, size);
end;

So müßte es theoretisch funktionieren, ich kann's z.Z. wegen fehlender IDE nicht nachprüfen. Bei Problemen, schaue ich mir das morgen nochmal genauer an.

Dann noch ein paar grundsätzliche Dinge:

Pointer deklarieren:

Var
pointer: ^Typ;

Pointer auf Adr setzen:

pointer := @Variable;

Variable selbst ändern: (pointer* = Wert; )

pointer^ := Wert;

Pointer bei Übergabeparametern: (void bla(CString Wert); )

procedure bla(var Wert: String);

Ansonsten, kann man sich kurz das (http://delphi.about.com/library/weekly/aa011601a.htm) mal antun.

icemanemp
2004-01-12, 10:15:36
Die Delphihilfe sagt doch alle was man braucht zu Zeigern oder? Am besten lernt man immernoch durch fremden guten Quellcode... ;)

Gast
2004-01-14, 14:35:41
Das ^ muss noch weg, dann sollte es stimmen...


procedure InitArray(var myarray: array of Integer; const size: Integer);
begin
SetLength(myarray, size);
end;