Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » "char"-array einen Wert zuweisen!?!?

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 <
010
27.09.2002, 15:22 Uhr
sic



Aha.Funktionieren tut es jetzt.Aber was macht das?Und was kann man mit der string.h noch anfangen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
27.09.2002, 15:35 Uhr
fry_




Zitat:

Was bedeutet das "std::"?


Stammt vom Dimah, aus einem anderen Forum:


Zitat:

C++:
F: Was ist falsch bzw. unschön an den Code?

#include <iostream.h>
#include <time.h>
void main()
{
     cout << "Hallo, World!" << "\n";
}
Seid den C++ Standard hat sich einiges verändert, leider sind die meisten Bücher noch nicht auf den aktuellen Stand.
Hiermit versuche ich dies Lücke zu füllen/korrigieren.
Nr. 1
#include <iostream.h>

Seid den C++ Standard haben die C++ Header kein .h Endung und der Inhalt der Header befinden sich im namespace std.
Näheres zu den Änderungen:
<iostream.h> oder <iostream>
Zum Themen namespaces:
#include <iostream>
using namespace std;
int main()
{
    cout << "Hallo, World!" << "\n";
}
// oder
#include <iostream>
int main()
{
    std::cout << "Hallo, World!" << "\n";
    // oder
    using std::cout;
    cout << "Hallo, World!" << "\n";
    cout << "Hallo, World!" << "\n";
}

Namespaces
using-Direktive (using namespace std; )
using-Deklaration (using std::cout; )
Nr. 2
#include <time.h>

Mit den C++ Standard bekamen wir auch neue C-Header die sich auch im namespace std befinden.
Damit es zu keinen Konflikten mit alten Code kommt, wurden die Namen überarbeitet das .h fällt weg und vorne kommt ein c hinzu.
#include <ctime>

Wenn es kein triftigen gegen Grund gibt, sollten die neuen C-Header bevorzugt werden.
Leider hält sich die STL-Distribution der MS VC++ und nicht 100% an den Standard.
Wenn ihr den MS VC++ benutzt und portablen Code schreiben wollt lege ich euch diesen Thread an Hertz C Library nicht im namespace std
Nr. 3
void main() {}

Für den C++ Standard und C99 Standard gibt es kein 'void main()'. Es mag sein das euer Compiler der alten Zeiten zuliebe 'void main()' erlaubt d.h. aber das ist nicht portabel und sicher.
int main() oder void main()?
Was ist falsch an void main() { /* ... */ } bzw. main() { /* ... */ }?
Nr.4 (gehört nicht zu den häufigen)
int main()
{
     //
     return true;
}

main gibt ein int zurück, true ist ein boolischer Ausdruck, passt irgen wie nicht zusammen. Außerdem soll main eine 0 zurück geben wenn das Programm Ordnungsmäßig beendet wurde, alles andre ungleich 0 symbolisiert ein fehler.
True kann implizit (automatisch) zu ein int konvertiert werden, dabei wird true zu 1, man symbolisiert den Aufrufer also ein Fehler obwohl alles ok war.
Ps. Der Standard erlaubt einen das 'return 0;' wegzulassen, der Compiler setzt implizit ein 'return 0;'.

Der Thread ist dann wieder für die FAQ bestimmt, da ich zu faul bin jedes mal die links raus zu suchen
Kritik, Änderung, wünsche?



Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 27.09.2002 um 15:38 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
27.09.2002, 16:06 Uhr
virtual
Sexiest Bit alive
(Operator)


@deadbeef

Ich weiss nicht, woher Du die Annahme nimmst, dass da irgendwas mit anderen Applicationen, IPC oder ähnlichem eine Rolle spielen sollte.
Das char a[6] liegt ganz einfach auf dem Stack, da haben auch andere Programme nix verloren (ein Zugriff darauf würde unter Windows eine Schutzverkletzung auslösen, wenn wir mal davon ausgehen, dass Windows >= 95 gemeint ist).

Wenn wir auf a[6] Zugreifen, greifen wir also entweder im Stack auf unseren Eigenen Speicherbereich zu und zerschiessen den Stackframe oder andere lokal gehaltene Variablen/Informationen oder aber - falls der stack tatsächlich da zu Ende ist - wir greifen irgendwohin, was eine Ausnahme zur folge hätte.

Im Vorliegenden Fall ist vermutlich ersteres der Fall, dabei wird sich der Fehler entweder niemals zeigen (a[6] koennte an einem Padding byte zwischen den Variablen liegen), sehr verzögert (wenn man auf die Variable zugreift, zu der eigentlich der Speicher von a+6 gehört) oder sonst was.
--
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
013
27.09.2002, 16:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Hier nochmal ein Schätzchen aus der Kategorie "Liebe-Kinder-Bitte-Nicht-Nachmachen":

a und b sind jeweils 8 Byte lang. Mit der Schleife und dem a[15]=0 schreiben wir allerdings 16 Byte. Wie man ggf. sieht, wird in den Speicherbereich von b geschrieben. Natürlich grottenschlecht und vielliecht auch nur mit meinem gcc, meinem Linux und nur hier in Bonn möglich: das Verahlten ist prinzipiell undefiniert.


C++:
#include <iostream>

int main()
{
    char b[8] = "0123456";
    char a[8] = "0123456";

    for(int i=0; i<15; i++)
    {
        a[ i ] = 'a'+i;
    }
    a[15] = 0;

    std::cout << a << std::endl;
    std::cout << b << std::endl;
}


--
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
014
27.09.2002, 17:16 Uhr
fry_



, interessant! Läuft bei mir sogar auch.
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 27.09.2002 um 17:20 Uhr von fry_ editiert.
 
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: