Kidchaos
Bloody Newbie
|
Hallo an alle, wie ich schon im Titel geschreiben habe lerne ich gerade C++ und hab da einige Fragen die aufkamen als ich ein kleines testprogramm geschrieben habe um chars, char arrays und den heap besser zu verstehen und zu verinnerlichen, nun bin ich leider auf einem Punkt angekommen wo ich leider nicht mehr weiterweis, und selbst google u. Forensuche haben mir etwas gebracht, leider. Bitte erschlagt mich net gleich wenn das in euren Augen ne wirkliche Noobie Frage ist aber ka würd das endlich gerne durchblicken was ich mache oder beziehungsweise wie ich den Fehler in meinem Programm den ich mache richtig stelle. Wie schon gesagt habe ich mir ein kleines Programm geschrieben um die einzelnen Variablen und deren nutzung in Funktionen besser zu überblicken. Also hier mal den Code (arg gestrippt um das was schon funktioniert und keiner Klärung mehr bedarf. // Includes
#include <iostream>
#include <cstring>
#include <cmath>
// Define Namespace
using namespace std;
// Function Declaration
char *fnCalc3 (char *, char *);
// Main Programm
int main (int argc, char **argv)
{
cout << fnCalc3 ("Hallo ", "Welt!") << endl;
/*
___________________________________________________________
hier ist die Stelle wo ich nun meinen Error bekomme, da 'temp'
ja nicht in diesem Scope vorkommt, nur frage ich mich wie mache
ich das richtig, und hab ich überhaupt meine Funktion richtig so
weit? Die Ausgabe die ich an der Console erhalte ist das was ich
haben wollte, also "Hallo World!"
___________________________________________________________
*/
free(temp);
/*
___________________________________________________________
*/
cout.flush();
cin.get();
return 0;
}
// Functions
char *fnCalc3 (char *a, char *b)
{
char *temp = (char*) malloc (strlen(a) + strlen(b) + 1);
strcpy(temp, a);
strcat(temp, b);
return temp;
}
Mir ist bekannt das es die Klasse 'string' gibt die mir das ganze einfacher machen würde, wollte aber noch nicht weiter einsteigen dort, weil ich doch erst 'char', und 'char arrays' verstehen mag bevor ich das ganze einer Klasse überlasse die ich zum jetzigen Zeitpunkt eh noch nicht durchblicke was sie im genauen macht. Das gleiche gilt für 'stack', 'heap' und 'pointer'. Cheers Mike P.S.: Hoffentlich sprenge ich nu nicht die Page, das schaut grauselig aus im Post-Editor und dessen Vorschau. Edit: Und es sah nicht nur in der Vorschau Grauselig aus ...
Bearbeitet von Kidchaos am 27.10.2008, 23:46
|
ica
hmm
|
kleiner hinweis: wenn du schon c funktionen verwendest nimm gleich die richtigen. also strnlen, strncpy, strncat. weiters: was ist dir jetzt eigentlich unklar? auf temp hast du natürlich keinen zugriff, hast du aber eh schon erwähnt. eine möglichkeit wäre das resultat von fncalc3 einer variable zuzuweisen, die auszugeben und danach freizugeben. char* main_temp = fnCalc3("blah", "blah");
cout << main_temp;
free(main_temp);
weiters: die rechtschreibung ist schlimmer als das page layout
|
tresh
Little Overclocker
|
Prinzipiell hat ica ja schon alles gesagt, aber ein paar Sachen fallen mir noch auf:
1.) Bitte NIE Umlaute in Kommentaren verwenden, lass es einfach, du tust dir und anderen damit einen großen Gefallen.
2.) Pointer soll man wenn es geht 'char *name' oder 'char * name' benennen, aber nicht 'char* name'.
3.) Bei mir ist malloc nicht in cstring inkludiert, ich musste dafuer noch extra stdlib.h inkudieren (auf manchen Systemen ist es malloc.h, kenn mich allerdings nur unter Linux aus).
4.) Die Strings in cout sollte man auch noch casten.
Bearbeitet von tresh am 27.10.2008, 23:46
|
Kidchaos
Bloody Newbie
|
Bleibt dann nicht immernoch der Speicher belegt den ich 'temp' zugewiesen habe in der Funktion oder ist das eher unwichtig ? Die Funktionen die ich da nun genutzt habe (strlen,strcpy und strcat) habe ich so von http://www.cplusplus.com/reference/...ing/strcat.htmlEs compiliert nun ohne zu murren. 4.) Die Strings in cout sollte man auch noch casten. Ok das wirft für mich wiederum neue Fragen auf die ich aber mal erst probiere per Buch, und Recherche zu lösen. Danke erst mal für die schnellen Antworten, Ihr habt mich damit erst einmal weitergebracht. Cheers Mike
Bearbeitet von Kidchaos am 28.10.2008, 00:03
|
that
Hoffnungsloser Optimist
|
Bleibt dann nicht immernoch der Speicher belegt den ich 'temp' zugewiesen habe in der Funktion oder ist das eher unwichtig ? Du gibts den Speicher ja nach dem Aufruf der Funktion frei, nachdem du das Ergebnis nicht mehr benötigst. Passt also.
|
tresh
Little Overclocker
|
Wenn du es so machst wie ica es dir gezeigt hat sollte kein Speicher belgt sein. Kannst du zur Not aber mit valgrind ueberpruefen.
|
that
Hoffnungsloser Optimist
|
kleiner hinweis: wenn du schon c funktionen verwendest nimm gleich die richtigen. also strnlen, strncpy, strncat. Diese Funktionen hätten in diesem Programmm keinen Sinn, weil was würdest du an strnlen übergeben? 2.) Pointer soll man wenn es geht 'char* name' oder 'char * name' benennen, aber nicht 'char *name'. Das ist reine Geschmackssache. Ich finde "char *name" gar nicht so schlecht - weil bei "char x" ist schließlich "x" ein char, und bei "char *name" ist "*name" auch ein char.
|
tresh
Little Overclocker
|
Das ist reine Geschmackssache. Ich finde "char *name" gar nicht so schlecht - weil bei "char x" ist schließlich "x" ein char, und bei "char *name" ist "*name" auch ein char. Sry hab mich vertippt, ich meinte eigentlich dass char* bla vermieden werden sollte, da es zu Missverstaendnissen kommen kann wie z.B: char* bla, blabla; char *bla, blabla; Diese zwei Deklarationen sind äquivalent, jedoch ist die zweite wesentlich intuitiver. PS: Äquivalent im Sinne von, blabla ist kein Pointer, sondern ein normaler character.
|
tresh
Little Overclocker
|
sry fuer doppelpost
|
Kidchaos
Bloody Newbie
|
Ok, nochmal zurück zu der Sache mit dem 'casten', bezieht sich dies nun auf Typecast, oder wie ist das gemeint, soweit ich das was ich im Netz nachlesen kann überblicke, raten die meisten dazu in 'cout' nicht zu 'casten'. Im übrigen tendiere ich eher dazu Kommentare in Englisch zu schreiben, wollte hier aber nun nicht meine kontroverse Stelle in Englisch beschreiben. Anbei hier nun mal der Quellcode komplett mit Überladung der Funktionen und allem drum und dran. Es ist wie gesagt einfach nur ein Code zum ausprobieren der verschiedenen Wege und zum praktischen umsetzen des meist doch recht umständlich beschriebenen in den Büchern. // Includes
#include <iostream>
#include <cstring>
#include <cmath>
// Define Namespace
using namespace std;
// Function Declaration
int fnCalc (int, int);
double fnCalc (double, double);
char *fnCalc (char *, char *);
// Main Programm
int main (int argc, char **argv)
{
cout.precision(6);
cout << fixed;
int c = 22222222;
int d = 22222222;
cout << fnCalc (c, d) << endl;
cout << fnCalc (22222222, 22222222) << endl;
double e = 2222.2222;
double f = 2222.2222;
cout << fnCalc (e, f) << endl;
cout << fnCalc (2222.2222, 2222.2222) << endl;
cout << M_PI << endl;
char *x = "Hallo ";
char *y = "Welt!";
cout << x << y << endl;
char *main_temp = fnCalc ("Hallo ", "Welt!");
cout << main_temp << endl;
free(main_temp);
cout.flush();
cin.get();
return 0;
}
// Functions
int fnCalc (int a, int b)
{
return a+b;
}
double fnCalc (double a, double b)
{
return a+b;
}
char *fnCalc (char *a, char *b)
{
char *temp = (char *) malloc (strlen(a) + strlen(b) + 1);
strcpy(temp, a);
strcat(temp, b);
return temp;
}
Cheers Mike
Bearbeitet von Kidchaos am 28.10.2008, 00:28
|
ica
hmm
|
Diese Funktionen hätten in diesem Programmm keinen Sinn, weil was würdest du an strnlen übergeben? das es in dem fall keinen sinn macht ist natürlich klar. aber einem anfänger in eine gewisse richtung zu lenken ist doch wohl nicht falsch.
|
Kidchaos
Bloody Newbie
|
Bitte, wenn ihr schon beginnt über Grundsätze zu diskutieren dann lasst mich dabei etwas lernen. http://www.cplusplus.com/reference/clibrary/cstring/'strncat' sehe ich dort verzeichnet 'strncpy' auch, aber 'strnlen' finde ich dort nicht. Und wieso sind das C Funktionen? Ich dachte ich lerne C++? *verwirrt ist* Cheers Mike
Bearbeitet von Kidchaos am 28.10.2008, 00:53
|
that
Hoffnungsloser Optimist
|
'strncat' sehe ich dort verzeichnet 'strncpy' auch, aber 'strnlen' finde ich dort nicht. strnlen war mir auch neu, ist anscheinend eine GNU-spezifische Funktion. Wird dir wohl nicht fehlen. Der Hintergrund der "n"-Funktionen: strcpy, strcat, usw. kopieren bis zum \0-Zeichen. Wenn dein Zielbereich zu klein ist, dann überschreiben sie einfach die Daten dahinter - Stichwort "buffer overflow", eine der Hauptursachen für Sicherheitslücken in Software. Daher gibts die Funktionen mit "n", die auf jeden Fall nach einer bestimmten Anzahl Zeichen abbrechen und daher bei korrekter Anwendung nichts Falsches überschreiben können. Und wieso sind das C Funktionen? Ich dachte ich lerne C++? C++ ist eben zu 99% gleich wie C, nur eben mit vielen Erweiterungen. Das hat zur Folge, dass du Strings mit einer C++-Klasse bearbeiten kannst (string bzw. basic_string etc.), oder - so wie du hier - auf die alte "C-Art" mit nullterminierten char-Arrays.
|
Kidchaos
Bloody Newbie
|
Alles klar! Danke Dir und natürlich auch den anderen.
Cheers
Mike
|
Maekloev
linux addicted
|
galileocomputing.de bietet unter anderem ein ganz nettes openbook zur programmiersprache C an. dass du natürlich primär c++ lernen willst, ist mir klar. aber als referenz schadet es sicher nicht. [quote author="that"]C++ ist eben zu 99% gleich wie C, nur eben mit vielen Erweiterungen. Das hat zur Folge, dass du Strings mit einer C++-Klasse bearbeiten kannst (string bzw. basic_string etc.), oder - so wie du hier - auf die alte "C-Art" mit nullterminierten char-Arrays.[/quote] falls du dich fragst, warum das so ist: die alte classic c-art ist im allgemeinen performanter, dafür ist die verwendung der klasse string wiederum einfacher und auch sicherer (pointer-adressen lassen grüßen)...
|