none
char Array RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem zu verstehen was für einen Inhalt mein char Array hat.

    Ich definiere es hier in der Header:

    class CNetwork{
    
    public:
    	char recvBuff[256];
    }


    und initialisiere es hier:

    void CNetwork::Methode1(void){
    	
    	char recvBuff = NULL;
    }

    nun bekomme ich in diesem Beispielaufruf:

    UINT WatchData(LPVOID pParam){
    	CNetwork *cNetwork;
    	cNetwork = (CNetwork *)pParam;
    
    	if (cNetwork->bla == 1234) cNetwork->bla = cNetwork->recvBuff[0];
    }

    diese Werte in recvBuff:

    Warum ist es nicht mer auf '\0'?

    MfG

    Donnerstag, 5. März 2015 09:56

Antworten

  • Hallo,

    mir scheint, dass du eigentlich garnichts initialisierst. Die Varaible in Methode1 ist eine ganz andere als in der Klasse selbst. Vergleich auch: char recvBuff vs. char revcBuff[256]

    Du weist den Wert NULL zu etwas zu, was später sowieso entfernt wird (aus dem Stack).

    Wenn du recvBuff[256] zuweisen möchtest, muss es wie folgt heißen:

    void CNetwork::Methode1(void){ //Per Schleife durchitterieren ist auch möglich!

    for(i=1; i < 256; i++) { this->recvBuff[i] = ’\0’; //Oder NULL }

    }



    © 2015 Thomas Roskop

    Germany // Deutschland

    • Als Antwort markiert cybertronicx Donnerstag, 5. März 2015 10:20
    Donnerstag, 5. März 2015 10:05

Alle Antworten

  • Hallo,

    mir scheint, dass du eigentlich garnichts initialisierst. Die Varaible in Methode1 ist eine ganz andere als in der Klasse selbst. Vergleich auch: char recvBuff vs. char revcBuff[256]

    Du weist den Wert NULL zu etwas zu, was später sowieso entfernt wird (aus dem Stack).

    Wenn du recvBuff[256] zuweisen möchtest, muss es wie folgt heißen:

    void CNetwork::Methode1(void){ //Per Schleife durchitterieren ist auch möglich!

    for(i=1; i < 256; i++) { this->recvBuff[i] = ’\0’; //Oder NULL }

    }



    © 2015 Thomas Roskop

    Germany // Deutschland

    • Als Antwort markiert cybertronicx Donnerstag, 5. März 2015 10:20
    Donnerstag, 5. März 2015 10:05
  • Ah ja das klappt, verstehe auch was du meinst aber wiso kann ich nicht zb sowas machen:

    recvBuff = NULL;

    Also ohne this und ohne Stellenangabe des Arrays?

    Der sagt mir nämlich Muss ein lvalue sein.

    MfG

    Donnerstag, 5. März 2015 10:20
  • NULL ist einfach als die Zahl 0 definiert, was den Speicherbereich leerräumt.

    Nur ist es bei einem solchen Array nicht so, dass du einfach den gesamten Bereich überschrieben kannst.

    PS: auf das "this->" kannst du (in meinen Lösungsvorschlag) verzichten, wenn du keine gleichnamige andere Variable dazwischen definiert hast.

    Was eine alternative Lösung zur Iteration wäre, wäre meines Wissen nach memset


    © 2015 Thomas Roskop

    Germany // Deutschland

    Donnerstag, 5. März 2015 10:37
  • Hallo,

    um das Zeichen Array zu initialisieren siehe:

    http://stackoverflow.com/questions/3134458/how-to-initialize-a-char-array

    Beachte auch die Alternativen wie einen vector<char> oder string, wenn Du C++ programmieren willst.

    Gruß Elmar

    Donnerstag, 5. März 2015 11:35
  • Hallo

    Du legst in der Methode CNetwork::Methode1 eine neue Variable namens recvBuff vom Typ char an und initialsierst die auf 0. Das hat nichts mit der Klassenmembervariable recvBuff zu tun.

    Außerdem ist die Klassenmembervariable ja ursprünglich als Feld von 256 Elementen definiert worden. Es wird aber in der Folge recvBuff als ZEIGER auf das erste Element gehandelt. Du kannst daher zwar sagen:

    recvBuff[7] = 23;

    aber mit der Anweisung

    recvBuff = NULL;

    würdest Du dafür sorgen, dass fortan alle Zugriffe auf recvBuff im Nirvana enden, weil nun der Zeiger ja auf die absolute Speicheradresse NULL zeigen würde, daher also die Anweisung

    recvBuff[7] = 23;

    nicht das 7te Byte des ursprünglich deklarierten Feldes bezeichnet, sondern die absolute Speicheradresse 7.

    Die Initialisierung muss so erfolgen:

    for (int i = 0; i < 256; i++) recvBuff[i] = 0;

    oder schneller (das geht aber nur mit Typ "char" so)

    memset(recvBuff,0,256);

    Grüße

    FireHeart

    Montag, 23. März 2015 08:04