PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] zwei Adressen subtrahieren


AtTheDriveIn
2006-11-10, 01:21:34
Ich habe hier die Adressen zweier Objekte auf dem Heap in hexadezimal.

Wenn ich diese voneinader abziehe und dann durch die Größe des Datentyps dividiere, müßte ich doch auf die Anzahl der Objekte kommen, oder nicht?

Also:

int Anzahl=&a[n]-&a[0]/sizeof(typ)

Irgendwie klappt das aber bei mir nicht...;)

Gnafoo
2006-11-10, 08:09:53
Ist in deinem Beispiel n nicht schon die Anzahl der Objekte? Oder ist das nur zum Verständnis? Wenn ja, dann fehlt da eine Klammer und ein Cast auf int. Vielleicht kriegst du dann was du willst. Wenn mich nicht alles täuscht also:

int Anzahl=(int)(&a[n]-&a[0])/sizeof(typ);

Gast
2006-11-10, 08:27:56
int Anzahl=&a[n]-&a[0]/sizeof(typ)

Irgendwie klappt das aber bei mir nicht...;)Punkt vor Strich?

int Anzahl=&a[n]-&a[0]/sizeof(typ)
wird ja so gerechnet:
&a[n]- (&a[0]/sizeof(typ))
du willst aber:
(&a[n]-&a[0]) /sizeof(typ)

muhkuh_rs
2006-11-10, 14:11:50
Darüber hinaus liefert das Subtrahieren typisierter Pointer IIRC die Differenz in der Anzahl der Typengrößen. Insofern ist das Teilen durch sizeof(typ) auch falsch.

AtTheDriveIn
2006-11-10, 14:28:11
Ist in deinem Beispiel n nicht schon die Anzahl der Objekte? Oder ist das nur zum Verständnis? Wenn ja, dann fehlt da eine Klammer und ein Cast auf int. Vielleicht kriegst du dann was du willst. Wenn mich nicht alles täuscht also:

int Anzahl=(int)(&a[n]-&a[0])/sizeof(typ);


Ja genau n ist nur zum Verständnis.
Bei mir sieht das folgendermaßen aus:

i=(int)(r_a[n]-&a[1])/sizeof(pElement);

klappt aber trotzdem nicht ;)

Mal ausführlicher:
a[] ist ein Array mit Objekten von Typ pElemente auf dem Heap.

r_a[] ist ein Array von Zeigern auf diese Objekte

n ist eine Zahl mit der sich einzelne Objekte aus a[] identifizieren lassen
über r_a[n] bekomme ich die Adresse des Objektes mit dem entsprechenden n im a[]

Das läuft auch soweit. Ich brauche nun aber für eine andere Sache den Indexwert i im a[] an dem das Objekt mit n steht. Da ich die Adressen habe, kann man das doch eigentlich wie oben gezeigt hinbekommen. Leider klappt das nicht und auch aus dem Debuggen werde ich nicht schlau.

In meinem Beispiel ist

r_a[n]=0x00355da0
&a[1]=0x00355d68

laut Debugger sind subtrahiert 7. Das kann ich nicht nachvollziehen.

muhkuh_rs
2006-11-10, 14:42:37
Ja genau n ist nur zum Verständnis.
Bei mir sieht das folgendermaßen aus:

i=(int)(r_a[n]-&a[1])/sizeof(pElement);

klappt aber trotzdem nicht ;)

Mal ausführlicher:
a[] ist ein Array mit Objekten von Typ pElemente auf dem Heap.

r_a[] ist ein Array von Zeigern auf diese Objekte

n ist eine Zahl mit der sich einzelne Objekte aus a[] identifizieren lassen
über r_a[n] bekomme ich die Adresse des Objektes mit dem entsprechenden n im a[]

Das läuft auch soweit. Ich brauche nun aber für eine andere Sache den Indexwert i im a[] an dem das Objekt mit n steht. Da ich die Adressen habe, kann man das doch eigentlich wie oben gezeigt hinbekommen. Leider klappt das nicht und auch aus dem Debuggen werde ich nicht schlau.

In meinem Beispiel ist

r_a[n]=0x00355da0
&a[1]=0x00355d68

laut Debugger sind subtrahiert 7. Das kann ich nicht nachvollziehen.

Man kann grundsätzlich nur mit typisierten Pointern rechnen. Dabei ergibt sich bei Subtraktion zweier Pointer nicht die Anzahl in Bytes zwischen den Adressen, sondern das Ergebnis ist bereits "Anzahl Bytes/sizeof(typ)".

Wozu soll eigentlich r_a[] gut sein?

AtTheDriveIn
2006-11-10, 15:25:03
Man kann grundsätzlich nur mit typisierten Pointern rechnen. Dabei ergibt sich bei Subtraktion zweier Pointer nicht die Anzahl in Bytes zwischen den Adressen, sondern das Ergebnis ist bereits "Anzahl Bytes/sizeof(typ)".

Wozu soll eigentlich r_a[] gut sein?

Das heißt für mein Problem also ich muß nicht extra mehr durch sizeof(typ) teilen, sondern kann direkt mit dem Ergebnis arbeiten?

r_a[] erspart sequentielles Suchen in a[]. Will ich beispielsweise das Objekt mit n = 10 haben. Muß ich danach nicht in a[] suchen, was Zeit kosten würden, sondern kann direkt über r_a[10] darauf zugreifen.

SimonX
2006-11-12, 04:11:47
int Anzahl=&a[n]-&a[0]/sizeof(typ)

Irgendwie klappt das aber bei mir nicht...;)

Das ist so auch falsch. Richtig ist:

int Anzahl=&a[n]-&a[0];

Nichts dividieren oder so. Vorraussetzung ist aber, das "a" auch den richtigen Typ hat. Aber der muss ja sowieso stimmen, denn sonst kannst du nicht a[n] benutzen.

Weiterhin sind in dem Code: int Anzahl=&a[n]-&a[0]/sizeof(typ) noch mehr Fehler.

Was da steht ist &a[n]-(&a[0]/sizeof(typ)), welches überhaupt keinen Sinn macht.