Pointer-Arithmetik

Kannst du mir evtl. erklären was an meinem Code falsch ist, und bitte ohne typedefs..

Ich versuch mal zu erklären was ich mir vorstelle:

main
C++:
int main()
{
  // Pointer auf ein char-Pointer:
  // &msg: 0x000001
  char **msg = new char*;
  *msg = NULL;

  // msg:  0x000002
  // *msg: 0x000000

  // ...
  // Übergabe an write
  obj.write(&msg);

  //..
  return 0;
}


write
C++:
int write (char*** message)
{
  // message:   0x000001
  // *message:  0x000002
  **message = new char[10];
  // **message: 0x000003 (neue Adresse auf 10 chars also 0x000003 bis 0x0000013)
 
Kannst du mir evtl. erklären was an meinem Code falsch ist, und bitte ohne typedefs..

Ich versuch mal zu erklären was ich mir vorstelle:
Evlt. solltest du mal sagen wo das hinführen soll. Was liefert denn getName(0) ? Ein einzelnes Zeichen?

Was soll den später in msg drin stehen?

msg[0] == "blah"
msg[1] == "blub"
.... ?

Gruß
 
msg ist dann eine Liste von cstrings.


msg[0] = "name0";
msg[1] = "name1";

...



getName() ist eine Funktion die mir ihre vorhandenen Namen liefert.
d.h. Strings die bereits im Speicher vorhanden sind, aber dessen Adressen ich brauche.
 
msg ist dann eine Liste von cstrings.


msg[0] = "name0";
msg[1] = "name1";

...



getName() ist eine Funktion die mir ihre vorhandenen Namen liefert.
d.h. Strings die bereits im Speicher vorhanden sind, aber dessen Adressen ich brauche.
Warum kannst du denn nicht einfach mal den Prototyp von getName() angeben? Was liefert denn getName() einen char* ? Wie sieht der Prototyp aus?

Gruß
 
ganz normaler char*
Intern ist das eine Liste von cstring.

C++:
char* getName() const
Aha. Warum willst du dann dafür nochmal Speicher reservieren? Du mußt doch dann nur die Adressen kopieren.

C++:
int write (char*** message) {
  *message = new char*[ m_names.size()];

  for (int i = 0; i < m_names.size(); ++i) {
    (*message)[i] = m_names.getName(i);
  }
  return m_names.size();
}

int main() {
  char** msg = 0;

  int anz = obj.write(&msg);

  for (int i = 0; i < anz; ++i) {
    std::cout << "msg" << i << ": " << msg[i] << '\n';
  }
}
Gruß
 
:D genau das mach ich doch, oder?

Jetz hab ich aber das Problem gefunden.. die Klammern!


C++:
class Object
{
private:

  char *name;
  int **ints;

public:

  int write (char*** message)
  {
    **message = new char[10];

    (*message)[0] = getName();
    (*message)[1] = getName();
    (*message)[2] = getName();

    return 0;
  }
};

was für ein Unterschied macht sich bemerkbar wenn ich stehn habe:

C++:
(*message)[0] = getName();

oder


C++:
*message[0] = getName();
 
:D genau das mach ich doch, oder?
Nein.

Du weißt doch erstmal gar nicht wieviel Nachrichten es gibt. Deswegen übergibst du ja die Adresse der Variablen aus main, damit in der Methode Speicher alloziert werden kann. (wobei das immer noch hauptsächlich geraten ist, weil du immer noch nicht genau gesagt hast was gegeben ist und wie die Anforderungen sind etc.)

Dann allozierst du immer nur ein Array der Größe 1 in main. Das ist dann natürlich nicht so sinnvoll.

Außerdem hast du dann für noch Speicher alloziert für einen einzelnen String und irgendwie Buchstaben kopiert? (was aber eigentlich gar nicht geht, da getName einen char* zurückliefert... :confused:

was für ein Unterschied macht sich bemerkbar wenn ich stehn habe:

C++:
(*message)[0] = getName();

oder


C++:
*message[0] = getName();
Diese Anweisungen sind äquivalent.
C++:
message[0] == *(message + 0)
Aber ansonsten hat der Indexoperator eine höhere Priorität.
C++:
(*message)[2] == *((*message) + 2)

*message[2] == *(*(message + 2))
Gruß
 
Zurück