Guten Abend Leute,
ich hab da mal ne Frage zu C++. Wie kann ich einer procedure (welche NICHTS zurückliefern soll) Paramter zur Ausgabe übergeben? Beispiel: so siehts in pascal aus:
procedure ausgabe_fehler(text: string); begin WriteLn("was auch immer"); WriteLn("was auch immer: ", text); end;
{mainprog} var xyz: String; begin xyz:="inhalt der Meldung"; ausgabe_fehler(xyz); bzw.: per: ausgabe_fehler('inhalt der Meldung'); end.
mit void ausgabe_fehler(char text) { printf("was auch immer\n"); printf("was auch immer %c\n", text); }
definition char txt;
aufruf: txt="inhalt"; ausgabe(txt);
auch:
definition char txt[10]; aufruf: txt="inhalt"; ausgabe(txt);
funktioniert leider nicht.
Oder: wie kann ich variablen und constanten so definieren, das ich aus jeder procedure / functions darauf zugreifen kann ?
Was ich auch ganz toll vermisse, ist die definiton string (zeichenkette). Ist in C irgendwie mieß gemacht.
Ich danke Euch schon im voraus.
Gruß Tilo
-- Tilo Wetzel, Dresden http://www.elline.de Nachteil zu LINUX, zu den (animierten) Abstürzen kommst du nicht!
On Sun, Feb 25, 2001 at 07:06:45PM +0100, Tilo Wetzel wrote:
Guten Abend Leute,
ich hab da mal ne Frage zu C++. Wie kann ich einer procedure (welche NICHTS zurückliefern soll) Paramter zur Ausgabe übergeben? Beispiel: so siehts in pascal aus:
... void ausgabe_fehler(char text)
Strings uebergibst du mit "char*", sprich mit einem Pointer auf ein character-array.
{ printf("was auch immer\n"); printf("was auch immer %c\n", text);
%s fuer strings
Oder: wie kann ich variablen und constanten so definieren, das ich aus jeder procedure / functions darauf zugreifen kann ?
Einfach ausserhalb einer Funktion definieren, am bestem am Anfang des Programms.
Was ich auch ganz toll vermisse, ist die definiton string (zeichenkette). Ist in C irgendwie mieß gemacht.
Desshalb nimmt man auch Python, Perl oder aehnliches wenn man die Wahl hat.
On Sun, Feb 25, 2001 at 07:06:45PM +0100, Tilo Wetzel wrote:
Guten Abend Leute,
ich hab da mal ne Frage zu C++.
[...]
void ausgabe_fehler(char text) { printf("was auch immer\n"); printf("was auch immer %c\n", text); }
definition char txt;
aufruf: txt="inhalt"; ausgabe(txt);
auch:
definition char txt[10]; aufruf: txt="inhalt"; ausgabe(txt);
funktioniert leider nicht.
Wie schon Thomas Dubiel gesagt hat, du mußt char* verwenden. Kleine Hintergrund-Information dazu:
Wenn du einen Array definierst, z.B. mit
char my_array[100];
kannst du auf die einzelnen Elemente zugreifen mittels
my_array[0]; my_array[1];
etc. Gleichzeitig hat man aber auch automatisch mit "my_array" einen Zeiger auf das erste Element des Arrays. Man kann also statt
my_array[0]='a'; my_array[1]='b';
z.B. schreiben
*my_array = 'a'; *(my_array+1) = 'b';
(Das Sternchen dient zum Dereferenzieren). Aus diesem Grund übergibt man in der Regel den Zeiger.
Oder: wie kann ich variablen und constanten so definieren, das ich aus jeder procedure / functions darauf zugreifen kann ?
(Bitte erst zu Ende lesen, deine Frage beantworte ich zum Schluß)
Grundsätzlich kannst du Variablen überall deklarieren. Sie sind dann inerhalb des Blocks, in dem sie deklariert werden, gültig. Z.B. ergibt
{ int a=1; printf("%d\n", a); { int a=2; printf("%d\n", a); } printf("%d\n", a); }
als Ausgabe
1 2 1
Wenn du also eine globale Variable deklarieren willst, deklarierst du sie also einfach außerhalb eines Blocks. Wird sie dann überschattet, läuft das folgendermaßen ab:
------------------------------------------------------- #include <stdio.h>
int a = 5;
void main () { int a = 1; printf ("%d\n", a); //ergibt '1' als Ausgabe printf ("%d\n", ::a); //ergibt '5' als Ausgabe } -----------------------------------------------------
Alles klar?
Was ich auch ganz toll vermisse, ist die definiton string (zeichenkette). Ist in C irgendwie mieß gemacht.
Das hängt jetzt dvon ab, ob du C oder C++ benutzt. In C gibt es nur char-Pointer. In C++ gibt es sehr wohl eine String-Klasse, die sich glaub ich sogar eleganter handhaben läßt als die von Pascal (ich hab seit zwei Jahren nicht mehr Pascal programmiert, deswegen kann ich das nicht mit Bestimmtheit sagen). Kleines Testprog:
------------------------------------------- #include <string> #include <iostream.h>
void main() { string s = "Hello, World"; //;) cout <<s <<"\n"; } ---------------------------------------------
Na, ist _das_ nicht elegant? Informationen dazu gibt es unter /usr/doc/STL oder so ähnlich (zumindest bei mir hier ist die ziemlich grottenschlecht, ich kann dir zum Treffen auch eine iX mitbringen, da ist das etwas besser erklärt)
Ich danke Euch schon im voraus.
Gruß Tilo
cu, Ulf
Hallo Ulf,
Alles klar?
noch nicht - aber ich werde sicherlich noch dahinter kommen.
#include <string> #include <iostream.h>
void main() { string s = "Hello, World"; //;) cout <<s <<"\n"; }
Na, ist _das_ nicht elegant? Informationen dazu gibt es unter /usr/doc/STL oder so ähnlich (zumindest bei mir hier ist die ziemlich grottenschlecht, ich kann dir zum Treffen auch eine iX mitbringen, da ist das etwas besser erklärt)
Das sieht erst mal nicht schlecht aus. Würde mich freuen, wenn Du die iX zum Treffen (diesen Mittwoch ?!) mitbringen könntest.
Gruß und Danke Tilo
On Sun, Feb 25, 2001 at 09:10:51PM +0100, Tilo Wetzel wrote:
Hallo Ulf,
Hallo Tilo,
Alles klar?
noch nicht - aber ich werde sicherlich noch dahinter kommen.
Na dann, fröhliches Schaffen :).
Das sieht erst mal nicht schlecht aus. Würde mich freuen, wenn Du die iX zum Treffen (diesen Mittwoch ?!) mitbringen könntest.
Schon mal vorsorglich in den Rucksack gepackt. Ja, das Treffen ist am Mittwoch.
Gruß und Danke Tilo
Ulf
PS: Kommen einige von den anderen Schülern (außer Tobias) auch mal zum Treffen?
Am Montag, 26. Februar 2001 19:34 schrieb Ulf Lorenz:
PS: Kommen einige von den anderen Schülern (außer Tobias) auch mal zum Treffen?
jep, ich werde vorraussichtl. kommen. Wäre nett, wenn du ein paar C'ts mit Linuxartikeln mitbringen könntest.
On Mon, Feb 26, 2001 at 09:34:05PM +0100, Steffen Liebergeld wrote:
Am Montag, 26. Februar 2001 19:34 schrieb Ulf Lorenz:
PS: Kommen einige von den anderen Schülern (außer Tobias) auch mal zum Treffen?
jep, ich werde vorraussichtl. kommen. Wäre nett, wenn du ein paar C'ts mit Linuxartikeln mitbringen könntest.
Fein, daß du kommst ;). Welche Ct's? Verwechselst du hier jemanden? Ich oute mich ja gerne als iX-Leser, aber Ct's sind nicht so mein Spezialgebiet. :)
cu $tepardo
Ulf
Am Dienstag, 27. Februar 2001 22:41 schrieb Ulf Lorenz:
On Mon, Feb 26, 2001 at 09:34:05PM +0100, Steffen Liebergeld wrote:
Am Montag, 26. Februar 2001 19:34 schrieb Ulf Lorenz:
PS: Kommen einige von den anderen Schülern (außer Tobias) auch mal zum Treffen?
jep, ich werde vorraussichtl. kommen. Wäre nett, wenn du ein paar C'ts mit Linuxartikeln mitbringen könntest.
Fein, daß du kommst ;). Welche Ct's? Verwechselst du hier jemanden? Ich oute mich ja gerne als iX-Leser, aber Ct's sind nicht so mein Spezialgebiet. :)
ja, sorry. das sollte eigentlich an tilo gehen;-)
cu $tepardo
Ulf
Ich verwende C++.
On Sun, Feb 25, 2001 at 07:06:45PM +0100, Tilo Wetzel wrote:
void ausgabe_fehler(char text) { printf("was auch immer\n"); printf("was auch immer %c\n", text); }
Wie es aussieht, machst Du das noch nicht allzu lange...
Was ich auch ganz toll vermisse, ist die definiton string (zeichenkette). Ist in C irgendwie mieß gemacht.
Die Datentypen in C sind sehr maschinenorientiert und maschinenseitig gibt es eben keine Strings. Außerdem: Wozu extra Strings, wenn die doch sowie nix anderes als eine Aneinanderreihung (also Array) von chars sind. In C++ gibt es die Standard Template Library (STL). In selbiger gibt es eine String Klasse, sowie alles was man sonst so braucht. Allerdings denke ich, daß Du Dir erst mal ein gutes Buch besorgen solltest. Auch ist die ganze Pointerproblematik nicht unbedingt für den Anfang zu empfehlen.
BTW:
void ausgabe_fehler(char* text) { printf("was auch immer %s\n",text); return; // kann man auch weglassen, wird aber als "guter Stil" // erachtet } bzw. void ausgabe_fehler(char* text) { cout << was auch immer << text << "\n"; return; }
Aufruf:
ausgabe_fehler("Na so ein Spaß!");
Gruß, Eric
On Sun, Feb 25, 2001 at 07:06:45PM +0100, Tilo Wetzel wrote:
ich hab da mal ne Frage zu C++. Wie kann ich einer procedure (welche NICHTS zurückliefern soll) Paramter zur Ausgabe übergeben? Beispiel: so siehts in pascal aus:
procedure ausgabe_fehler(text: string); begin WriteLn("was auch immer"); WriteLn("was auch immer: ", text); end;
...
mit void ausgabe_fehler(char text) { printf("was auch immer\n"); printf("was auch immer %c\n", text); }
printf ist nicht unbedingt C++-typisch.
void ausgabe_fehler(const char* text) { cerr << "was auch immer" << "was auch immer" << text; }
definition char txt;
aufruf: txt="inhalt"; ausgabe(txt);
Zeichenkettein in C/C++ als ``const char*'' oder ``char *'', oder eben char[].
Oder: wie kann ich variablen und constanten so definieren, das ich aus jeder procedure / functions darauf zugreifen kann ?
Das ist was anderes. Es sind dann globale Variablen/Konstanten.
const char* text = "Hallo";
void ausgabe() { cout << text; }
Was ich auch ganz toll vermisse, ist die definiton string (zeichenkette). Ist in C irgendwie mieß gemacht.
Ich denke, das ist in Pascal mies gemacht. Dort können die Zeichenketten nicht länger als 255 Zeichen sein. In C können Sie kein '\0' enthalten. Jetzt ist die Frage, was für eine Zeichenkette wichtiger ist....
Wenn Du C++ programmierst, kannst Du es auch mit mit
#include <string>
versuchen. Dann hast Du den Datentyp `string'. Der kann beliebig lang sein und '\0' enthalten.
Dein Beispiel könnte so aussehen:
void ausgabe(const string& txt) // das ist eine Referenz auf einen // String, wegen der Pomeranze { cout << "bla bla " << txt; }
Best regards from Dresden/Germany Viele Gruesse aus Dresden Heiko Schlittermann
Guten morgen alle zusammen,
erstaml vielen Dank für Euer Wissen. Ich bin nun schon ein Stück weiter.
Hat zwar eine Weile gedauert bis ich dahinter stieg - ein Fehler lag allerdings bei mir. Ich hatte die string mit #include <string.h> eingebunden - muß aber #inlcude <string> lauten. Bei mir gibt es u.a. mehrer string-files /usr/include/bits/string.h /usr/inlcude/string.h /usr/src/linux (im Kernel)
/usr/include/strings.h
Worin besteht der Unterschied zwischen: ...<string> - .... <string.h> und ... <strings.h> ? Solange ich keine Variable als Typ string definierte lief der der Compiler problemlos. Es gab erst Probleme als ich eine Variable deklarierte. Ihr könnt Euch Zeit lassen mit der Beantwortung dieser Frage, da ich übers Wochenende (sprich nachher) erstmal wegfahre.
Was ich nun fabriziert habe (kleiner Paßwortgenerator) könnt Ihr unter http://www.dresden.nacamar.de/~wetzel/files/pwdgen0.0.2.zip downloaden. Sind ca. 100kb und ein Projekt, welches ich mit KDevelop für die Console erstellt habe.
Ein schönes Wochenende wünscht Euch
Tilo
-- Tilo Wetzel, Dresden http://www.elline.de Linux - 32 Bit von Anfang an!
On Sat, Mar 03, 2001 at 09:16:30AM +0100, Tilo Wetzel wrote:
Guten morgen alle zusammen,
erstaml vielen Dank für Euer Wissen. Ich bin nun schon ein Stück weiter.
Hat zwar eine Weile gedauert bis ich dahinter stieg - ein Fehler lag allerdings bei mir. Ich hatte die string mit #include <string.h> eingebunden - muß aber #inlcude <string> lauten. Bei mir gibt es u.a. mehrer string-files /usr/include/bits/string.h /usr/inlcude/string.h /usr/src/linux (im Kernel)
/usr/include/strings.h
Worin besteht der Unterschied zwischen: ...<string> - .... <string.h> und ... <strings.h> ?
Also: - /usr/include/bits/string.h wird von /usr/include/string.h eingebunden und wird sich ansonsten weigern zu kompilieren (es liefert grundlegende Stringoperationen). - /usr/include/string.h liefert die Stringfunktionen für C (also strcpy(), strdup() etc., alle benötigen einen char*) - /usr/include/strings.h ist meines Wissens nur zur Kompatibilität, weil einige Unixe ihre Stringfunktionen in <string.h>, andere in <strings.h> hatten. (strings.h sieht ziemlich primitiv aus, also nicht benutzen) - /usr/include/g++-3/string (ohne .h!!) liefert die Stringklasse für C++. Das fehlende .h ist nur, damit es sich nicht mit string.h beharkt.
Genau genommen ist string nur ein typedef von basic_string<char>. Wenn du also die Stringklasse um Unicode erweitern willst, würde ein basic_string<int> zum Datenzusammenhalten ausreichen (auch wenn das keine ideale Speicherausnutzung ist). Das nur so nebenbei.
Solange ich keine Variable als Typ string definierte lief der der Compiler problemlos. Es gab erst Probleme als ich eine Variable deklarierte.
s.o., in <string.h> war die Stringklasse nicht definiert.
Ihr könnt Euch Zeit lassen mit der Beantwortung dieser Frage, da ich übers Wochenende (sprich nachher) erstmal wegfahre.
Naja, bevor ich es vergesse...
Ein schönes Wochenende wünscht Euch
Tilo
dir auch, Ulf
Hallo,
Worin besteht der Unterschied zwischen: ...<string> - .... <string.h> und ... <strings.h> ?
In C-Programmen: #include <string.h> /* für strcpy(), strcat(), ... */
In C++-Programmen: #include <string> /* für die std::string-Klasse */ #include <cstring> /* für strcpy(), strcat(), ... (aus der string.h von C */
// #include <string.h> /* sehr fragwürdig: C's string.h oder C++'s string.h ohne namespace ... */
// Merke also: in C++ alle Standard-Header-Files ohne .h, dann // liegen die C++-Bezeichner im Namespace std. Wenn Du Header-Files // brauchst, die zur Standard-C-Bibliothek gehören, dann auch ohne // .h, aber mit dem Präfig `c'. // aus assert.h wird cassert.h // aus string.h wird cstring.h // aus ctype.h wird cctype.h // und so weiter und so fort.
Best regards from Dresden/Germany Viele Gruesse aus Dresden Heiko Schlittermann
lug-dd@mailman.schlittermann.de