Wie lerne ich am besten C/C++ unter Linux?

Post Reply
Message
Author
blender

Wie lerne ich am besten C/C++ unter Linux?

#1 Post by blender »

Hi!

Ich möchte gerne C oder C++ lernen, um eigene "richtige" Applikationen
Programmieren zu können. Nun möchte ich gerne von Euch wissen, welche gut
verständliche Literatur Ihr mir zu diesem Thema empfehlen könnt und welche von
beiden Sprachen ich zuerst/nur lernen sollte - darin habt Ihr ja sicherlich
mehr Erfahrung.

Vielleicht sollte ich noch anmerken, dass ich 15 Jahre
alt bin und Vorkentnisse in Perl und Linux besitze - also kein totaler
Newbie bin.

Danke für's lesen.

Benjamin Liebe

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#2 Post by Sebastian Ude »

Also darüber, ob man sich erst in C einarbeiten und dann C++ lernen oder gleich mit C++ anfangen sollte gab es hier im Forum schon mehrere Diskussionen.

Gut, einerseits ist C++ natürlich nur ein erweitertes C und es ist prinzipiell schon nicht schlecht, wenn man C ersteinmal versteht bevor man sich auf C++ stürzt.

Andererseits ist die "C-Denkweise" anders als die Objektorientierte "C++-Denkweise", und manche meinen, man würde sich zu sehr in der C-Denkweise "festfressen" und man sollte, wenn man vor hat in C++ zu programmieren, von Anfang an C++ lernen, um die Denkweise der objektorientierten Programmierung "von klein auf" eingehämmert zu bekommen.

Naja das ist wohl Ansichtssache, mein persönlicher Tip wäre: Arbeite dich erst mal mindestens ein halbes Jahr in C ein und mach dann mit C++ weiter, musst du aber selber wissen.

Was Literatur angeht ... Bücher sind teuer, guck erstmal ob du mit einem der zahlreichen Tutorials von www.c-plusplus.de etwas anfangen kannst.
Ansonsten ... ich habe hier "C++ von Null auf Hundert in 40 Lektionen" aus dem Elektor-Verlag (ISBN 3-89576-058-7) stehen. Mit diesem Buch habe ich meine ersten C++-Gehversuche vor Jahren gemacht, und denke heute so über das Buch: Es erklärt alles ziemlich einfach und verständlich, geht aber in der Tat an manchen Stellen nicht sehr tief auf die Materie ein. Aber dafür gibt es ja zahlreiche weiterführende Literatur, für den absoluten C/C++-Einsteiger ist dieses Buch sicher keine schlechte Wahl.

Ozi

Re: Wie lerne ich am besten C/C++ unter Linux?

#3 Post by Ozi »

Hey,

welch Zufall, das Buch hab ich auch <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Ich fand auch, dass es schön einfach erklärt ist. Aber spätestens, wenn's an Pointer geht, reicht es halt nicht, nur zu erklären, dass man die benutzen kann, um durch String Arrays zu iterieren.

Ich hab' bis jetzt nicht geschnallt, wie Pointer genau funktionieren ? Was mach ich mit den Speicheradressen, wozu brauch das alles ? Ich kann ja schliesslich auch ohne Pointer durch ein String Array iterieren <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Wenn sich einer von euch dazu berufen fühlt, mir das zu erklären, würde ich mich natürlich freuen <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Momentan programmiere ich allerdings in Java. Habe mich auch sehr über die kommende KDE/Qt Bindings für Java gefreut. Dann werd' ich endlich auch KDE Apps schreiben können. Zumindest versuchen <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">))

cu

Oliver

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#4 Post by Sebastian Ude »

Die Sache mit den Pointern ist ja nicht so schwer.

Ein Pointer ist keine echte Variable, sondern zeigt halt nur auf eine Speicheradresse (deswegen auch Pointer, Pointer = Zeiger).

Nehmen wir also folgenden Code:

int number = 10;
int *pointer = &number;

Damit zeigt der Pointer "pointer" auf die Speicheradresse von "number".

Gut, soweit klar. Machen wir noch etwas weiter:

int number = 10;
int *pointer = &number;
*pointer = 5;

Welchen Wert hat "number" jetzt wohl ? 5 !
Wieso ? Wie wir schon festgestellt haben zeigt "pointer" auf die Speicheradresse von "number". Wenn wir also den Wert der Adresse auf die "pointer" zeigt (*pointer) ändern, dann ändern wir den Wert von "number"

Gut, was ist der Sinn der Sache, ausser das es eine schöne Spielerei ist:


1:

Um Funktionen Variablen zu übergeben die von der jew. Funktion geändert werden müssen. Das geht nur mit einem pointer.

2:

Für die ganzen Array Geschichten. Ein Array ist nichts weiter als ein Pointer, der auf den ersten Wert aus einer Folge von Werten zeigt.

3:

Für die ganzen Speicher-Spielereien. Funktionen wie "malloc" geben einen pointer auf einen allocierten Speicherbereich zurück, ohne Pointer wäre etwas wie Dynamische Speicherverwaltung in C nicht denkbar.


Ich hoffe ich habe das halbwegs verständlich erklärt.

oli
Posts: 46
Joined: 25. Dec 2000 15:40

Re: Wie lerne ich am besten C/C++ unter Linux?

#5 Post by oli »

Hi Sebastian,

vielen Dank für die doch recht anschauliche Erklärung.

OK, also wenn ich den Wert des Pointers ändere, ändert sich auch der Wert der zugehörigen Variable. Richtig so ?

Aber:

char array[] = "MeinArrayOfChars";

int i = 0;
while (array<i> != '\0') {
printf(i
);
}

ist doch äquivalent zu:


void printchars(char *string) {

while (*string != '\0') {

printf(*string
);
}
}

void main(void) {

char array[] = "MeinArrayOfChars";

printchars(array);

}

Und was soll eigentlich diese doppelte Pointer Deklaration des Kommandozeilenarrays, wie ich sie schon häufig in der main() Funktion gesehen habe:

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

Wäre cool, wenn du das auch noch weisst. Ansonsten nochmal vielen Dank.

cu

Oliver

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#6 Post by Sebastian Ude »

Ja, das kommt aufs selbe raus, wobei es oben

printf("%c", array<i>);

statt

printf(i);

heissen müsste.


Nochmal was zu dem "Wert eines Pointers ändern".

Du kannst bei einem Pointer zwei Sachen ändern: Erstens die Speicheradresse auf die der Pointer zeigt / zeigen soll, und zweitens den Wert dieser Adresse.

Nehmen wir folgenden Pointer:

int *pointer;

Mit "pointer" referenzierst du die Adresse auf den der Pointer zeigt, mit "*pointer" den Wert dieser Adresse.

Hier noch mal ein Praxisbeispiel:

int a=3, b=5;
int *pointer;
pointer = &b;
*pointer = 6;

Damit hätte b jetzt überigens den Wert 6. Aber worauf ich hinaus wollte: Mit "pointer = &b;" weisen wir dem pointer die Adresse von der Variable b zu. Mit "*pointer = 6;" ändern wir den Wert der Adresse auf die pointer zeigt. "pointer = 6;" würde keinen Sinn ergeben, weil wir dann Pointer auf die Speicheradresse "6" zeigen lassen wollten.


Dann zu argv:

argv ist nie "char **argv[]". Wenn, dann "char **argv" oder "char *argv[]", was äquivalent ist.
Was soll also dieser "doppelte Pointer" ?

In diesem Fall handelt es sich um ein Array aus Arrays, auch mehrdimensionales Array/Vektor genannt.

argv ist also ein Array dessen Elemente wiederum Arrays sind, und das schreibt man in C halt so: "char *argv[]" oder "char **argv", wobei "char argv[][]" auch eine gültige Schreibweise wäre.

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#7 Post by Sebastian Ude »

Achso, deine Funktion printchars müsste auch etwas anders aussehen:

void printchars(char *string)
{
while (*string != '\0') {
printf("%c", *string);
string++;
}
}

So wie du es jetzt hast, würde die Funktion in einer Endlosschleife den ersten Buchstaben der Zeichenkette ausgeben, abgesehen davon, dass "printf(*string);" nicht funktioniert.

}

Ozi

Re: Wie lerne ich am besten C/C++ unter Linux?

#8 Post by Ozi »

Hi Sebastian,

vielen Dank nochmal für die vielen Erklärungen.
Ich nehme dann mal an, dass char **argv deswegen nötig ist, weil ein Kommandozeilenbefehl bereits ein Array von Charactern darstellt.
Tja, unter Java sind Strings eigene Objekte, daher würde da die main() Methode so aussehen:

public static oid main(String[] args) { }

Das args Array hält dann alle Kommandozeilenoptionen als separate Elemente. Lässt sich halt einfacher handhaben finde ich, aber das ist Geschmackssache <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Dafür gibt es keine Pointer unter Java. Wenn man so etwas haben möchte, z.B. einen Zeiger auf das nächste Element in einer verketteten Liste, müsste man so vorgehen:

class Element {

String ersterEintrag;
String zweiter Eintrag;
Element next; // Zeiger auf nächstes Element

public Element(String eins, String zwei) {

ersterEintrag = eins;
zweiterEintrag = zwei;
}
} // Class Ende

Na ja, da ist das Ganze in C/C++ wahrscheinlich übersichtlicher, oder ?

cu

Oliver

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#9 Post by Sebastian Ude »

Ja, alles Geschmackssache.

Die "string"-Klasse gibt es aber auch in C++ !

Damit kann man auch nette Sachen machen:

#include <string> // Kein Tippfehler !
#include <iostream.h>

void main()
{
string a, b;
a = "Hello ";
b = "World";
a+=b;
cout << a << endl;
}

Wie du siehst, man muss sich nicht um die Speicherverwaltung kümmern, alles geht ohne Funktionen wie strcpy (operator overloading ist schon cool), und es ist schon recht elegant. Wenn man die Zeichenkette aus einem string-Objekt als char*-Braucht (z.B. um sie einer Funnktion zu übergeben die char* erwartet), krigt man sie mit der c_str()-Methode der string-Klasse.

In reinem C ist das leider nicht ganz so komfortabel, aber die GString's aus der glib sind auch ganz nett.

Ozi

Re: Wie lerne ich am besten C/C++ unter Linux?

#10 Post by Ozi »

Hi Sebastian,

Ja, ich habe mich auch schon gefragt, warum man einmal die .h Endung angeben muss und dann wieder nicht *verwirrt*

Tja, was die Speicherverwaltung angeht habe ich mich schon immer gefragt, wie denn so etwas gehandhabt wird, wenn man Objekte schreibt und die dann mit new erzeugt. Da habe ich dann noch nie was von malloc gelesen.

Wann brauche ich denn dann die manuelle Speicherverwaltung und wie könnte das praktisch aussehen.
Ich hab halt keine Ahnung, weil Java das selber macht und dereferenzierte Objekte automatisch der Garbage Collection zum Opfer fallen.

Ist eigentlich die Entwicklungsgeschwindigkeit in C++ und Java vergleichbar ? Mir kommt Java da halt doch etwas einfacher vor, auch wenn ich zugeben muss, dass das GUI dann halt doch scheisslangsam ist. C++ lern ich dann erst im 3. Semester.

cu

Oliver

Sebastian Ude

Re: Wie lerne ich am besten C/C++ unter Linux?

#11 Post by Sebastian Ude »

Wieso du .h nicht angeben musst ?

Weil die Datei eben "string" und nicht "string.h" heisst. "/usr/include/g++/string" und "/usr/include/string.h" haben nichts miteinander zu tun.

Wieso das so ist ? Frag die Leute die für die ganzen C++-Standards zuständig sind. Oder die Leute die sich nicht daran halten :). So heisst das äquivalent zu g++/string z.B. beim Borland C++ compiler für Windows cstring.h

Naja gut, wir wollen jetzt mal nicht die ganze Welt schlecht machen :).


Zu new / dynamischer Speicherverwaltung:

Der new-Operator ruft auch wieder nur malloc() auf, nur du krigst es halt nicht mit. Genauso ruft der delete-Operator im Endeffekt auch nur free() auf.

Wofür du dynamische Speicherverwaltung brauchst ?

Hm, ja, C ist anscheinend so unflexibel das man soetwas braucht.
Stell dir vor du hast ein Programm, welches eine bestimmte Anzahl von int-Werten speichern muss. Es wird aber erst während der Laufzeit feststehen, wieviele Werte es sein werden.
Du willst nicht das Risiko eingehen, dem Array eine statische Grösse zu geben, weil es überlaufen könnte oder weil du jede Menge Speicher verschwenden könntest.
Daher definierst du zunächst einen int-Pointer "int *values" und allocierst dann, wenn es an der Zeit ist, mit malloc den benötigten Speicher.

Du kannst den Speicher dann auch wieder freigeben wenn du willst, oder die Menge des allocierten Speichers ändern (realloc).


Ja, andere Sprachen sind da flexibler und übernehmen diese Arbeit für einen.
Mit der string-Klasse bei C++ sollten z.B. die Zeiten von aufwendiger Speicherverwaltung zur Speicherung einer läppischen Zeichenkette mit unvorhersehbarer länge zu Ende sein.
Aber andererseits ist mindestens 70% der Linux-Software noch in reinem C geschrieben, und Sachen wie die GStrings aus der glib sind eigentlich nur "Workarounds" um das Leben mit einer in doieser Beziehung recht unflexiblen Sprache zu erleichtern.

Trotz alle dem ist C / C++ eine sehr mächtige Sprache, was man ja schon daran sieht dass seit 30 Jahren Betriebssysteme in C / C++ geschrieben werden.

Es gibt Sachen, die man einfach nicht mit Java oder Perl machen kann. Dafür sind Scriptsprachen oder evtl. Java für manche simplen Anwendungsfälle sicher einfacher. Versuche mal einem Scriptsprachen-Programmierer klar zu machen, dass er in C Speicher allocieren und später wieder manuell freigeben muss um einen Llppischen Satz zu speichern ...


Naja gut, und damit zu Punkt 3:

Ich würde in Java trozdem nichts grösseres machen, selbst wenn die Entwicklung 2x so schnell geht. Java schleicht immer noch, und ist meiner Meinung nach (bitte keinen Flamewar) nicht für mehr als ein paar kleine Web-Applets zu gebrauchen.
C / C++ können nicht so schlimm sein, sonst würden nicht so viele Programmierer das Durchhaltevermögen haben, dauerhaft in diesen Sprachen zu schreiben ...

Stefan

Re: Wie lerne ich am besten C/C++ unter Linux?

#12 Post by Stefan »

Mit den Headernamen ist es so:

<string.h> C-Header für string Funktionen strcmp() strcat() etc.
<g++/string> C++ -Header für die Klasse String im Namespace std::
<g++/string.h> C++ -Header ohne Namespace std::
<cstring> C++ -Header für die C-String-Funktionen strcmp()... im Namespace std::

Alles easy oder ? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Weissi

Re: Wie lerne ich am besten C/C++ unter Linux?

#13 Post by Weissi »

Hi, ich bin auch 15, mache auch Linux, habe C(++) aber schon länger angefangen

Also zum C(++) lernen hab ich jetzt nix parat, aber ich habe mir mal ein buch gekauft, das heisst "Anwendungen entwickeln unter Linux", da werden C Kenntnisse vorausgesetzt und die gehen auf lauter Sachen unter Linux (immer auch ob es Posix kompat. ist) ein. Beispiele:
-TCP/IP unter Linux
-Programmierung einer einfachen Shell
-Alles mögliche zu den verschiedenen Dateien(Pipes, u.s.w)

Ist eigentlich schon echt fett, hat aber auch Nachteile, bezieht sich auf Kernel 2.0.36 und kostet (zumindest vor nem halben jahr)90 DM

Post Reply