Kurs Diskussion:Wie funktioniert eigentlich ein Computer/C Kurs
Fragen zu Lektion 1
BearbeitenJannick: Wenn man auf Download bei der Ubuntu Seite klickt, erscheinen zwei verschiedene Versionen. Welche von den beiden Versionen (12.04; 13.04) soll ich installieren?
- Das ist eigentlich egal. 12 steht fuer 2012 und 04 fuer April. Ubuntu bringt alle 6 Monate eine neue Version aus. Die Versionen 12.04, 10.04, 8.04 und so weiter gelten als Long term Stable. Was das bedeutet, kann man unter diesem Link nachlesen. In dem Sinne empfehle ich euch die Version 12.04. Fuer die arbeit im kurs wird es jedoch wenig Unterschied machen, ob ihr Ubuntu 13.04 oder 12.04 installiert habt. --Renepick (Diskussion) 23:04, 26. Mai 2013 (CEST)
Ausserdem hatte Hendrik noch eine Frage: Bei der Wubiinstallation fragt der nach nem Installationslaufwerk: Kann ich dort getrost meine Festplatte angeben, oder formatiert der die dann? Ach und vor einiger Zeit hab ich die Datei „ubuntu-12.04.2-desktop-i386.iso“ runtergeladen und mit UNetBootin wie von SemperVideo (https://www.youtube.com/watch?v=Ma7HDPhYbM8) beschrieben, auf nen Leeren Stick kopiert aber mein Laptop will nicht von dem Stick booten... Ich habe folgendes vermutet: "Die normale Festplatte waehlen sollte bei Wubi kein Problem sein weil Wubi dann auf der Festplatte in einem Ordner eine grosse Datei anlegt und in dieser Datei dann dein ganzes Linuxsystem speichert. 100% sicher bin ich mir allerdings nicht weil ich ausschliesslich mit Linux unterwegs bin." Leon hat dazu noch angemerkt: "Bei Wubi habe ich keine Ahnung was mit Installationslaufwerk gemeint ist, da wäre ich spontan vorsichtig mit der Festplatte. Ich kann das aber mal checken. USB Sticks müssen bootable sein. Der Link kann helfen: http://www.chip.de/artikel/USB-Stick-bootfaehig-machen-So-geht-s_12823773.html
" Da wir also beide ratlos sind, wuerde wir uns freuen, wenn das jemand bestaetigen koennte! Schliesslich scheint bei allen anderen die Installation mit Wubi funktioniert zu haben. --Renepick (Diskussion) 23:04, 26. Mai 2013 (CEST)
Hendrik: Tut mir leid, schon lezte Woche habe ich einfach auf die Festplatte installiert, hatte aber keine Zeit, das euch zu schreiben. Jetzt fragt der Bootmanager beim Starten, ob ich Win XP Pro oder Ubuntu haben will, ich kann die Installation auf Festplatte nur empfehlen. Achtung!! : Wenn ihr euer Ubuntu mit dem Passwort "abc" o.ä. schützt (zu Testzwecken), aber nicht auf Sicherheit verzichten wollt, dann legt euch ein Bootkennwort an, weil das Passwort in Windows sonst völlig sinnfrei wäre...
Fragen zu Lektion 2
Bearbeiten- Ich habe die Schritte aus dem Video befolgt. Sobald ich jedoch bei dem Schritt "M-x compile" bin und dann bei "make -k" enter drücke, erscheint bei mir eine Fehlermeldung. Angeblich soll ein Begrenzungszeichen fehlen, jedoch finde ich keinen Fehler. Was soll ich machen?
makefile:
hello:hello.c
gcc hello.c -o hello</pre>
hello.c:
#include <stdio.h>
int main(int argc, char** argv){
printf("\nHallo ich bin ein Computerprogramm und heise: %s\n",argv[0]);
return 0;
}
- Hallo Jannick wie du in dem unten angehaengten Video sehen kannst, lag der Fehler in der makefile. Fuer einen Menschen sah sie zwar korrekt aus, aber ein Computer macht eben einen Unterschied zwischen einem Tabulator und 8 Leerzeichen. Das Ganze stand aber wie du in dem Video sehen kannst auch recht deutlich in der Fehlermeldung. Zwei Bitten noch an dich und alle anderen:
- Wenn ihr Fehler habt dann postet bei euren Fragen immer gleich hier und vor allem haengt den Inhalt der datei mit an! (So wie ich es nach einem Kurzen emailverkehr mit Jannick nachgeholt habe.)
- Wenn ihr eine Frage stellt, dann signiert eure Antwort im Wiki doch einfach. Das funktioniert ganz leicht durch eingabe von --~~~~ beste Gruesse --Renepick (Diskussion) 21:54, 26. Mai 2013 (CEST)
- Hendrik: Also mir ist der Emacs-Editor viiiiiiiiieeeeeel zu umständlich und kompliziert.
Ich habe mir "Sublime Text 2" installiert, geh dann in der Konsole in das Verzeichnis der c-Datei, mach "gcc hallo.c -o hallo" und fertig. Der Vorteil von Sublime Text ist, dass man ihn auch komplett über die Tastatur steuern kann, er eine grafische Oberfläche hat, und er auch andere Syntaxhervorhebungen unterstützt.
- Hallo Hendrik, ich kann deinen Unmut ueber Emacs total nachvollziehen. Dieser Editor hat eine zugegeben sehr hohe Einstiegsbarriere. Leon und ich haben uns jedoch vor dem Beginn des Kurses abgesprochen und uns fuer Emacs entschieden. Wir sind der Meinung, obwohl wir beide keine Emacs Nutzer sind, dass wir niemanden kennen, der schneller und effizienter Texte verarbeiten kann als geuebte Emacs Anwender und es somit sinnvoll ist, diesen Editor nebenbei zu erlernen. Fuer Leon und mich ist es ok, wenn du mit einem anderen Editor arbeitest. Jedoch wirst du keinen Support von Leon oder mir oder den anderen Teilnehmern erwarten koennen. Insbesondere wird jetzt eh vieles neu sein und da bietet es sich bei dem Umstieg natuerlich an gleich die "richtigen" tools zu lernen --Renepick (Diskussion) 22:43, 31. Mai 2013 (CEST)
Würde mich mal interessieren warum man int main schreibt und nicht einfach void main (habe jetzt mal void genommen, da es ja bei java auch so ist). Was kann man noch mit der zurückgegebenen 0 anfangen oder wofür braucht der computer die ? Und kann man das ** als Array interpretieren ? --Frank bp (Diskussion) 16:39, 30. Mai 2013 (CEST)
Fragen zu Lektion 3
Bearbeiten- Hendrik: Ich versuche gerade ein Programm von unserem Taschenrechner nach C zu portieren. Ich versuche das ohne Labels und Gotos. Es ist ein Trigonometrieprogramm. (Dreiecksberechnung) Dafür muss der Benutzer Zahlen eingeben. Das mache ich mit scanf("%d", seiten); Wenn der Benutzer aber einen Buchstaben eingibt, dann rauscht die Whileschleife einfach durch und scanf() wird nicht ausgeführt.
Kompilieren muss übrigens wegen der Mathe-Bibliothek mit "gcc trigonom.c -o trigonom -lm" (lt. Internet) Quellcode:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char** argv) {
int seiten;
int weiter; //eigentlich bool, aber das gibts nicht D:
weiter = 1;
while(weiter == 1) {
printf("== GEGEBEN ===================\n");
printf(" 1 | 1 Seite + 2 Winkel\n");
printf(" 2 | 2 Seiten + 1 Winkel\n");
printf(" 3 | 3 Seiten\n ");
scanf("%d", &seiten);
if(seiten < 1 || seiten > 3) {
printf("Fehlerhafte Eingabe!\n\n");
} else {
printf("\n");
weiter = 0;
}
}
return 0;
}
- Hallo Hendrik, ich bin mir nicht so ganz sicher, was ich zu deinem Beitrag sagen soll! Das Trigonometrie Programm scheint mir zunaechst nicht so viel mit unserer C Einfuehrung zu tun zu haben. Ich habe das Programm kompiliert und es funktioniert bei mir super. Es sei denn (genau wie von dir beschrieben) ich gebe einen Buchstaben anstatt einer Zahl ein. Ich vermute deine Frage zielt darauf ab, warum das so ist und was man dagegen machen kann? Falls ja, wuerde ich dich bitten mal eine kleine Version des Programms zu erstellen, bei der du den Trigonometrie Part weg laesst, mit scanf eine Zahl einliest, es aber zu Problemen mit der Eingabe kommt. Wenn du am besten noch einen kleinen Screencast aufnimmst in dem du das Problem und die Frage erklaerst, dann kann ich im 5. Teil unseres C-Kurses darauf eingehen. Ich kann dir gerne vorab eine Loesung geben, wie man den "Fehler" behebt, aber in unserem Kurs geht es jedoch um das Verstehen und da brauchen wir halt erst Lektion 4 Pointer und insgesamt eine tieferes Verstaendnis ueber Datentypen in C. --Renepick (Diskussion) 18:18, 6. Jun. 2013 (CEST)
- Hi Rene, wie arbeitet scanf() eigentlich intern? --Hendrikf (Diskussion) 17:21, 14. Jun. 2013 (CEST)
Fragen zu Lektion 4
BearbeitenHanna: Wie ist die letzte Frage genau gemeint? Eigentlich kann ein char Pointer doch nur auf einen Speicherplatz zeigen und damit nur auf einen Buchstaben. Und wenn man einen char-Array Pointer erstellt, hat der mehr als eine Integer Information (eine pro Speicherzelle) und wir sollen nur eine angeben!? - Hanna Brudermann (Diskussion) 16:55, 10. Jun. 2013 (CEST)
- Hallo Hanna, danke fuer deine Frage und sorry fuer meine spaete Antwort. Du beobachtest schon ganz richtig, dass ein charpointer nur auf eine Speicherzelle zeigen kann. Um ein Array zu bekommen, kannst du den pointer aber erhoehen, genau wie ich das mit dem Integer Array erklaert habe. In meinem Video bin ich bei einem Integeger davon ausgegangen, dass das erhoehen des Pointers immer um 4 Speicherzellen bzw. um eine 4 Byte lange Speicherzelle weiter geht. Wenn du jetzt also einen Integer der 4 Byte lang ist hast, kannst du durch Dereferenzierung seine Adresse erhalten. und kannst diese mit hilfe eines Typcastes einem charpointer zuweisen. Das interessante ist dass chars nur 8 Bit lang sind und du aus dem Integer ein Array von 4 Chars bekommen hast. Insbesondere kannst du den char pointer 4 mal erhoehen bis du am ende des Integers angekommen bist. Entsprechend muss es genau einen Integer geben, dessen Wert im Computer genau die Zeichenkette "dsa\0" codiert. Hilft dir das weiter? --Renepick (Diskussion) 22:46, 11. Jun. 2013 (CEST)
pointer arithmetik
Bearbeiten- http://www.youtube.com/watch?v=h-HBipu_1P0
- tutorialspoint.com/cprogramming/c_pointer_arithmetic.htm
- http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html
- http://en.wikipedia.org/wiki/Pointer_(computer_programming)#C_and_C.2B.2B
- http://www.peace-software.de/ckurs12.html → Die Seite erklärt die Funktion und allgemein das Nutzen von Pointern verständlich. Sie bietet einen guten Überblick, besonders da alles schrittweise erklärt wird.--Jannickf (Diskussion) 13:35, 8. Jun. 2013 (CEST)