Frage

Ich bin mit Qt Creator 4.5 mit GCC 4.3 und ich habe folgendes Problem, dass ich nicht sicher bin, ist Qt oder C ++ bezogen werden: I eine Funktion mit einer char * als Eingabeparameter bezeichnen. Innerhalb dieser Funktion mache ich eine dynamische Zuordnung und ich ordnen Sie die Adresse an den char *. Das Problem ist, wenn die Funktion gibt es nicht mehr an diese Adresse nicht zeigen.

bool FPSengine::putData (char CommandByte , int Index)
{
  char *msgByte;
  structSize=putDatagrams(CommandByte, Index, msgByte);
}

int FPSengine::putDatagrams (char CommandByte, int Index, char *msgByte)
{
  int theSize;

  switch ( CommandByte ) {

    case (CHANGE_CONFIGURATION): {
      theSize=sizeof(MsnConfigType);
      msgByte=new char[theSize];

      union MConfigUnion {
        char cByte[sizeof(MsnConfigType)];
        MsnConfigType m;
      };

      MConfigUnion * msnConfig=(MConfigUnion*)msgByte;

      ...Do some assignments. I verify and everything is OK.
    }
  }
  return theSize;
}

Wenn ich den Zeiger zurückgeben enthält es eine ganz andere Adresse als die in putDatagrams() zugeordnet. Warum?
...

Ok thx ich meinen Fehler (Anfängerfehler :() zu verstehen. Wenn ein Zeiger als Eingabeparameter an die Funktion Senden Sie die Adresse Ihrer Daten senden, aber nicht die Adresse des Zeigers, so dass Sie den Zeiger Punkt irgendwo machen können nicht anders ... es ist eigentlich eine lokale Kopie wie Index der einzige Fall, dass die Daten erfolgreich mit der Verwendung eines char * zurück von worden wäre durch den Speicher vor dem Funktionsaufruf Zuweisung:.

bool FPSengine::putData (char CommandByte , int Index)
{
  char *msgByte;
  msgByte=new char[sizeof(MsnConfigType)];
  structSize=putDatagrams(CommandByte, Index, msgByte);
}

int FPSengine::putDatagrams (char CommandByte, int Index, char *msgByte)
{
  int theSize;

  switch ( CommandByte ) {

    case (CHANGE_CONFIGURATION): {
      theSize=sizeof(MsnConfigType);

      union MConfigUnion {
        char cByte[sizeof(MsnConfigType)];
        MsnConfigType m;
      };

      MConfigUnion * msnConfig=(MConfigUnion*)msgByte;

      ...Do some assignments. I verify and everything is OK.
    }
  }
  return theSize;
}
War es hilfreich?

Lösung

Es gibt zwei Möglichkeiten. Die Pass-by-Wert Art und Weise (C-Stil):

int FPSengine::putDatagrams (char CommandByte, int Index, char **msgByte)

Beachten Sie den zweiten * für msgByte. Dann innerhalb von putDatagrams(), tun:

*msgByte = new char[theSize]; 

In der Tat, überall in dieser Funktion, wo Sie sich gerade msgByte haben, verwenden Sie *msgByte. Wenn putDatagrams() Aufruf tun:

structSize=putDatagrams(CommandByte, Index, &msgByte);

Und der zweite Weg, da man in C ++ ist, können Sie Pass-by-Referenz verwenden. Ändern Sie einfach die Unterschrift von putDatagrams() an:

int FPSengine::putDatagrams (char CommandByte, int Index, char * &msgByte)

Und Sie sollten gut sein. In diesem Fall sollten Sie den Anrufer nicht oder irgendetwas in Ihrer putDatagrams() Routine ändern müssen.

Andere Tipps

Nun, ja. Alles in C ++ wird standardmäßig als Wert übergeben. Parameter im Aufruf putDatagrams(a, b, c) werden von Wert gesendet - Sie würden nicht erwarten, dass die Zuordnung im Code index den Wert von b an der Aufrufstelle zu ändern. Ihre msgByte=new char[theSize]; ist die Zuordnung nur auf die lokale Variable msgByte, den Wert übergebenen überschrieben wird.

Wenn Sie einen solchen übergebenen Parameter ändern, dass die Aufrufort Variable ändert, werden Sie brauchen entweder durch Verweis übergeben, oder (in diesem Fall) übergeben Sie einen „Zeiger auf eine pointer` (und Ehrerbietung den ersten Zeiger weg , den eigentlichen Zeiger zuweisen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top