Forum: PC-Programmierung [C++/Qt] Position in Array aus Pointer?


von Howard Wolowitz (Gast)


Lesenswert?

Hallo,

erstmal folgender Code aus einem Qt-Projekt:
1
typedef struct
2
{
3
    ...
4
}myStruct;
5
6
myStruct Data[512];
7
8
myStruct* Zeiger;

Der Zeiger zeigt auf ein Element von Data[].
Gibt es in C++ oder Qt eine fortgeschrittene Möglichkeit die Position im 
Array zu bestimmen auf die der Zeiger zeigt?

Bin mir nicht sicher ob die arithmetische Verarbeitung mittels 
sizeof(myStruct) wie man es auf nem uC machen würde für PC-System so das 
beste Mittel der Wahl ist, auch da Qt-Programme auf Windows/Linux/Mac 
laufen können, und ob das da auf allen so funktioniert???

ne while-Schleife die einfache das Array durchsucht und die Adresse 
vergleicht ist ja auch nicht so toll was die Geschwindigkeit angeht.

Gibts da vielleicht ne Standard-Lösung für sowas in C++ oder Qt?

von Rolf M. (rmagnus)


Lesenswert?

Howard Wolowitz schrieb:
> Der Zeiger zeigt auf ein Element von Data[].
> Gibt es in C++ oder Qt eine fortgeschrittene Möglichkeit die Position im
> Array zu bestimmen auf die der Zeiger zeigt?

Was meinst du mit "fortgeschrittene Möglichkeit? Die einfachste Variante 
wäre
1
size_t pos = Zeiger - Data;

> Bin mir nicht sicher ob die arithmetische Verarbeitung mittels sizeof(myStruct)
> wie man es auf nem uC machen würde für PC-System so das beste Mittel der
> Wahl ist,

Wozu brauchst du sizeof?

> auch da Qt-Programme auf Windows/Linux/Mac laufen können, und ob das da auf
> allen so funktioniert???

Pointer-Arithmetik ist Standard-C++. Das funktioniert auf jedem 
Compiler. Wichtig ist nur, daß Zeiger auch wirklich auf ein Element von 
Data zeigt und nicht irgendwo anders hin.

von Howard Wolowitz (Gast)


Lesenswert?

Rolf Magnus schrieb:
>> Bin mir nicht sicher ob die arithmetische Verarbeitung mittels sizeof(myStruct)
>> wie man es auf nem uC machen würde für PC-System so das beste Mittel der
>> Wahl ist,
>
> Wozu brauchst du sizeof?

in C auf 8-Bit-uC ist der Zeiger ja die physische Startadresse des 
Elements.
Wenn myStruct also z.B. 13 Byte groß ist und beispielsweise &Data[0] = 
1000 dann ist &Data[1] = 1013, &Data[2] = 1026, usw.


wenn Zeiger = &Data[2] ist und man

Zeiger - Data

rechnet würde in C dann 26 raus kommen und nicht der gesuchte Wert 2, 
deswegen muss man durch sizeof(myStruct) teilen.

kommt in C++ bei dieser Rechnung wirklich 2 raus?

von Florian (Gast)


Lesenswert?

C++ ist niht ganz so hirnrissig, wie du glaubst.

Sprich: Es kommt wirklich 2 heraus.

von Markus M. (mark_m)


Lesenswert?

Du benutzt z.B. den Container "vector" aus der STL. Dort fügst Du deine 
Datentypen ein. Über den Vector (Array) kannst Du dann mit einem 
Iterator rüberlaufen und deine Daten verarbeiten.

Hier http://www.ubreymann.de/stlb.html kannst Du ein deutsches Buch 
herunterladen, im welchem beschrieben ist, wie mit den Datencontainern 
und Iteratoren zu verfahren ist.

von Howard Wolowitz (Gast)


Lesenswert?

super, dann vielen Dank für die Antworten :)

von Rolf M. (rmagnus)


Lesenswert?

Howard Wolowitz schrieb:
> wenn Zeiger = &Data[2] ist und man
>
> Zeiger - Data
>
> rechnet würde in C dann 26 raus kommen und nicht der gesuchte Wert 2,
> deswegen muss man durch sizeof(myStruct) teilen.

Das ist falsch!

> kommt in C++ bei dieser Rechnung wirklich 2 raus?

Ja. Das hat es von C geerbt, wo das auch schon so ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.