Jetzt registrieren!
Passwort vergessen?



 
 
 
--------------- --------------- ---------------


noch ne c++ frage



Wenn man einen Pointer char* einstring[82]deklariert, kann man ihm dann sofort daten zuweisen, oder muss man ihm erst platz im speicher reservieren?
wenn man dann die funktion getc(einstring)benutzt, wird doch automatisch speicher reserviert, oder?
wenn ja, wird 82 Byte reserviert oder nur soviel, wieviel der eingegebene string
wirklich benoetigt?
> Artikelbaum anzeigen

Re: noch ne c++ frage


Wenn man einen Pointer char*
einstring[82]deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?
Du willst eine Zeichenkette mit 82 Zeichen haben? Dann schreibst du:
char einstring[83];
Bedenke, daß in C (und dieses verwendest Du hier!) die Zeichenketten durch ein \0 terminiert sind.
Du hast im obigen Beispiel ein Array (von 0 bis 81) von Pointer auf char definiert.
Wenn Du eine dynamische Zeichenkette haben willst, dann solltest Du folgendes verwenden:
--Schnipp---------------------
char *pEinString;
pEinString = new char[83];
...
cout << pEinString << endl;
...
delete[] pEinString;
--Schnapp---------------------
Merke: Wenn Du Pointer verwendest, so mußt Du immer Speicher für dafür mit new (oder unter C mit malloc) reservieren und diesen später immer durch delete wieder freigeben (C: free). new kann in den Konstruktor und delete in den Destruktor von Objekten.
wenn man dann die funktion
getc(einstring)benutzt, wird doch
automatisch speicher reserviert, oder?
Äh, da müßte ich jetzt in der Bibel (C++ von Bjarne Stroustrup (oder so ähnlich)) nachsehen.
wenn ja, wird 82 Byte reserviert oder nur
soviel, wieviel der eingegebene string
wirklich benoetigt?
Dann müßte die Funktion (Methode?) getc den Typ untersuchen. Dies ist aber meines Wissens in C++ nicht direkt vorgesehen (okay über RTTI wohl möglich).

Außerdem liest meiner Meinung nach die Funktion getc nur ein char und keine Zeichenkette. Insofern dürfte folgendes ausreichen.
--Schnipp---------------------
char cTemp;
...
getc(&cTemp);
...
--Schnapp---------------------
Da kann ich mich auch irren, da ich diese Funktion alle Himmeljahre mal brauch und dann immer wieder nachschauen muß.

MfG
Frank

Re: noch ne c++ frage


Wenn man einen Pointer char*
einstring[82]deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?
Du kannst zuweisen - jedoch max. 82 Zeichen. Bedenke, daß Strings in C mit \0 terminiert werden. Diese 0 mußt Du mit einberechnen
wenn man dann die funktion
getc(einstring)benutzt, wird doch
automatisch speicher reserviert, oder?
Nein, Du benötigst einen Buffer, der groß genug ist.
wenn ja, wird 82 Byte reserviert oder nur
soviel, wieviel der eingegebene string
wirklich benoetigt?
Bei Deinem Beispiel werden immer 82 Bytes reserviert.

Re: noch ne c++ frage


char* einstring[82]
Anleitung zum Lesen von C/C++ Deklarationen (Ausschnitt):

1. Suche den Identifier, lies ihn: "einstring"
2. Gucke nach rechts, ob da eine eckige Klammer ist, wenn ja lies "ein Array von" und die Zahl in den Klammern "82"
3. Wieder hole 2. bis keine eckigen Klammern mehr da sind. (im Beispiel sofort der Fall)
4. Gucke nach links, ob da ein Stern ist, wenn ja lies "Pointer auf"
5. Wiederhole 5. solange bis keine Sterne mehr da sind (im Beispiel sofort der Fall)
6. Gucke nach links, ob da ein Typ steht, lies ihn: "char".

Also:

'einstring' ist ein Array von 82 Pointer(n) auf 'char'.

Überrascht?
deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?
Das Array der Pointer ist da, du wolltest aber sicher:

char einstring[82];

Oder wie bei dir, dann aber noch Speicher für die Strings allokieren:

for ( int n = 0; n < 82; n++ )
einstring[n] = new char[ ... ];
wenn man dann die funktion
getc(einstring)benutzt, wird doch
automatisch speicher reserviert, oder?
Was soll das für eine Funktion sein? Ich kenne nur getc() ohne Parameter. Und die braucht keinen Speicher, ausser den char im Returnwert, der auf dem Stack transportiert wird.
wenn ja, wird 82 Byte reserviert oder nur
soviel, wieviel der eingegebene string
wirklich benoetigt?
Von den 82 Byte wird die Funktion auf keinen Fall etwas wissen.

Viel Erfolg wünscht
Michael

Re: noch ne c++ frage


Wenn man einen Pointer char*
einstring[82]deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?
wenn man dann die funktion
getc(einstring)benutzt, wird doch
automatisch speicher reserviert, oder?
wenn ja, wird 82 Byte reserviert oder nur
soviel, wieviel der eingegebene string
wirklich benoetigt?
Moin moin,

1. die Deklaration in der Form

char* :einstring[82] funktioniert nicht.

Wenn schon, dann

char einstring[82];
Es werden jetzt schon 82 Byte reserviert.

Ein anderer Fall liegt vor, wenn man
AnsiString einstriing

deklariert. Hier werden nur die Bytes reserviert, die wirklich gebraucht werden..


cu. Frank.

Re^2: noch ne c++ frage


Hi Frank!
Ein anderer Fall liegt vor, wenn man
AnsiString einstriing

deklariert. Hier werden nur die Bytes
reserviert, die wirklich gebraucht
werden..
Welcher Compiler hat solch einen Variablen-Typ?!? Mir ist in meinem ganzen Programmiererleben noch kein "AnsiString" vorgekommen. Es scheint sich daher (trotz des Namens) nicht um einen ANSI-Standard zu handeln...

Ciao,
Pürsti

Re^3: noch ne c++ frage


Hi Frank!
Ein anderer Fall liegt vor, wenn man
AnsiString einstriing

deklariert. Hier werden nur die Bytes
reserviert, die wirklich gebraucht
werden..
Welcher Compiler hat solch einen
Variablen-Typ?!? Mir ist in meinem ganzen
Programmiererleben noch kein "AnsiString"
vorgekommen. Es scheint sich daher (trotz
des Namens) nicht um einen ANSI-Standard
zu handeln...

Ciao,
Pürsti
Moin moin Josef,


da gibt´s ein Teil namens Borland C++ Builder, bei Microsaft heisst der Datentyp
eventuell einfach "String".


cu. Frank.

Re^4: noch ne c++ frage


Hi Frank!

Danke für die Aufklärung. Da ich weder Borland noch Microsoft benutze (sondern GNU) entgehen einem solche Datentypen. Aber man lernt eben nie aus.

Cu, Pürsti
da gibt´s ein Teil namens Borland C++
Builder, bei Microsaft heisst der
Datentyp
eventuell einfach "String".


cu. Frank.

Danke...


für die Antworten!
also wenn ich das jetzt richtig seh, kann man entweder einen String mit fester grösse erstellen - mit char einstr[zahl] - oder einen pointer mit char* einstr, dem man dann dynamisch platz zuweisen/wegnehmen kann, oder?

Du kannst auf diesen Artikel nicht antworten.

Dieser Artikelbaum ist im Archiv des Experten-Forums von wer-weiss-was zum Thema "Programmierung allgemein" archiviert. Es handelt sich um keine aktuelle Diskussion, daher kann auf die Artikel nicht mehr geantwortet werden.

Seite bei ... merken:
del.icio.us digg it facebook tausendreporter yigg it twitter alltagz google Mister Wong oneview Webnews yahoo linkarena coComment Lieblnk als Bookmark einfügen
Stelle deine Frage: