PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie ein C-Datenfeld mit Adresse wederfinden?


Zarathustra
2007-07-09, 17:30:53
Ich hoffe es ist verständlich ohne großartig den Hintergrund zu erklären...:rolleyes:
Also folgendes ist zu bewerkstelligen:


Ich habe ein Array aus Strings, die auf 80 Zeichen festgelegt sind, und einen Zeiger darauf:
char data[50][80], *dataptr=&data;

Für dieses muss nun globaler Speicher allokiert werden:
UINT alloc_status = TMP_alloc((size_t) sizeof(data), (void**)&dataptr);

Da im vorliegenden Fall zwischen dem oben genannten Init-Code und zyklischem Code unterschieden wird, muss ich eine global verfügbare UINT-Variable mit dem Zahlenwert der Zieladresse des Data-Zeigers beschreiben, damit im zyklischen Teil auf dieses 2D-Feld zugegriffen werden kann:
memadr = dataptr;


Nun im zyklischen Code:
Jetzt habe ich eigentlich alles nötige um das Zeug wiederzufinden - eine Startadresse und das Format der Daten dort (das 2D-char-Feld).

Aber ich kriegs nicht hin, einen passenden neuen Pointer zu erzeugen und diesem, als seine Zieladresse den in memadr gespeicherten Zahlenwert zuzuweisen! Vielleicht ist das ja ganz einfach und ich denke zu kompliziert...? :confused:

Kann mir vielleicht jemand einen Codeschnipsel geben der da weiterhilft? ;(
Danke schonmal.

Trap
2007-07-09, 18:01:39
Was ist ein UDINT? Wieso bist du der Meinung, dass man darin einen Pointer speichern kann?

(char*)0+zahl
müsste zum zurückwandeln funktionieren.

Zarathustra
2007-07-09, 19:37:45
Tschuldigung, ich meinte UINT, habs berichtigt.

Das mit der status-Variable hab ich aus nem Beispiel übernommen, die ist hierbei aber erstmal unerheblich.
Welches Format wäre denn deiner Meinung nach passend um eine Speicheradresse darin zu speichern?

Ich möchte den dann im zyklischen Teil zurückerheltenen Pointer benutzen, um durch das Feld, also quasi zwischen den stings darin, entlang zu inkrementieren.

Coda
2007-07-09, 19:43:23
void*

Zarathustra
2007-07-09, 19:50:27
gehts vielleicht ein klein wenig ausführlicher, bitte? :rolleyes:

Coda
2007-07-09, 20:31:44
Dito.

Xmas
2007-07-09, 20:58:12
Der passende Typ für den Pointer wäre char (*)[80].
char data[2][10] = { "hello", "world!" };
char (*dataptr)[10] = data;

cout << dataptr[0][1] << dataptr[1][5];
e!

Zarathustra
2007-07-10, 11:19:00
Danke Xmas, das scheint zu funktionieren, jedenfalls kommen keine Warnungen mehr. Kanns leider grad noch nicht testen obs läuft.

Das mit char (*ptr) [80]=data ist mir ehrlich gesagt noch nicht vorgekommen. Bin mir nicht ganz sicher, 100%ig verstanden zu haben was es macht; aber es erzeugt den Zeiger so dass ich mit ptr++ und ptr-- zwischen den Zeichenketten im Feld wandern kann?

Xmas
2007-07-10, 14:46:02
Danke Xmas, das scheint zu funktionieren, jedenfalls kommen keine Warnungen mehr. Kanns leider grad noch nicht testen obs läuft.

Das mit char (*ptr) [80]=data ist mir ehrlich gesagt noch nicht vorgekommen. Bin mir nicht ganz sicher, 100%ig verstanden zu haben was es macht; aber es erzeugt den Zeiger so dass ich mit ptr++ und ptr-- zwischen den Zeichenketten im Feld wandern kann?
char (*ptr)[80] deklariert einen Pointer auf char[80], also ein Pointer auf ein Feld mit 80 Zeichen. Wenn du einen Pointer inkrementierst, erhöhst du seinen Wert um die Größe des Elements auf das er zeigt. Ein Pointer auf char[80] wird also um 80 Bytes erhöht und zeigt damit auf die nächste Zeichenkette im Feld.

Die Klammern werden benötigt um char (*ptr)[80] von char* ptr[80] zu unterscheiden. Letzteres wäre nämlich ein Feld von 80 Zeigern auf char.

HellHorse
2007-07-10, 22:33:00
Doofe Anfängerfrage: sind die Strings nicht ein Element zu kurz um 80 Zeichen aufzunehmen?

rotalever
2007-07-10, 23:11:09
Doofe Anfängerfrage: sind die Strings nicht ein Element zu kurz um 80 Zeichen aufzunehmen?
Kommt drauf an, wie man sie verwenden will. Ich kann in ein 80 Einheiten großes Array immer 80 Zeichen aufnehmen. Wenn dies allerdings einem String von 80 Zeichen entsprechen soll, fehlt mir der Platz für '\0'. Die standard-Bibliotheken werden dann nicht funktionieren. Eigene Sachen kann man mit diesem String aber dann sehr wohl machen, '\0' dient ja im Prinzip nur als eine Kennzeichnung. Ich könnte mir genausogut merken, dass entweder ein '\0' am Ende kommt, oder der String 80 Zeichen lang ist.