Der Programmier-Thread

PSN-Name: chrizeliq
#1
Original von KingKolja
Ich verstehe chrizels Ava nicht. :cry:
Das ist ein kleines Programm in der Programmiersprache C, eine besonders schoene Sprache weil sie minimalistisch, hardwarenah und doch sehr platformunabhaengig ist. Der Linux-Kernel wird z.B. zum Grossteil in C programmiert. Die meisten Spiele entsprangen frueher auch oft C, wie z.B. nachweislich wurde Metal Gear Solid 2 in C programmiert. Heutzutage wird hier aber meistens auf C++ zurueckgegriffen d.h. so Spiele wie Uncharted sind nachweislich in C++ programmiert, und wahrscheinlich auch 99% der anderen Spiele die man fuer die Konsolen so kaufen kann. C++ hat allerdings nicht mehr den Minimalismus von C und wird oft als zu ueberladen verschrien.

Ich kann dir das Programm auch mal erklaeren:
Code:
#include <stdio.h>

int main(int argc, char **argv)
{
        puts("hello");
        return 0;
}
Mit Zeile 1 bindet man die Headerdatei stdio.h mithilfe der Praeprozessordirektive #include in den Quellcode ein. D.h. einfach ausgedrueckt, irgendwo liegt eine Datei stdio.h, die wird dann beim Kompilieren mit eingebunden. Die Datei stdio.h enthaellt u.a. Verweise (sog. Vorwaertsdeklarationen) auf Funktionen zur Ein- und Ausgabe auf dem Bildschirm (stdio steht fuer Standard Input Output)

Zeile 2 ist eine sogenannte Funktionsdefinition d.h. hier wird eine Funktion definiert. In diesem Fall sogar eine ganz spezielle, naemlich die Funktion main. Diese Funktion ist der Einstiegspunkt des Programms d.h. wenn man das Programm spaeter startet, wird der Code innerhalb von main als erstes ausgefuehrt. Vor dem Namen der Funktion (in dem Fall "main") steht immer der Rueckgabetyp einer Funktion. In diesem Fall ist das int. int steht fuer Integer, d.h. auf deutsch eine integrale Zahl bzw. einfach ausgedrueckt eine ganze Zahl -- technisch ausgedrueckt ein 32 bit Integer d.h. eine Zahl von -4294967296 bis +4294967296 oder so.

Nach dem Funktionsnamen (im Beispiel also "main") stehen immer die Funktionsparameter in Klammern. Die Funktion main hat hier zwei Parameter: "int argc" und "char **argv". Der erste Parameter "int argc" sagt aus, dass er vom Typ int sein soll (=Ganzzahl) und innerhalb der Funktion main den Namen argc haben soll. Der zweite Parameter "char **argv" sagt aus, dass er vom Typ "Pointer auf Pointer auf char" sein soll und innerhalb der Funktion main den Namen argv haben soll. Was Pointer sind ist etwas mehr zu erklaeren, ich lasse das hier mal aus.

argc steht fuer "argument count" und argv fuer "argument vector", letztendlich wird hier die Anzahl der Programmparameter uebergeben, die man beim Programmaufruf mitgeben kann, und letztendlich in argv dann ein Array ueber das man auf diese letztendlich kommt. Im Beispiel werden diese Parameter aber nicht verwendet, also eigentlich unnoetig.

Die geschwungenen Klammern in Zeile 4 und 7 sagen aus "hier drin steckt der Code der Funktion". D.h. der Code der ausgefuehrt werden soll wenn die Funktion aufgerufen wird. Im Beispiel wird die main automatisch aufgerufen, d.h. letztendlich ist das der Code der bei unserem Programm ausgefuehrt wird. In dem Falle also ganz einfach: puts("hello"); und return 0;

puts("hello"); schreibt letztendlich das Wort "hello" auf den Bildschirm und macht eine neue Zeile.

return 0; bricht die Funktion ab und gibt etwas zurueck, in diesem Fall 0. Das ganze mit argc und argv und dem return 0 haengt mehr mit der Unix-Welt zusammen, wo jedes Programm Parameter haben kann und auch einen Statuscode zurueckgeben kann, ob es korrekt ausgefuehrt wurde oder nicht. In dem Fall geben wir 0 zurueck, was soviel heisst wie "das Programm wurde normal ausgefuehrt". Das ist mehr eine Konvention, man koennte hier irgendeinen Wert zurueck geben. Der Witz ist, man kann diesen Statuscode dann in Shell-Scripten verwenden und z.B. bestimmte Dinge durchfuehren wenn das Programm nicht korrekt ausgefuehrt wurde. etc. pp.

Wenn wir also das Programm kompilieren:
Code:
chrizel@latitude:~$ gcc -o test test.c
Und danach ausfuehren:
Code:
chrizel@latitude:~$ ./test
Erhalten wir folgende Ausgabe:
Code:
hello
 
#2
@ chrizel:

Danke für die "kleine" Erklärung, bin aber nicht viel schlauer geworden als vorher. Schaue es mir am besten nochmal nach den Prüfungen und den Party-Tagen an. Vielleicht werde ich ja wenigstens etwas verstehen. :ugly:
 

laughing lucifer

Against Automobile Obesity
systems, systems, systems, systems, systems, systems
PSN-Name: Tekkenpowerslave
Spielt gerade: mit Mulmeln
#3
@schnitzel-admin...lol ich dachte dein avatar is witzig weil du ein endl vergessen hast...hab nicht viel ahnung davon...(wie is das nochmal...du kannst doch eine zeile entweder mi nem strichpunkt beenden oder mit nem endl...wo is da der unterschied?
haben halt in der schule was kleines dahingeschludert...
 
PSN-Name: chrizeliq
#4
Original von laughing lucifer
@schnitzel-admin...lol ich dachte dein avatar is witzig weil du ein endl vergessen hast...hab nicht viel ahnung davon...(wie is das nochmal...du kannst doch eine zeile entweder mi nem strichpunkt beenden oder mit nem endl...wo is da der unterschied?
haben halt in der schule was kleines dahingeschludert...
Du meinst C++:

Code:
#include <iostream>

int main(int argc, char **argv)
{
   std::cout << "hello world" << std::endl;
   return 0;
}
endl steht fuer "end line" d.h. springt zur naechsten Zeile. Das ganze sollte man aber nicht mit dem Semikolon verwechseln, welches in C und C++ notwendig ist um statements zu trennen.

Die C-Version wird oft auch mit printf geschrieben:

Code:
#include <stdio.h>

int main(int argc, char **argv)
{
   printf("hello world\n");
   return 0;
}
\n erfuellt hier auch den Zweck zur naechsten Zeile zu springen.

Aber eigentlich reicht hierfuer auch puts, wobei dann kein \n notwendig ist weil das puts selber schon macht.
 
PSN-Name: chrizeliq
#5
Original von laughing lucifer
@chrizel...ah...den ava war von C+...ja wir hatten nur C++...naja mal sehen vielleicht kauf ich mir ein buch und leg einfach mal drauflos...kannst du mir da was empfehlen?
Willst du C oder C++ lernen?

Fuer C ist das beste Buch das von den C-Erfindern selbst:

The C Programming Language



Das Buch ueberzeugt durch seine Kompaktheit, es sind nicht so viele Seiten d.h. man hat es recht schnell durch. Und C wird hier wunderbar erklaert. Ich mag dieses Buch sehr.


Zu C++ kenne ich kein wirklich gutes aktuelles Einsteiger-Buch, sind manchmal alles recht grosse Schinken. Viele haben das vom C++-Erfinder Stroustrup:

The C++ Programming Language

Zu aktuellem C++ gibts dann noch ne Menge anderer "Standardwerke" wie "Effective C++" etc. Aber das sind jetzt keine Buecher die ich mir fuer den Einstieg zulegen wuerde, erst spaeter.

Wichtig ist, wirklich erst mal die Sprache selber zu lernen. Das Problem ist nur, mit C und C++ als Sprache allein kann man meistens noch nicht so viel anstellen d.h. man muss auch die Schnittstellen zum Betriebssystem lernen um damit Sachen zu machen. Willst du also z.B. in die Spieleprogrammierung gehen nehme ich SDL in Kombination mit OpenGL, willst du von Windows abhaengig sein, koenntest du dir stattdessen auch DirectX angucken, aber das werde ich dir nicht empfehlen.

Fuer grafische Anwendungen habe ich in letzter Zeit oft gerne Qt eingesetzt, aber das ist C++.

Als Programmier-Einsteiger bietet es sich an mit anderen Programmiersprachen anzufangen wie z.B. Python oder Ruby, weil evtl C und vor allem C++ fuer einen Programmier-Einsteiger doch schon ziemlich heftig ist. Es gibt auch Leute die werden dir sowas wie Java oder C# empfehlen, es kommt halt auch drauf an was man machen will und in welche Richtung man gehen will.

Edit: Habe die Beitraege mal vom Avatar-Thread abgeteilt, damit der Thread nicht so stark Off Topic wird.
 
#6
Original von chrizel
C++ hat allerdings nicht mehr den Minimalismus von C und wird oft als zu ueberladen verschrien.
Mit C++ bin ich noch nicht in Berührung gekommen, aber C++ setzt sich durch, weil es dem aktuellen Standard der Softwaretechnik entspricht. Die Objektmodellierung kann ja nur mit C++, C# und Java durchgezogen werden.

(Sehr schoen ist auch, wie du die Umlaute den Konventionen anpasst ^^ )

Edit:
Was mich interessiert, wo ist der Unterschied von puts zu printf ?
 
PSN-Name: leckt mich an meinem haarigen hintern ihr haufen!
Spielt gerade: perl(pc); div. KOFs (ps3); GT6(ps3); sfIV(div.);
#7
noch ein tipp wenn du auf 'semivintagecomputern' (atarist/e/tt/falcon/amiga => nagut letzteres kann ich nicht beurteilen) programieren willst, was viel spaßiger ist, als für jede moderne plattform, empfehle ich dir dringendst c (plus ein bischen 68k-assembler)
 
PSN-Name: chrizeliq
#8
Original von spynose
Mit C++ bin ich noch nicht in Berührung gekommen, aber C++ setzt sich durch, weil es dem aktuellen Standard der Softwaretechnik entspricht. Die Objektmodellierung kann ja nur mit C++, C# und Java durchgezogen werden.
Wenn wir von grossen komplexen Anwendungen wie Photoshop oder Office reden, dann hast du sicher Recht. Und natuerlich vor allem in der Spieleprogrammierung zu aktuellen schnellen und performanten 3D-Spielen fuehrt derzeit nichts an C++ vorbei.

Zur Objektorientierung (das hast du wahrscheinlich mit Objektmodellierung gemeint) muss ich dir insofern wiedersprechen, als dass es nur mit C++, C# und Java ginge. Objektorientierung ist eigentlich nur ein Stil wie man Software programmiert und designed. Es ist auch moeglich mit C objektorientiert zu programmieren. Bestes Beispiel ist z.B. das Toolkit Gtk+ (darin wurde z.B. Gimp geschrieben), welches auch eine C-Library ist, allerdings viele objektorientierte Ansaetze umsetzt. Darunter gehoert auch das Konzept der Klassen und Vererbung.

Ich habe allerdings in den letzten Jahren festgestellt, dass - sobald es objektorientiert wird - es mir persoenlich mit C++ besser gefaellt als mit C. Das liegt einfach daran, weil es mit C++ etwas einfacher geht und etwas schoener ausschaut, als das Objektsystem haendisch in C nachzubilden. Dann kann man gleich C++ verwenden. Ich habe da schonmal ein kleines Spiele-Projekt zwischen C, C++ und Objektive-C hin- und herportiert...

Eine "schoene" Sprache ist aber C++ wie gesagt IMHO nicht wirklich... Aber Stroustrup hat ja glaube ich selber mal gesagt, er hat C++ nicht erfunden um eine saubere und schoene Sprache zu machen, sondern um Probleme zu loesen. ("get things done") Zum Thema C++ gibt es auch eine Chaosradio-Folge: http://chaosradio.ccc.de/cre063.html -- Pavel Mayer ist allerdings ziemlicher C++-Fanboy. :ugly:

(Sehr schoen ist auch, wie du die Umlaute den Konventionen anpasst ^^ )
Das liegt eher daran, dass ich schon seit Jahren mit englischer Tastaturbelegung schreibe... eben weil das Programmieren damit schoener geht. :P (Die Sonderzeichen und Klammern sind da einfacher erreichbar und es gibt kein AltGr) -- habe inzwischen sogar in der Arbeit und Zuhause originale US-Tastaturen, die kann man oft gar nicht so einfach bekommen hier in Deutschland...

Edit:
Was mich interessiert, wo ist der Unterschied von puts zu printf ?
printf hat diese Format-Syntax integriert, d.h. im String werden z.B. Angaben wie %s (String), %f (Float) oder %d (Decimal) durch den jeweiligen Parameter der bei printf nach dem String angegeben wird ersetzt:

Code:
char *name = "Christian";
int age = 22;
printf("Hallo %s, du bist %d Jahre alt!\n", name, age);
Daneben gibt es natuerlich noch mehr Sachen die man mit printf anstellen kann, eben z.B. Nachkommastellen bei Float-Ausgaben einstellen, Spacing etc.

Das heisst aber, dass printf den String erst mal durchgehen und nach % suchen muss. Und das macht puts nicht. puts gibt den String einfach aus. D.h. wenn man es genau nimmt ist puts "schneller", auch wenn man das heutzutage nicht wirklich merkt.

Ein weiterer Unterschied ist, dass puts automatisch ein Newline (\n) hinten anhaengt, und printf nicht.
 

Planet

50% water, 50% air, the glass is always full!
PSN-Name: PlanetJumble
#9
Ich ziehe die Objektorientierung dem Minimalismus vor. Java 4TW! ;)

Damit kann man natürlich keine kommerziellen Spiele entwickeln, aber es macht (mir) viel mehr Spaß, sauberen, übersichtlichen Code zu schreiben. Diese #include-Geschichte wird nämlich irgendwann extrem unübersichtlich, und man weiß am Ende gar nicht mehr, woher die eine oder andere Funktion eigentlich stammt.
 
#10
Zur Objektorientierung (das hast du wahrscheinlich mit Objektmodellierung gemeint) muss ich dir insofern wiedersprechen, als dass es nur mit C++, C# und Java ginge.
Objektorientierung ist eine Art zu Programmieren, wie du sagst, Objektmodellierung ist die objektorientierte Analyse und der objektoerientierte Entwurf von Softwareprojekten. Mit dem ganzen Kram, den es da so gibt, UML Diagramme und die geregelten Vorgehensweisen, die man hat. Die drei Sprachen waren nur Auszüge, man könnte auch in Smalltalk Projekte schreiben, aber diese sind wohl am weit verbreitesten.

Es ist auch moeglich mit C objektorientiert zu programmieren.
Das wusste ich noch nicht, weitere Wissenslücke geschlossen :)
 
PSN-Name: radiokidahead
Spielt gerade: GTS, Assetto Corsa
#11
C ist doch in C++ enthalten oder? Man kann doch reinen C-Code durch den g++ jagen und alles ist gut. Oder hab ich das falsch in Erinnerung?

Gruesse, Pablo
 
#12
Nicht ganz. Jedes C-Programm mit einem C++ Compiler compileren wird unter Garantie nicht klappen.

Mit C Objektorientiert zu schreiben... nun ja, ist aber ziemlich... durchs Knie ins Rückenmark.
Dann sollte man doch lieber überlegen, für alles C++ zu nehmen, und nur für Dinge wo es nicht anders geht, C-Code.

Aber schön ist C++ wirklich nicht. Vor allem ist es eigentlich eine furchtbar unproduktive Sprache, da man sich für alles mögliche was man machen will erst entsprechende Bibliotheken zusammen suchen muss. Und selbst wirklich gute Libs wie Qt bieten nicht alles was man braucht. Und vieles vor allem furchtbar umständlich (*mit Grauen an Signals und Slots denk*)

Wenn ich daran denke, wie unheimlich schell und effizient man in C#/.NET entwickeln kann, da kommt C++ bei weitem nicht ran. Wenn MS nur nicht alle paar Jahre die gesamten Konzepte übern Haufen werfen würde...
 
PSN-Name: chrizeliq
#15
Original von Shefqet
Am einfachsten ist immer Noch Lua :D
Das einzige was ich kann,war mal in der PSP Homebrew szenen Tätig.
Das ist doch wunderbar. Ich habe mir Lua im Dezember 2006 angeschaut, um es in meine 3D Engine einzubauen. Dazu habe ich das Buch "Programming in Lua", vom "Lua-Vater" Roberto Ierusalimschy persoenlich, fast komplett durchgelesen. Ich kann dieses Buch jedem empfehlen, fuer mich ist "Programming in Lua" eines der besseren Buecher im Programmier-Bereich. Vom Stil her ist es mit "The C Programming Language" vergleichbar was sich dadurch auszeichnet, dass es kein schwerer Schinken ist sondern die Dinge kurz aber klar und verstaendlich erklaert werden ohne langatmig zu sein.

Fuer mich gehoert Lua zu den schoeneren Programmiersprachen, weil man auch hier von einer eleganten Sprache reden kann. Teilweise ist sie vergleichbar mit JavaScript. Lua ist ein Scheme/Lisp mit Pascal/C-Aehnlicher Syntax und hat enormes Potential. Durch den Metatable-Mechanismus ist es sehr einfach eigene Objekt- und Klassensysteme umzusetzen. Allgemein sind Tables in Lua eine sehr wichtige Datenstruktur, auf der vieles in Lua basiert. Und durch die Unterstuetzung von Closures gibt es eigentlich nichts was man sich noch wuenschen wuerde, ausser eine richtige Standardbibliothek, aber dafuer ist Lua als Embedded-Sprache wohl eher nicht gedacht.

Habe lange von der Kombi C+Lua getraeumt, aber bei kleinen Projekten ist es dann doch wieder ein gewisser Overhead und Zusatzaufwand die beiden Welten zu verbinden. (Stichwort Gluecode) Ok, da gibts dann auch wieder Tools wie Swig. Vielleicht ist C+Swig+Lua ein sehr gutes Trio.

Das einzige was mir nicht so gut an Lua gefaellt ist, dass Arrays in Lua bei 1 und nicht bei 0 beginnen. Das wiederspricht eigentlich dem Gedanken der meisten Programmierer, und bringt mich auch in Delphi immer wieder zu verwirrungen.
 
PSN-Name: Papa_Justify
#17
Original von Benny7192
Vielleicht ein kleiner Tipp für Möchtegernprogrammierer, die keinen Bock haben ne Prog.Sprache zu lernen (so wie ich ^^):

RPG Maker [2000/2003/XP] ;)

Nur so nebenbei.
Alter Hut. Aber der RPG Maker ist auf RPGs beschränkt. Es lassen sich zwar auch andere Konzepte damit verwirklichen, aber auch erst seit dem XP mittels Ruby. Und dabei immernoch echt eingeschränkt.

Aber sonst ein cooles Tool. Kann ich nur empfehlen.

www.rpg-atelier.de
 
PSN-Name: radiokidahead
Spielt gerade: GTS, Assetto Corsa
#19
Zu C++, dieses Buch fand ich in meinem früheren kurzem Informatikstudentenleben ganz brauchbar:
http://www.amazon.de/Tagen-Schritt-für-zum-Programmierprofi/dp/3827256240

21 Tage sind natürlich etwas optimistisch, aber wie heißt die Regel für die Ermittlung der Entwicklungsdauer: Geschätze Dauer * 2 und anschließend die Einheit erhöhen. 42 Wochen halte ich für realisitischer...

Gruesse, Pablo
 
#20
ich find RPG maker jetz nich so dolle

Warcraft 3 is immer noch das beste ;) beim maps machen gibts kein ende... :) du kannst ego shooter â la CS machen oder spiele wie Crysis sogar die langweilie start grafiken kann man durch Real Texturen ersetzen die man im internet findet... :) und wenn man JASS kann is das eig programmieren
 
Top