pointer wieder richtig dereferenzieren
-
Mal wieder ein Beitrag/Frage von mir die sicher total simpel ist.
Hab mir gerade den Beitrag über Pointer bei euch durchgelesen: http://magazin.c-plusplus.net/artikel/Pointer%20in%20C(PlusPlus)
Dazu mal eine Frage:
Ich habe ein
unsigned char buffer[65];
und eine Funktion, die einen Pointer auf das chararray erhalten soll
void fname(unsigned char *pbuf) {..}
innerhalb dieser Funktion muß ich den Pointer ja nun dereferenzieren. Hier mal um die Anzahl der Elemente des übergebenen chararrays festzustellen:
DWORD Size = sizeof(*pbuf);
Diese Zeile liefert mir aber nicht die Anzahl der Elemente des chararrays, sondern nur die Größe des ersten Elementes in diesem Array. Soweit ich weiß muß der Pointer nach dem dereferenzieren noch auf ein unsigned char [65] gecastet werden, aber da weiß ich nicht wie ich das schreiben sollte. Könnt ihr mir dabei helfen?
Grüße
Daimonion
-
daimonion schrieb:
Mal wieder ein Beitrag/Frage von mir die sicher total simpel ist...
und sich kurz beantworten lässt: Arraygrößen lassen sich nur eingeschränkt nachträglich ermitteln (spätestens wenn du diese dynamisch allozierst geht es nicht mehr). Daher haben viele C-Funktionen noch einen Parameter für die Elementanzahl, die man mitangeben muss.
In C++ sollte man lieber zu Klassen (auch wegen der Möglichkeit von Kopien etc. greifen) wie std::vector oder std::tr1::array und ähnlichem greifen. Diese liefern auch die Elemente mit.
#include <vector> #include <iostream> void foo(std::vector<int> const & intListe) { std::cout << "Die Liste enthält " << intListe.size() << " Elemente."; } int main() { std::vector<int> intListe; for(int i=0; i<20; ++i) intListe.push_back(i); foo(intListe); }
-
D.h. ich kann das bei dem genannten Beispiel gar nicht machen?
Das es bei dynamsichen Arrays nicht klappt ist mir bewusst. Ich wollte mit dem genannten Beispiel auch nur was probieren. Und die größe wäre fix. D.h. ich könnte später beim casten die Größe auch angeben.
Wie gesagt ich will damit nur was testen. Danach wird es eh wieder verworfen.
-
daimonion schrieb:
D.h. ich kann das bei dem genannten Beispiel gar nicht machen?
Nein.
-
Um deine Frage genauer zu beantworten:
In dem Scope in dem das Array erstellt wurde, lässt sich die Anzahl der Elemente mit:int size = sizeof(buffer) / sizeof(unsigned char);
ermitteln.
In der Funktion ist nur der Pointer pbuf bekannt, die Funktion kennt das Array nicht direkt, sondern nur seine Anfangsadresse. Demnach lässt sich mit einem...sizeof(*pbuf)
nur die größe des jeweiligen Datentyps ermitteln und mit einem...
sizeof(pbuf)
nur die größe des Zeigers.
In deinem Fall ist es üblich die Größe des Array als zweiten Parameter mit zu übergeben. Aber wie asc bereits schrieb ist es besser einen Container wie z.B. einen std::vector zu verwenden, da diese Container ihren Speicher selbst verwalten und ihre Anzahl der Elemente kennen.
-
Danke NeoGreen für deine Ausführung. Ich muß nochmal kurz nachfragen. Wenn ich die Arraygröße mitgebe bzw. weiß wie groß das Array ist, was müßte ich denn innerhalb der Funktion schreiben, damit ich das Array darin rekonstruieren könnte.
Mir ist klar, dass das absolut geschludert ist und ich werde das auch nicht weiterhin in meinem Code verwenden. Ich will meinen Code nur einmal mit dieser Art debuggen. Warum?
Ich habe unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-234399-and-highlight-is-.html ein Problem geschildert und will natürlich nun auch weiterhin versuchen das Problem zu lösen.Außerdem sollte man ja auch wissen was quick and dirty Programmierung ist, damit man sie vermeiden kann.
Grüße
Daimonion
-
Wenn ich richtig verstanden habe, was du machen willst (nur mit dem übergebenen Array arbeiten), dann brauchst du gar nicht zu casten (bzw. "rekonstruieren"), man kann Zeiger (jedenfalls in deinem Kontext gerade) wie Arrays ansprechen:
void fname(unsigned char *pbuf, size_t size) { for(size_t i = 0; i < size; ++i) { //Beispiel, ist nichts sinnvolles pbuf[i] = static_cast<unsigned char>(i % size); } }
Felix
-
Die Grösse ist ja zur Kompilierzeit bekannt, also kannst du die auch in der Funktion benutzen..
-
Jap, die Größe ist in der Tat bekannt. Daher auch meine Frage nach dem wie. Wurde mir aber auch mehr oder weniger schon beantwortet.