Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problemchen mit char

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.06.2003, 01:41 Uhr
Pablo
Supertux
(Operator)


Hallo
ich hab eine Variable im globalen Bereich deklariert:


Code:
char SRAM[999][31]

Das muss ein SRAM simulieren, d.h. 1000 Zellen für 32 Bits pro Zelle.
Ich habe eine Funktion, die SRAM initialisiert. Wenn ich in dieser Funktion den Inhalt des Array wir folgt: cout ..... << SRAM[x] << ..., wobei x ist eine Zahl zwischen 0 und 999, erhalte ich:
SRAM[1] = 00000000000000000000000000000000
SRAM[2] = 00000000000000000000000011111111
SRAM[3] = 00000000000000000000000000000001
SRAM[4] = 10000000000000000000000000000101


wenn ich das selbe in einer Andere Funktion mache, wo ich SRAM nicht initialisert habe, dann passiert eine Katasthrope. Der Aufruf von SRAM[0] verurascht, dass alle Zellen (von SRAM[0..999] ausgegeben werden, also erhalte ich eine Ausgabe von 32000 Zeichen. Wenn ich SRAM[1] schreibe, dann nur von SRAM[1..999], also 31968 Zeichen, das ist doch bescheurt, weiß jemand wieso?
Es ist wie beim char* argv[], wenn man argv[0] per cout bzw. printf ausgibt, erhält man nicht alle Argumente.
Wie kann ich das lösen, oder wieso funktiniert nur in der ersten Funktion??? oder ist es, weil wenn ich bspweise Zelle 5 initialisiert habe, dann sind Zelle 6..99 leer und deshalb nur Zelle 5 ausgegeben. Ohhh, ich sehe, dass wenn ich ganz am Schluss der initSRAM() Funktion cout << SRAM[0] << endl; schreibe, dasselbe passiert. Ich will aber, dass es wie ebi argv[] funktiniert. Wie kann ich das machen?

Danke
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 22.06.2003 um 01:55 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.06.2003, 07:43 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Hallo
ich hab eine Variable im globalen Bereich deklariert:


Code:
char SRAM[999][31]

Das muss ein SRAM simulieren, d.h. 1000 Zellen für 32 Bits pro Zelle.


Hier simulierst Du aber nur ein SRAM mit 999 Zeilen und 31 Bits pro Zeile...
Möglicherweise erklärt das eine Reihe von Folgeproblemen. Folgende Deklaration

C++:
type variable[size];


Deklarariert ein Array namens variable (des Typs type), welches size Elemente enhält (nicht etwa size+1). Die Elemente werden von 0 bis size-1 durchgezählt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.06.2003, 13:23 Uhr
Pablo
Supertux
(Operator)


Ach so, das ist es eigentlich nür für char? Weil wenn ich ein int[31] mache, dann hab ich 32 Speicherplätze, ist das wegen '\0'

Aber wie kommt es eingetlich darauf, dass wenn ich SRAM[1] eingebe, dann werden die 998 restlichen Zellen auch ausgegeben? argv[1] gibt auch nicht alle Parameter zurück. Wie kann ich das lösen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.06.2003, 13:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Nein, du scheint da dir was falsch eingeprägt zu haben: ein int[31] Hat nur 31 Speicherplätze. Das mit den '\0' spielt nur bei Stringliteralen eine Rolle:

C++:
char str[] = "Hallo";


Belegt 6 chars (und nicht 5), weil das terminierende 0 Byte autom. angelegt wird.
Vermutlich wird bei Deinem problem auch der Rest ausgegeben, weil Du keine Terminierende 0 hast. Folgendes Beispiel mag damit verwandt sein:

C++:
int main()
{
   char text[3][5];
   strcpy(text[0], "Hallo");
   strcpy(text[1], "Pablo");

   printf("%s\n", text[0]); // Was erwartest Du als Ausgabe?
}


Obenstehendes Programm enthält einen bug, nämlich daß die terminierende Null überschrieben wird, weil der Autor (also ich ) nicht berücksichtigt hat, daß an den String noch die 0 dran gehangen wird.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.06.2003, 14:38 Uhr
Pablo
Supertux
(Operator)


Ach so, klar, ich hab nen Blackout gehabt. typ var[n] sagt nur wieviele Speicherplätze hat, und var[n-1] ist das letzte Element, ich hab die beiden Begriffe vertauscht, na ja, stimmt, ich weiß nicht warum, aber ich hab verschalfen!!!. Also könnte es sein, dass ich HalloPablo bekomme, weil '\0' nicht vorhanden ist? (ich hab den Code noch nicht ausprobiert) wenn die Ausgabe dann nur hallo sein soll, dann muss text[3][6] stehen, oder?

Danke für die Hilfe
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.06.2003, 14:40 Uhr
Pablo
Supertux
(Operator)


du bist genial, stimmt, wenn ich text[3][6] schreibe, dann bekomme ich nur hallo.
danke.
Also muss ich SRAM wie folgt deklarieren? char SRAM[1000][33]?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 22.06.2003 um 14:42 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.06.2003, 15:26 Uhr
LiLLy



Ja, alles richtig Pablo
Hm, ich komm damit irgendwie auch immer durcheinander, habe einfach nur mal spasseshalber vier Zeilen, anstatt nur 3 produziert... Komischerweise gibt er mir noch ne vierte Zeile aus
Also Beispiel:

#include <stdio.h>
int main()
{
char text[3][6];
strcpy(text[0], "Hallo");
strcpy(text[1], "Pablo");
strcpy(text[2], "Hallo");
strcpy(text[3], "Hallo");

printf("%s\n", text[0]); // Was erwartest Du als Ausgabe?
printf("%s\n", text[1]);
printf("%s\n", text[2]);
printf("%s\n", text[3]);
}

Wie ist sowas möglich?

Wird das Terminierungszeichen auch einfach überschrieben?

Dieser Post wurde am 22.06.2003 um 15:28 Uhr von LiLLy editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.06.2003, 15:38 Uhr
Pablo
Supertux
(Operator)


bei strcpy(text[3], "Hallo"); bin ich nicht sicher, es gibt kein 4 Element.

Ab die Ausgabe ist
Hallo
Pablo
Hallo
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 22.06.2003 um 15:40 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.06.2003, 15:42 Uhr
LiLLy



Ja hätte ich auch gedacht.. ;o(
Aber ausgeben tut er mir:
Hallo
Pablo
Hallo
Hallo



Dürfte ja eigentlich nicht sein.. Benutze als Compiler Dev c++
Richtig wäre nämlich Deine Version:
Hallo
Pablo
Hallo

Hat mich einfach nur gewundert..

Dieser Post wurde am 22.06.2003 um 15:43 Uhr von LiLLy editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.06.2003, 15:44 Uhr
Pablo
Supertux
(Operator)


Also, ich finde komisch, dass du bei strcpy(text[3], "Hallo"); keine Fehlermeldung bekommst.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: