Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

11

31.12.2005, 18:57

Draculark

C-/C++-Quelltext

1
2
3
4
*value++;  // ist das selbe wie

*(value++); // Referenzinkrementierung!


(*value)++; // Werteinkrementierung.


Merke: Bei Pointern IMMER Klammern benutzen! Die werden anders interpretiert.

Hättest Du beim 1. dann noch auf den Speicher zugegriffen hätte es kräftigst knallen können.

12

31.12.2005, 19:08

achso, also wenn ich den pointer "wert" erhöhen will muss ich
(*pPointer)++ schreiben?


das stand aber nirgends im buch afaik :)

Anonymous

unregistriert

13

31.12.2005, 19:12

Draculark
Genau um einen Wert zu erhöhen musst Du als 1. Auf den Wert zugreifen und dann inkrementieren.

Ja das steht in wenigen Büchern, das wird oft auf die "leichte Schulter" genommen, aber dann wird geheult wenns knallt.

Auch bei ein und ausgaben von Werten alá

C-/C++-Quelltext

1
2
std::cin >> *value << std::endl;
std::cout << *value << std::endl;

IMMER klammern!

Denn sowas hier kann schnell ohne klammern knallen:

C-/C++-Quelltext

1
std::cout << *value++ * *value + 3 << std::endl;

Viele Compilierer kompilieren das nicht mal mehr weil es zu mehrdeutig ist! Manche tun es dann aber doch (Je nach Secure Option) und dann wird sich gewundert wieso es knallt.

Merke: Klammern bei Pointern immer setzen!

14

31.12.2005, 20:03

so gleich noch ne frage dann bin ich eh weg :)

gutes neues jahr dann @ all hier :D

ich möchte gerne, dass ein spieler dem helen einen namen geben kann.

das funktioniert atm auch problemlos :D

char chName[30];
name eingeben
cin ignore
cin get name
blablabla

name wird dann eingespeichert und kann ausgegeben werden.

so jetzt das problem. wenn ich ejtzt den namen in ne andere funktion übernehmen möchte funktioniert das irgendwie nicht.

ich hab dazu ne globale struktur erstellt struct s_Heroattributes
dort gibts ne variable char chName[30]


iun der funktion wo der name eingegeben wird steht dann.

s_Heroattributes Hero;
Hero.chName[30] = chName[30];

dann wird die herostruktur an die questfunktion übergeben und dann sollte folgendes dastehen.


cout << "" Hero.chName << ":\"Hallo!\"" << endl;

der name steht leider nicht da:D

hab auch probiert mittels sprintf nen string zu erstellen, aber das geht irgendwie mit der übernommen chararray auch nicht :(

also wenn mir einer ne "namensübergabe" möglichkeit posten würde wäre das ja GAAAnz nett :)

Anonymous

unregistriert

15

31.12.2005, 20:05

Könntest Du Deine Frage etwas genauer stellen? Ich habe keine Ahnung was Du meinst :help:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

31.12.2005, 20:27

Zitat

Hero.chName[30] = chName[30]


is nicht so ideal.
wenn ich deine erklärung richtig verstanden hab, gibts chName nichtmehr wenn die funktion beendet und Hero.chName zeigt ins nirvana (weil array == zeiger).

mach sowas in der art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
int i = 0;

while( chName[i] != 0 )
{
    Hero.chName[i] = chName[i];
    ++i;
}

Hero.chName[i] = 0;


oder nimm einfach strcpy(), kommt aufs gleiche...

Anonymous

unregistriert

17

31.12.2005, 20:38

dot
Na na na, wer geht denn da so ugly dran? :D

Wenn man weiß, das beide Arrays die gleiche größe haben, kann man folgendes machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>

template<typename T> inline void copy (T* left, const T* right)
{ while ((*left++) = (*right++)); }

int main (void)
{
    wchar_t value1[5] = L"test"; // +1 Wegen Nullterminierung!!!

    wchar_t value2[5];

    copy (value2, value1);

    std::wcout << value1 << std::endl;
    std::wcout << value2 << std::endl;

    std::wcin.get ();

    return 0;
}

2 Zeilen fertig ;)

edit: Achja, hier sieht man wo Pointerinkrementierung nützlich sein kann ;)

edit2: oder wenn man sicher sein will, das man nicht auf ungültigen speicher trifft:

C-/C++-Quelltext

1
2
template<typename T> inline void copy (T* left, unsigned long size, const T* right)
{ while (((*left++) = (*right++)) && (size > 1)) --size; }


size ist die Größe des Zielspeichers.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

18

31.12.2005, 20:50

hmm naja ich weiß nicht... ich würds mit strcpy() probiern... ^^

C-/C++-Quelltext

1
strcpy((char*)(Hero.chName), (char*)(chName));
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Sicaine

unregistriert

19

31.12.2005, 20:54

Ich checks ned. patrick wo is das geheimnis dass er die while beendet? Zuweisungen sind immer true.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

31.12.2005, 20:59

die while beendet, sobald *left == 0 ist...

Werbeanzeige