 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Falk Tannhäuser Guest
|
Posted: Mon Apr 18, 2005 8:29 am Post subject: Re: Parameterübergabe beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher wrote:
| Quote: | mich hätte interessiert, wie und ob die/eine Parameterübergabe beim
Aufruf eines Programms funktioniert.
|
#include <iostream>
#include <ostream>
int main(int argc, char** argv)
{
for(int i=0; i
std::cout << i << ": " << argv[i] << 'n';
return 0;
}
argc enthält die Anzahl der übergebenen Argumente,
argv zeigt auf das erste Element eines Arrays von
"char*"-Zeigern, welche wiederum auf die übergebenen
Argumente zeigen.
Ach ja, und argv[0] enthält (sofern das Betriebssystem
dies unterstützt) den Namen, mit welchem das Programm
aufgerufen wurde.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Mon Apr 18, 2005 8:36 am Post subject: Re: Parameterübergabe beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher wrote:
| Quote: |
Hi,
mich hätte interessiert, wie und ob die/eine Parameterübergabe beim
Aufruf eines Programms funktioniert.
Folgendes Programm hab ich versucht, was leider nicht funktionierte:
#include<iostream
#include
using namespace std;
int main(int d)
{
cout << endl << endl << d << endl;
|
Du brauchst nicht jedesmal endl zu nehmen. Das sendet ein 'n' an den Stream
und macht gleichzeitig einen Flush. Letzteren brauchst du zumindest die
ersten beiden Male nicht.
| Quote: | }
Kompiliert habe ich auf Linuxkonsole mit
g++ -o nnn ver.cpp
Das Programm mit ./nnn gestartet ohne Parameterangabe ergab eine
Ausgabe von 1 und mit Parameterangabe
also beispielsweise:
./nnn 35
ergab einfach eine 2. Also egal welchen Zahlenwert ich beim
Programmaufruf dem Programm mit auf den Weg gab, es wurde immer 2
ausgegeben, außer wenn ich eben keinen Parmater beim Start des
Programms eingab (alos blos mit ./nnn startete), dann wurde d als 1
ausgegeben.
Eigentlich "dachte" ich mir, dass man auf diese Weise Parameter an ein
Programm übergibt....aber da hab ich vermutlich fschla gedacht (oder
bin halt noch nicht soweit im Stoff fortgeschritten....egal).
Wie ist dieses "komische Verhalten" zu erklären?
|
Der erste Parameter von main ist die Anzahl übergebener
Kommandozeilenargumente + 1 (für den Programmnamen). Wenn du es ohne
Argumente startest, kommt deshalb 1 raus, wenn du eins angibst, 2. Bei zwei
Argumenten wäre es dann 3 gewesen.
| Quote: | Was muss ist tun (ändern), damit ich einem Programm bereits beim
Aufrufen von Komandozeile einen Parameter mit auf den Weg schicken
kann?
|
Du mußt main korrekt definieren
Die obige Definition ist eigentlich gar nicht zulässig. main() bekommt
entweder gar keine Parameter, oder zwei. Dein Programm müßte eher so
aussehen:
#include
#include <cstdlib>
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cerr << "Kommandozeilen-Argument fehlt!n";
return EXIT_FAILURE;
}
std::cout << "nn" << argv[1] << std::endl;
}
| Quote: | BTW: Welche unterschiede bestehen eigentlich zwischen dem g++ und dem
gcc....soweit ich das bisher "beurteilen" kann tun die das gleiche,
zumindest man g++ und man gcc zeigen die selben "Manualseiten".
|
Nein, sie tun nicht ganz das gleiche. gcc ist das allgemeine
Compiler-/Linker-Frontend. Es versucht, beim Compilieren anhand des
Dateinamen zu erkennen, in welcher Sprache dein Quellcode geschrieben ist
und verwendet dann den Compiler für die Sprache. g++ nimmt immer C++ an.
Beim Linken werden mit gcc nur die für C nötigen Bibliotheken gelinkt, mit
g++ auch die für C++.
| Quote: | Wenn ich schon mal über die man-Pages frag....
...so wundert (erschlägt mich förmlich) der Umfang der man-Page von
gcc mit ihren fast 8.000 Zeilen....
|
Sie enthält eben eine Liste sämtlicher Kommandozeilenparameter des Compiler
mit Beschreibung.
| Quote: | ....muß man sich wirklich mit diesem _ganzen_ Text auseinandersetzen,
und wenn Nein, wann und für wen ist der Text eigentlich relevant
(?)....oder sucht man sich aus dem Text nur jeweils die Optionen
heraus, die man evtl. gebrauchen könnte....
|
Genau.
| Quote: | und auf der anderen Seite, um überhaupt zu wissen, welchte Optionen der
Compiler überhaupt bietet muß man wohl doch den ganzen Text mehr oder
weniger lesen.....
|
Du kannst ja nach bestimmten Wörtern suchen. Außerdem ist die Seite in
verschiedene Arten von Optionen eingeteilt. Es ist nur so, daß sich kein
Mensch all die Optionen merken kann, und die meisten sie auch nie brauchen.
| Quote: | Vielleicht kann da mal jemand etwas Licht ins Dunkel bringen.
Ich find es schon fast jenseits aller Schmerzgrenzen, wenn der Text
auf dem "Beipackzettel" eines Compilers einen größeren Umfang einnimmt
als das Lehrbuch der betreffenden Computersprache.
|
Wenn dein Lehrbuch so kurz ist, dann kann es nicht viel taugen.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Apr 20, 2005 6:11 am Post subject: Re: Parameter?be beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher <2ohl......r (AT) web (DOT) de> writes:
| Quote: | cout << endl << endl << d << endl;
Du brauchst nicht jedesmal endl zu nehmen. Das sendet ein 'n' an
den Stream und macht gleichzeitig einen Flush.
Ähm...was versteht man unter einem Flush?
|
std::cout ist gepuffert.
std::cout << 'a' << 7 << " b";
wird nicht jedes Zeichen einzeln ans Betriebssystem weiterreichen,
denn das wäre im allgemeinen viel zu langsam.
Stattdessen wird das Resultat der Formatierung in einen Puffer
geschrieben und der Inhalt des Puffers ans Betriebssystem
weitergereicht, wenn der Puffer voll ist oder wenn der Programmcode
dies explizit so verlangt. Die Operation des Weiterreichens des
Inhalts eines Puffers an die nächste Instanz nennt man "flushing".
Der Manipulator std::endl ist so eine explizite Art, den Puffer eines
Streams zu flushen (nachdem zuerst ein 'n' eingefügt wird).
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Heinz Saathoff Guest
|
Posted: Wed Apr 20, 2005 7:19 am Post subject: Re: Parameter?be beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher schrieb...
| Quote: | int main(int d)
{
cout << endl << endl << d << endl;
Du brauchst nicht jedesmal endl zu nehmen. Das sendet ein 'n' an den Stream
und macht gleichzeitig einen Flush.
Ähm...was versteht man unter einem Flush?
|
Die Ausgaben werden normalerweise im Speicher aufbereitet und erscheinen
deshalb nicht sofort auf dem Bildschirm. Die wirkliche Ausgabe erfolgt,
wenn der interne Puffer voll ist. Bei endl wird nach dem 'n' noch ein
cout.flush() ausgeführt, was die Ausgabe erzwing. Dieses Erzwingen kann
zum Beispiel bei Fortschritsausgaben in langwierigen Berechnungen
sinnvoll sein, etwa so:
for(int i=0; i<1000; ++i) {
Tuwas(i); // dauert etwas
cout << '.'; // dem Benutzer anzeigen,
// dass wieder was fertig ist
cout.flush(); // damit der Benutze es auch zu sehen kriegt
}
Ohne das flush kann es passieren, dass Du lange wartest und dann auf
einmal die 1000 Punkte erscheinen.
- Heinz
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Thu Apr 21, 2005 6:34 pm Post subject: Re: Parameter?be beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher wrote:
| Quote: | Also wenn ich das richtig verstanden hab, dann erscheint sowohl nach
einem endl als auch nach einem 'n' ein Flush, bei dem die Daten vom
Puffer auf den Bildschirm [ersatzweise anderes Ausgabegerät] geschoben
werden.
|
Nen, "n" generiert eben kein explizites flush. Damit können sich die
Ausgaben ansammeln.
Mag sein, dass es "Zeilenpufferung" gibt (line buffered streams), die
bei jedem 'n' implizit ein flush generieren. Allerdings hängt es von
der Laufzeitumgebung ab, ob std::cout als solch ein Stream betrachtet
wird oder ob er komplett gepuffert wird. Windows betrachtet die
Standardausgabe meiner Programme z.B. auch als vollständig gepuffert,
wenn ich sie in einem Emacs-Shellbuffer oder in cygwin-rxvt ablaufen
lasse. Dort brauchst du explizite flush (bzw. eben endl), damit die
Zeilen einzeln ausgegeben werden und nicht erst gesammelt am Stück.
| Quote: | Frage: Ist ein endl eigentlich identisch mit einem 'n'?
|
Nein.
x << std::endl
ist identisch zu
x << 'n' << std::flush
| Quote: | Noch ne Frage: Wenn ich aus Übersichtsgrünen eine Zeilenfortschaltung
ohne einen Flush bewerkstelligen möchte - wie mache ich das?
(Vermute mal mit cout << 'x0A' << 'r'.)
|
std::cout << 'n';
Wenn die Bibliothek der Meinung ist, ein flush sei hier angebracht, tut
sie's halt, es stört ja nicht.
| Quote: | (Bei carriage return ('r') erfolgt ja wohl nur der "Wagenrücklauf",
jedoch keine Zeilenfortschaltung. Kann es sein, das sich Win und Linux
da anders verhalten?
|
Das braucht dich als C++-Programmierer erstmal nicht zu interessieren.
Wenn du ein 'n' ausgibst, landet schon das korrekte Steuerzeichen für
einen Zeilenvorschub in der Datei. Unter Windows ist das eben 0x0D 0x0A,
unter Unix 0x0A, und auf dem Mac 0x0D. Beim Einlesen wird dann daraus
auch wieder das Zeichen, welches in C++ als 'n' dargestellt wird.
Wenn du die Bytekombinationen selbst festlegen willst, musst du die
Datei im Binärmodus öffnen.
| Quote: | Beim Experimentieren mit Texten ist mir
aufgefallen, das Texte, die unter Win mit einem Editor erzeugt wurden
ein "[RETURN]" immer aus 0A 0D bestand. Bei einem Quelltext, den ich
auf einem Win-Rechner geschrieben hab, den ich dann anschließend auf
einen Linuxrechner verschoben hatte und dort mit einem Editor (mcedit)
geöffnet hatte, sah ich an jedem Zeilenenden noch ein ^M. Von daher
vermute ich mal das das "[RETURN]" bei Linux anders aussieht als bei
Win....
|
Das ist auch so. Die eigentlichen Bytekombinationen unterscheiden sich.
Ein C++-Programm unter Windows erstellt aber standardmäßig Dateien, die
den Windows-Konventionen entsprechen, ein C++-Programm unter Linux eben
welche für Linux. 'std::ofstream("foo") << 'n'' erstellt also unter
Windows eine Datei mit 2 Bytes, unter Linux eine mit einem Byte.
Aber ein Linux-Programm wie mcedit kann nun nicht hellsehen und wissen,
dass du eine Datei unter Windows erstellt hast, und wandelt sie daher
nicht automatisch um. Das musst du schon selbst erledigen.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Thu Apr 21, 2005 8:17 pm Post subject: Re: Parameter?be beim Aufruf eines Programmes? |
|
|
Ottmar Ohlemacher wrote:
| Quote: | (Bei carriage return ('r') erfolgt ja wohl nur der "Wagenrücklauf",
jedoch keine Zeilenfortschaltung. Kann es sein, das sich Win und Linux
da anders verhalten? Beim Experimentieren mit Texten ist mir
aufgefallen, das Texte, die unter Win mit einem Editor erzeugt wurden
ein "[RETURN]" immer aus 0A 0D bestand. Bei einem Quelltext, den ich
auf einem Win-Rechner geschrieben hab, den ich dann anschließend auf
einen Linuxrechner verschoben hatte und dort mit einem Editor (mcedit)
geöffnet hatte, sah ich an jedem Zeilenenden noch ein ^M. Von daher
vermute ich mal das das "[RETURN]" bei Linux anders aussieht als bei
Win....(hab jetzt gerade nicht Linux gebootet, werds mir aber bei
nächster Gelegenheit anschaun, fall ich auf meiner Linuxplatte
irgendwo einen Hexeditor herumfallen sollte (ich weiß das da bestimmt
einer mit dabei ist, nicht umsonst hab ich _alle_ Softwarepaktet
installiert, aber erst mal finden.....).
|
Wie schon andere erwähnt haben, unterscheiden sich die Zeilenenden
tatsächlich bei den verschiedenen Betriebssystemen. Manche
Transferprotokolle/Programme (wie z.B. ftp oder cvs) berücksichtigen das
und führen eine automatische Konvertierung durch, wenn man sie im
Textmodus verwendet.
Es gibt auch kleine Tools, mit denen man die Zeilenenden konvertieren kann.
Auch viele Texteditoren können das.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|