dynamische Speicherreservierung / Zeiger/Referenzen zurückgeben



  • Ich versuche gerade mit API ein Gerät anzusteuern und mit Ihm zu kommunizieren.
    Ich würde gerne den Array data allozieren und dann die Daten, die ich über Recieve bekomme, in data haben. Ich habe folgendes Codebeispiel im Netz gefunden , nur leider funktioniert das nicht bei mir. Vielleicht habt Ihr ja eine Idee?

    Es geht um die folgendes Beispiel:

    #include <iostream>
        using namespace std;
    
        void foo(int value, int* buffer)
        {
          buffer[0]=value;
          buffer[1]=-value;
        }
    
        int main()
        {
          int* p=new int[2];
          foo(7, p);
          cout<<p[0]<<'\n'<<p[1]<<'\n';
          delete [] p;
        }
    

    das ganze hab ich versucht nach zu machen. die Größe des Arrays data ist komischerweise immer 4, ich hätte 100 gedacht. Weiß jemand, was ich da falsch mache?

    main...{
    	...
    	char *data = new char[100];
    	cout<<"groesse von array data: "<< sizeof(data)/sizeof(data[0])<<"\n";///sizeof(data[0])
    
    	DWORD dwBytesRead = 0;
    	dwBytesRead = comport.Receive(data, max_datasize);
    	...
    	}
    
      	//Prototype von Recieve
    	unsigned long Receive(char *buffer, DWORD maxsize);
    

    Danke jower



  • sizeof () ergibt, auf einen Zeiger angewendet, die Größe des Zeigers, und das sind auf 32-Bit-Systemen normalerweise 4 Bytes. Mit dem sizeof-Operator kannst du nur die Größe von Arrays auf dem Stack herausfinden; für dynamisch allozierte Arrays mußt du sie dir merken (oder std::vector verwenden).

    Moritz



  • Danke, hast recht.

    Das eigentliche Problem ist nur, dass der Zeiger buffer in der Methode Recieve im Debugger unter VS .net als "Bad Ptr" angezeigt wird. scheint also irgendwie an der Übergabe zu liegen, oder?

    der Hintergrund ist folgender, zuerst hab ich eine Klasse geschrieben, die die Kommunikation mit dem Comport regelt.
    Nun möchte ich eine weitere Klasse erzeugen, die sich um die Daten kümmert, also Verstehen, Interpretieren, usw. . Die Daten würde ich dazu gerne auf den Heap legen, da teilweise viele Daten anfallen können.
    Wenn ich das Ganze mit einem fixen Array mache, klappts prima, nur wenn ich anfange, dass über Daten im Heap zu machen, funktioniert es nicht.
    Ich stell mal die beiden Codeschnipsel zusammen.

    char data[200] = {0}; 
    dwBytesRead = comport.Receive(data, 200);
    

    das funktioniert prima.

    das hier aber leider nicht:

    char *data = new char[200];
    dwBytesRead = comport.Receive(data, 200);
    

    Hat jemand von euch einen Tipp? Wäre sehr dankbar.


Anmelden zum Antworten