Krautkanal.com

Veröffentlicht am 2014-11-20 20:09:56 in /prog/

/prog/ 6081: Wenn man Java und Groovy ganz gut kann, reichen 2 Monat...

artcalvin Avatar
artcalvin:#6081

Wenn man Java und Groovy ganz gut kann, reichen 2 Monate Vorbereitungszeit, um C soweit von 0 auf zu können, um für eine Bachelorarbeit die Logik für eine Gyroskop-basierte Steuerung programmieren zu können? Die mathematischen Vektor- und Graphen-Grundlagen hat Bernd drauf, nur nicht die Sprache.

saulihirvi Avatar
saulihirvi:#6082

Vermutlich ja. Dum scheinst du ja nicht zu sein.

shadowfreakapps Avatar
shadowfreakapps:#6085

C ist eigentlich einfach, wissen auch nur die wenigsten.

donjain Avatar
donjain:#6086

>>6085
Dies. Wenn Kenntnisse in der imperativen Programmierung vorhanden sind, sollte OP die Grundlagen an einem Tag draufhaben. Dann noch ein paar Tage für Pointer und manuelle Speicherverwaltung (mit dem K&R-Buch) und evtl. eine weitere Woche um die wichtigsten C-Idiome und Programmierstile zu lernen.
Wenn OP dann noch Zeit hat kann er sich ja noch mit Gleitkommazahlen, Undefined Behaviour und dem anderen fortgeschrittenen Jizz-Jazz beschäftigen. Ich empfehle hier das Buch "Deep C Secrets" von Peter van der Linden.

sava2500 Avatar
sava2500:#6087

C ist eine recht simple Sprache. Viele Dinge sind aber sehr mühsam und fehleranfälig und die Lesbarkeit ist auch nicht so besonders toll.
C ein bisschen lernen geht schnell. C beherrschen ist dagegen deutlich schwieriger.

OP wird am meisten darin investieren müssen Pointer und Speicherverwaltung zu lernen. Sowie Idiome wie Rückgabewerte per Referenz und ähnliche Sperenzchen.

karsh Avatar
karsh:#6090

Was man bei C wirklich lernen muss ist das Debugging, sonst doktorst du für Stunden ziellos am code rum und immer passiert was anderes, weil gerade der stack überschrieben wird.

sketi_ndlela Avatar
sketi_ndlela:#6091

Bernd würde eigentlich empfehlen (sofern auf der Zielplattform auch Java läuft), in C nur eine möglichst simple API für die benutzte Hardware zu implementieren, die aus der JVM erreichbar ist. Ist eigentlich gar nicht so schwierig, aber "C können" muss man dann halt trotzdem. Dafür spart man es sich dann, die restliche Anwendung in C schreiben zu müssen, und greift darauf zurück, was man bereits kennt.

lanceguyatt Avatar
lanceguyatt:#6094

>>6090
Debuggen zu können ist eine Sache, sich mit dem Compiler zu befassen ist aber auch wichtig. Denn dann muss in einigen Fällen gar nicht mehr gedebuggt werden oder es fällt leichter.

Wenn du GCC, Clang, oder einen ähnlichen Compiler verwendest:

1. Gib immer den C-Standard an! eine gute Wahl momentan ist -std=c99. Wenn du das nicht machst, dann entscheidet der Compiler das für dich. Bei GCC ist das aktuell gnu90, bei Clang gnu99, und ab der nächsten GCC- und Clang-Version ist es gnu11. Du siehst nun, warum du den angeben solltest.
Das gnu anstelle von c hat zur Folge, dass mit dem C-Standard inkompatible Erweiterungen (sizeof(void)==1) aktiviert werden. Manche sind nützlich, je nachdem was du vorhast,, manche weniger.

2. Aktiviere und behebe Warnungen! Das Minimum ist -Wall, welches nicht alle Warnungen aktiviert. -Wextra aktiviert einige andere, ist aber von Compiler zu Compiler unterschiedlich, jedoch sind die Warnungen eigentlich fast immer hilfreich.
-Wpedantic, wie der Name vielleicht schon andeutet, führt dazu, dass bei allen noch aktiven verwendeten Erweiterungen und Code, der zwar in der Praxis portabel ist, aber der Standard eben etwas striktes für noch mehr Portabilität vorschreibt, gewarnt wird. Z.B. der Formatspezifizierer p bei printf() erwartet void*, nicht int*.

3. Wenn du Clang oder einen aktuellen GCC verwendest, kannst du den AddressSanitizer (-fsantize=address) verwenden. Der detektiert Speicher-relatierte Fehler wie stack overflow. Unter Linux x86_64 können auch Speicherlecks gemeldet werden. Ansonsten leisten Tools wie Valgrind ähnliches. Zudem gibt es auch noch andere Sanitizer, u.A. UBSan (-fsanitize=undefined).

terpimost Avatar
terpimost:#6095

>>6094
ok, danke für den hinweis

a_khadeko Avatar
a_khadeko:#6096

Eine Pupsisprache wie C lernt man an einem Tag. Lange braucht es für die dazugehörigen Werkzeuge und Bibliotheken. Für Steuerung musst du dich vielleicht noch mit Echtzeitsystemen auskennen.

likewings Avatar
likewings:#6098

Sofern du die Grundlagen wie Pointer, dynamisches Speichermanagement und Listen ordentlich kapiert hast, ist es eigentlich ganz einfach.

sgaurav_baghel Avatar
sgaurav_baghel:#6099

>>6094
>sizeof(void)==1

Fastehe nicht
Kannst du elaborieren?

saulihirvi Avatar
saulihirvi:#6101

>>6099
Habe nachgelesen und fastanden

bouyghajden Avatar
bouyghajden:#6104

>>6101
Ist immer praktisch, wenn die Leute das dann nicht erklären. Nicht, dass es mich hier im speziellen interessiert, mir ist das nur allgemein aufgefallen. Wenigstens ein Elfenjunge wäre oft Hilfrein. Auch wenn man das hier durch einfaches googlen schnell finden wird.

samscouto Avatar
samscouto:#6105

>>6104
Hätte ich getan, wäre mir ein Beispiel eingefallen, wofür man es denn braucht. Bin ja auch nur Studentenkrebs.

Aber Gottseidank gibts Stackoverflow

http://stackoverflow.com/questions/10551822/why-does-sizeofvoid-1

zl;ng

>The reason why void needs a size to perform such arithmetics is that ptr - ptr2 does not actually gives you the numeric difference of the addresses but the number of elements the two pointers are apart - and the size of an element pointed to by void *ptr is sizeof(*ptr) which is sizeof(void).

Neuste Fäden in diesem Brett: