PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fragen eines c++ anfaengers



felix_do
07-08-2003, 11:37
hallo,

ich versuche c++ zu lernen. dabei hat mich gleich auf den ersten seiten meiner literatur folgendes ueberrascht:

"c++ kontrolliert feldgrenzen nicht!"

ok. was opassiert nun wenn ich so den speicher volllaufen lasse? ich wuerds gern mal testen, nur sag mir einer vorher bitte ob das zu irreparablen schaeden / datenverlust ... / systemabsturz fuehren kann?

meine zweite frage ist:

eine übungsaufgabe war: erstellen sie eine headerdatei mit einigen funktionsprototypen. erstellen sie eine cpp datei, die diese funktionen definiert. erstellen sie nun eine cpp datei, die auf die funktionen der headerdatei zugreift.
im prinzip soll man also eine kleine funktionsbibliothek erstellen.

kann mir jemand eine kleine musterlösung geben? bei mir meldet der kompiler immer irgendwelche fehler...

herzlichen dank fuer die antworten.
felix.

tuxipuxi
07-08-2003, 11:49
hi,


zum beispiel:

main.cpp:


#include "myFunctions.h"


int main( int argc, char* argv[] )
{

saySomething( "hello" );

}



myFunctions.h:



void saySomething( const char* );



myFunctions.cpp:



#include <iostream>
using namespace std;

#include "myFunctions.h"

void saySomething( const char* a ) {

cout<<a<<endl;

}



dieses beispiel macht natuerlich nicht viel sinn weil du es auch in die main.cpp packen koenntest, aber zeigt wie du deklaration und implementation trennst. wenn du bei den OOP kapiteln angelangt bist siehst du sinnvolle beispiele.

gruss,

tuxipuxi.

edit:

zu den feldgrenzen:




int myArray[3] = { 1,2,3 };
myArray[15] = 3412;



das merkt der compiler nicht und laesst dich einfach machen, das meint der autor wohl mit feldgrenzen pruefen. es fuehrt NICHT zu datenverlust oder irreparablen schaeden, systemabstuerze sollte es nicht geben.

felix_do
07-08-2003, 12:22
danke fuer die antwort.

anda_skoa
07-08-2003, 14:39
Original geschrieben von felix_do
ich versuche c++ zu lernen. dabei hat mich gleich auf den ersten seiten meiner literatur folgendes ueberrascht:

"c++ kontrolliert feldgrenzen nicht!"


Wäre extrem nachteilig für die Performance.



ok. was opassiert nun wenn ich so den speicher volllaufen lasse? ich wuerds gern mal testen, nur sag mir einer vorher bitte ob das zu irreparablen schaeden / datenverlust ... / systemabsturz fuehren kann?


Volllaufen lassen kannst du nur den Speicher, der deinem Programm zugeteilt wurde, d.h. von diesem angefordert wurde.
Sobald du versuchst, auf einen Speicher zuzugreifen, der dir nicht gehört, wird der Kernel dein Programm mit einem Speicherzugriffsfehler beenden.

Ciao,
_

Lin728
07-08-2003, 18:57
@anda_skoa:

Hmm, meinst du wirklich, das Bounds-Checking so viel Zeit kostet, kannst du mir vieleicht ein paar Zahlen geben? Kennst du irgendwelche Test-Implementierungen oder Compilier für C++ die das können?
Mich würde das echt interressieren....

Hmm, bei GCJ kann man bounds-checking auch ausschalten, um die Performance zu erhöhen....

Servus

anda_skoa
07-08-2003, 19:26
Original geschrieben von ceisserer
Hmm, meinst du wirklich, das Bounds-Checking so viel Zeit kostet, kannst du mir vieleicht ein paar Zahlen geben?


Hab da leider keine Zahlen, aber überlegen wir uns mal, wie sowas aussieht.
Eine Arrayaddressierung von vielen Prozessoren direkt gemacht werden, also in einem Befehl integiert. Kosten also ca 1 Befehl auf Assembler Ebene.

Wenn du jetzt den Zugriff prüfen willst, muss du
- Index laden
- untere grenze laden
- vergleich
- obere grenze laden
- vergleichen
- zugriff

Vergleiche bedeuten auch mögliches Branching, also Abzweigungen, was Probleme beim Befehlspipelining macht.
Der Prozessor könnte die Pipeline jeweils nach den Abfragen nit NO OPS füllen, weil er erst nachAusführung weiß, wo es weiter geht.


Ciao,
_

felix_do
10-08-2003, 14:09
Das prüfen kann man doch trivial so beschreiben wie du es oben getan hast.

Ich wuerde das nicht als extrem nachteilig fuer die Performance einstufen.

peschmae
10-08-2003, 16:13
natürlich mach die Indexprüfung allein bei einem Zugriff nicht viel aus

aber das muss ja immer gemacht werden - und wenn man dann noch all die anderen sachen prüft, die man noch prüfen kann, dann ist man schon bald einmal so langsam wie Java :(

MfG Peschmä

Nuke
10-08-2003, 21:47
Hi,

@tuxipuxi

Ich hätte zu deinem Beispiel noch ne Frage (oder mehr*gg*):

1. Wie compiliert man sowas? Reicht da auch einfach ein "g++ -o Programm Programm.cpp", oder muss das anders compiliert werden?

2. Wozu ist in diesem Beispiel die Header-Datei notwendig? Soweit ich sehe werden einfach nur die Funktionen in eine weitere ".cpp" ausgelagert. Dazu scheint das ja da zu sein! Nur wozu die Header-Datei? Muss die da sein, so zu sagen als "link zur .cpp", oder zu was ist die gut?

3. Wozu ist diese Zeile gut: "using namespace std"?

Danke!

Berufspenner
10-08-2003, 22:04
1. Wie compiliert man sowas? Reicht da auch einfach ein "g++ -o Programm Programm.cpp", oder muss das anders compiliert werden? g++ Programm.cpp -o Programm mit allen Datein in einem Verzeichnis sollte ausreichen.
2. Wozu ist in diesem Beispiel die Header-Datei notwendig? Soweit ich sehe werden einfach nur die Funktionen in eine weitere ".cpp" ausgelagert. Dazu scheint das ja da zu sein! Nur wozu die Header-Datei? Muss die da sein, so zu sagen als "link zur .cpp", oder zu was ist die gut? In dem Header wird ein Prototyp deklariert, in der zweiten .cpp Datei wird die Funktion definiert und in der Main-Datei wird das ganze dann benutzt.
3. Wozu ist diese Zeile gut: "using namespace std"?
http://userpage.fu-berlin.de/~ram/pub/pub_fmwefncsds/c++_namensraumdefinitionen_de

Cu
André

guardian
10-08-2003, 22:14
Original geschrieben von Nuke
1. Wie compiliert man sowas? Reicht da auch einfach ein "g++ -o Programm Programm.cpp", oder muss das anders compiliert werden?
Normalerweise reicht sowas schon aus. Wenn du jedoch mit getrennten Dateien (Implementations- und Definitionsdateien, also cpp-Dateien und h(pp)-Dateien) arbeitest, musst du oftmals die Headerdatei und die cpp-Datei vorher kompilieren, um dass sie richtig verwendet werden können. Dazu solltest du den Schalter -c benutzen. Er bewirkt, dass nur kompiliert wird, und nicht gelinkt. Übrigens solltest du noch den Schalter -Wall für eine höhere Vorsichtigkeit mit angeben :)



2. Wozu ist in diesem Beispiel die Header-Datei notwendig? Soweit ich sehe werden einfach nur die Funktionen in eine weitere ".cpp" ausgelagert. Dazu scheint das ja da zu sein! Nur wozu die Header-Datei? Muss die da sein, so zu sagen als "link zur .cpp", oder zu was ist die gut?
Hier in dem Beispiel ist nicht unbedingt notwendig. Aber bei größeren Programmen solltest du schon eigene Headerdateien verwenden :)

@tuxipuxi: schützt du deine Headerdateien etwa nicht vor mehrfacher Einbindung ?! :)



3. Wozu ist diese Zeile gut: "using namespace std"?
Das gibt an, dass du einen Namensraum verwenden willst. Hier den Namensraum std. Dazu schau am besten in deine Literatur unter Namensräume.

Kurzes Beispiel zum Namensraum std:

Wenn du diese Zeile weglässt, musst du normalerweise für ein sauberes C++-Programm std::cout ... (nicht nur bei cout so!!)schreiben. Wenn du diese Zeile einfügst, brauchst du das std:: nicht mehr mit hinschreiben, da du den Namensraum schon explizit mit angegeben hast.

tuxipuxi
11-08-2003, 13:21
@guardian:

selbstverstaendlich schuetze ich die headerdateien vor mehrfacher einbindung, aber ich wollte die verwendung von den direktiven nicht noch erklaeren.

@nuke:

die beiden dateien nutzt man zur trennung von deklaration/definition,
der user soll bei groesseren projekten( user im sinne von programmierer der die klasse nutzt ) immer die funktionen/klassen gleich benutzen koennen und der klassenentwickler kann intern noch aenderungen an der implementierung vornehmen ohne das der user gestoert wird.


gruss,

tuxipuxi.