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

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

1

23.03.2006, 22:33

Char Variable neu definieren

Hi Leute,
ich hab mal eine, vielleicht etwas dumme, Frage:

warum kann ich einer Char-Variable nicht auf folgende Weise einen Wert zuweisen:

C-/C++-Quelltext

1
2
3
char Name[32];

Name = "BlaBlupp";


Ich meine klar könnte man es so machen:

C-/C++-Quelltext

1
char Name[] = "BlaBlupp";


aber wenn ich den Name in einer Klasse als Membervariable hab, dann geht die zweite Möglichkeit ja wohl nicht!

Wie kann man mein probelm Lösen (abgesehen von strings)?

Danke schon mal

Gruß Stupidus
Erst wenn der letzte Baum gerodet,
der letzte Fluß vergiftet, der letzte Fisch getötet ist,
dann werden die Menschen feststellen,
dass man Geld nicht essen kann!

Sheddex

unregistriert

2

23.03.2006, 22:44

Falls du die '#include <string>'-Strings meinst die du nicht nehmen willst, fällt mir jetzt nur sprintf ein.

C-/C++-Quelltext

1
2
char Text[64];
sprintf (Text, "Hallo");

(Das ist allerdings veraltet und führt in Express zu Warnungen... Bevor mich nix da jetzt umbringt, kommt hier noch die 'neue Version'

C-/C++-Quelltext

1
2
char Text[64];
sprintf_s (Text, 64, "Hallo");

Keine Funktionsgarantie für's zweite, da ich es selbst noch nicht getestet habe ;)

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

3

23.03.2006, 22:47

k ich werd's ausprobieren ;) .

und danke für die schnelle antwort
Erst wenn der letzte Baum gerodet,
der letzte Fluß vergiftet, der letzte Fisch getötet ist,
dann werden die Menschen feststellen,
dass man Geld nicht essen kann!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

23.03.2006, 22:49

wcscpy ist auch eine Option. Warum es nicht geht? weil Array nunmal auf Zeigern basieren und man mit dem = nur den zeiger aber nicht den Inhalt verändern würde.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

5

24.03.2006, 00:43

Ich probier hier mal von den internen Aufbau eines Arrays auf die Pointer zu kommen, so (finde ich zumindest) ist das die beste und einleutendste Handhabung. Am Ende komme ich dann auf die Beantwortung des Problemes zurück.

Also hier ist der interne Aufbau eines Array an Speicherzellen:
In den Eckigen Klammern stehen die Werte, eine einzelne Zelle wird durch [] repräsentiert

Quellcode

1
2
    0x00         0x07
    [][][][][][][]


Das ist ein Array was von Adresse 0 bis 7 geht. Dazu sind die Adressen angegeben mit der man jedes einzelne Feld erreicht. In unserem Beispiel geht es von Adresse 0 bis 7. Was nun da drin steht, sei erstmal unwichtig.

Nun kommen wir zu der Bedeutung des Pointers. Unser Array kann ja nicht immer an Adresse 0 liegen, da wir erstens auch mehr als ein Array haben wollen und wir ja nicht nur ein Programm haben was läuft.... Wir haben ja auch noch Windows laufen, verschiedene Interrupts, die das OS verarbeitet, den Programmcode und so weiter... einfach gesagt es kann nicht immer an Adresse 0 liegen.
So kommen wir zu folgender Darstellung:

(Hinweis pArray zeigt nur auf das erste Element!)

Quellcode

1
2
           0x30         0x37
pArray -> [][][][][][][]


Die neu eingefügte Größe heist nun pArray. Diese soll uns den Beginn des Arrays zeigen. pArray ist also eine Adresse im Speicher. In unserem Beispiel ist diese 0x30h. Um die Zuweisung dieser Adresse soll sich jetzt aber das OS kümmern, wir haben was anderes vor :). Mit diesem Lösungsansatz ist es jetzt mgl. den Speicher mit Arrays vollzupumpen. Jedes könnten wir unterscheiden, da jedes eine Variable, genauer eine Adresse hat die wir kennen.

So, wir können jetzt unser Array folglich auch voll durchlaufen, wir haben den Anfang... also 0x30 und können diesen incrementieren... also ist folgender C++ Ausdruck gültig: ++pArray++;
pArray würde jetzt auf 0x32 zeigen.

Damit wir den Wert auch auslesen können, haben wir den tollen * Operator. Wir können also folglich alle Werte so auslesen: *(++pArray++) Sieht vllt. etwas kryptisch aus, ist aber vollkommen logisch... hier ein Beispiel:

C-/C++-Quelltext

1
2
3
4
for(unsigned i=0; i < 7;i++)
{
  printf("%d ", *(pArray + i));
}

Das funktioniert könnt ihr probieren, da aber das schreiben eines solchen Ausdruckes *(pArray + i) viel zu lang dauert, nimmt man kurzerhand pArray, was aber zu dem von uns SELBST ERMITTELTEM :D vollkommen kongruent ist. d.h.: *(pArray + i) = pArray[i]


Wenn wir also sagen:

Quellcode

1
2
char* pArray;
pArray = "Hallo";
ist das völliger Stuss. pArray ist ja der Anfang unseres Arrays, eine Adresse... und "Hallo" ist ja nun weiss Gott keine Adresse.... sondern ein WERT

Wieso funktioniert dann aber das?

Quellcode

1
char pArray[] = "Hallo";

Hmmn, wer Assembler kann dem wird gleich auffallen, das das ganz logisch ist, wie eigentlich alles :). Der String "Hallo" wird dann in sowas wie einem Datensegment gespeichert, wo alle Konstanden hinkommen. Wenn Hallo dort plaziert wird, haben wir auch eine Adresse die auf Hallo ziegt, und diese Adresse kopieren wir eigentlich mit diesem Schritt.

Und wie gibt uns nun das OS Speicher?
Man unterscheidet dynamischen (während der Laufzeit des Programmes allociierten Speicher) und statischen Speicher (der während des Startens bereits reserviert wird). Mit

C-/C++-Quelltext

1
new
können wir neuen Speicher Anfordern, der uns dann eine Adresse zurückgibt, die wir aber mit

C-/C++-Quelltext

1
delete
wieder freigeben müssen. Staisch machen wir das einfach so:

C-/C++-Quelltext

1
char pArray[56];
Unser Array ist so unveränderlich 56 char Einheiten groß.

strcpy bzw. wcscpy nehmen sich jetzt jede Array Zelle her und kopieren dort einen Byte [8Bit] (ANSI) oder Word [16Bit](UNICODE) Wert hinein.

Stupidus

Frischling

  • »Stupidus« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Heilbronn

Beruf: Schöler

  • Private Nachricht senden

6

24.03.2006, 13:51

aha. Also das war jetzt sehr aufschlussreich. Vielen dank für deine ausführliche Antwort, ich denk, dass dies mir sehr geholfen hat ;)

also dann probier ich's auf ein neues...

Sturpidus
Erst wenn der letzte Baum gerodet,
der letzte Fluß vergiftet, der letzte Fisch getötet ist,
dann werden die Menschen feststellen,
dass man Geld nicht essen kann!

Werbeanzeige