Probleme bei C Programmierung

Hallo,
ich habe vor ein paar Tagen ein Buch (GoTo C Programmierung von Guido Krüger, 1991) über Programmieren mit C gekauft und habe angefangen C zu lernen. Dazu habe ich jetzt ein paar Fragen.
In dem Buch gibt es eine CD mit einem Compiler drauf GNU-C 2.7.2. Da mein CD-Laufwerk kaputt ist, habe ich mir einfach einen Compiler aus dem Internet runtergeladen. GNU-C 2.7.2 konnte ich nicht finden, von daher habe ich mir Code::Blocks runter geladen.

Wenn ich jetzt einige Beispiele aus dem Buch abtippe, und in Code::Blocks starte, kommt manchmal ein anderes Ergebnis raus, als das was im Buch beschrieben wird. Manchmal startet das Programm auch gar nicht. Ein Programm hat beispielsweise erst falsche Werte ausgegeben, als ich es dann später noch mal abgeschrieben habe, um sicher zu gehen, dass ich keinen Tippfehler drin habe, startete es gar nicht mehr. Hier das Beispiel Programm. Es soll checken, ob in der Bitdarstellung der eingegebenen Zahl 3 Einsen nebeneinander stehen. Es lässt sich nicht Compilieren. Wennich es Compilieren will kommt die Fehlermeldung:

Code:
error: `main' must return `int'|
||=== Build finished: 1 errors, 0 warnings ===|

Hier der Programmtext
Code:
#include<stdio.h>

void main(void)
{
    int zahl, einsen, i;
    printf("Geben sie eine Intzahl ein:\n");
    scanf("%d",&zahl);
    einsen=0; i=8*sizeof(int);
    while (i-- && einsen<3){
        einsen=(zahl&1)? einsen+1:0;
        zahl>>=1;
    }
    einsen>=3?
    printf("Drilling!\n"):
    printf("Kein Drilling");
}

Wenn ich die Zeile mit Int am Anfang vor die geschweifte Klammer ziehe kommt die gleiche Meldung.

Bevor dieser Fehler aufgetreten isr, ich das Programm also starten konnte, hat es auch nicht funktioniert, sondern einfach immer behauptet, dass es einen Bitdrilling gäb, auch wenn das nicht so war. Woran kann das liegen?
Kann es sein dass die Beispiele in dem Buch nur für den GNU-C Compiler von 1991 gedacht sind und auf neueren Compilern wie dem aktuellen Code::Blocks nicht funktionieren?
Oder ist es einfach ein Druckfehler im Buch? Wie müsste der Programmtext dann lauten?

Ein anderes Problem was ich habe ist das Debuggen. Zuerst habe ich, immer wenn ich ein neues Prog schreiben wollte, einen neuen File geöffnet.
Da konnte ich die ganzen Debug symbole nciht anklicken, weil sie grau hinterlegt waren. Auch auf Project>Building Options konnte ich ncihts einstellen, weil building options auch grau hinterlegt war.
Ich habe dann im Internet gelesen, dass ich einfach ein Project starten soll, dann kann man die Debugdinger verwenden. Das stimmt auch soweit. Ich kann die jetzt alle anklicken. Ich hab dann auch die Building Options so eingestellt wie empfohlen. Das Problem war nur, dass ab da alle Programme die ich bisher geschrieben hatte, die ich dann in das Project geladen habe, nciht mehr funktioniert haben. Die ließen sich zwar compilieren und starten, aber sobald man einen Wert eingegeben hat, ist das Programm abgestürzt.
Das wäre also die erste Frage, wieso die Programme immer abstürzen, wenn sie in ein Project geladen werden und was man dagegen machen kann, bzw. ob man die Debugfunktionen auch in normalen Files verwenden kann.

Die andere Frage bezieht sich auf die Debugfunktionen. Ich habe bisher nur Erfahrungen mit VBA. Da bin ich das von der Debugfunktion so gewohnt, dass ich einen Punkt setzen kann und dann das Programm zeile für Zeile ablaufen lassen kann und so dann z.B. alle Werte die Variablen nach dieser Zeile haben abchecken kann. Die Punkte kann ich zwar in C::B auch setzen, aber ansonsten kann ich mit den Debug Funktionen sehr wenig anfangen. Da kommt für mich nur unverständliches Zeug oder gar nichts.
Kann mir vielleicht einer die Debugfunktionen erklären, oder kennt ihr eine Seite wo das (am besten auf Deutsch) erklärt wird?

Also alles in allem muss ich sagen, dass ich Code::Blocks ziemlich unübersichtlich finde. Ich habe bisher aber keinen Besseren Compiler gefunden. Sollte ich vielleicht den Compiler wechseln? Oder sind alle Compiler so und ich sollte mcih besser einfac nur an C::B gewöhnen?

Zudem ist mir aufgefallen, dass C ziemlich kompliziert ist für Allgemeine Programmier-Neueinsteiger (meine VBA Kenntnisse sind sehr gering).
Bei vielen Dingen weiß ich gar nicht was damit gemeint ist. Z.B. diese ganzen Sachen mit Zeigern usw. Ich habe mir jetzt zwar noch ein Buch über EDV-Grundlagen geholt, wo auch die ganzen Mathematischen Sachen erklärt werden, wie Binärsystem usw. aber trotzdem sind da teilweise echt schwer nachvollziehbare Sachen bei.
Von daher habe ich überlegt, ob ich vorher vielleicht eine andere Sprache lernen soll, die einfacher ist, wo ich dann erst mal einfacher verstehen kann, was ich da überhaupt programmiere. Dabei dachte ich dann an Java oder C++. Die wollte ich sowieso lernen, aber eigentlich erst nach C, weil man mir gesagt hat, dass C die Grundlage wäre.
Meine Zielsetzung ist das Programmieren von Ingenieurwissenschaftlichen Programmen. Außerdem will ich mit wachsenden Kenntnissen auch anfangen Programmiertechnische Experimente durchzuführen. Von daher dachte ich C wäre auch gut dafür geeignet, weil man so näher an der Hardware programmieren kann und so damit nichts was die Ergebnisse irgendwie verfälschen könnte ohne, dass man es weiß, zwischen dem Programm und der Hardware steht.

Ich fasse noch mal alle meine Fragen zusammen:
1)Geben alle Compiler unabhängig von ihrem Alter bei gleichem Programmtext das gleiche aus?
2)Wie bekomme ich das gepostete Programm ans laufen?
3)Warum wirft das Programm die falschen ergebnisse aus?
4)Wie kann ich auch in Files die Debugfunktionen nutzen?
5)Wie benutze ich die Debugfunktionen?
6)Warum funktionieren meine alten (File)Programme nciht, wenn ich sie in ein Project lade?
7)Gibt es bessere, übersichtlichere Compiler als Code::Blocks?
8)Wäre es bei meiner Zielsetzung sinnvoller erst mal Java oder C++ zu lernen um grundlegende Programmierkonzepte zu lernen, oder soll ich an C dran bleiben und vielleicht ein weiteres Buch lesen, wo Grundlagen der Programmierung erklärt werden?
9)Wenn ich an C dran bleiben soll welches Buch könnt ihr für Programmiergrundlagen empfehlen?
10)Wenn ich besser erst Java oder C++ lernen soll, was soll ich dann von beidem lernen?

Ich hoffe ihr könnt mir da helfen.
Vielen Dank schon mal im Voraus =)
 
1)Geben alle Compiler unabhängig von ihrem Alter bei gleichem Programmtext das gleiche aus?
Nein, die Fehlermeldungen können sich von Compiler zu Compiler und Version zu Version unterscheiden.

2)Wie bekomme ich das gepostete Programm ans laufen?
Indem du nicht 'void main(void)' verwendest, sondern 'int main(void)' und mittels return am Ende einen richtigen Rückgabewerte definierst, z.B. 'return 0;'.

6)Warum funktionieren meine alten (File)Programme nciht, wenn ich sie in ein Project lade?
Bei Projekten werden zumeist schon Skeletons von der IDE festgelegt, die oft eigene main-Funktionen usw. enthalten.

7)Gibt es bessere, übersichtlichere Compiler als Code::Blocks?
Code::Blocks ist kein Compiler, sondern eine IDE. Davon gibt's diverse. Inwiefern sie übersichtlicher sind, dürfte Geschmackssache sein. Am einfachsten installierst du dir erstmal einen reinen Compiler wie GCC, einen Debugger wie GDB und einen Text-Editor mit Syntax-Highlighting. Dann lernst du wenigstens auch die Grundlagen und erfährst so, was im Hintergrund bei so einer IDE abläuft.

8)Wäre es bei meiner Zielsetzung sinnvoller erst mal Java oder C++ zu lernen um grundlegende Programmierkonzepte zu lernen, oder soll ich an C dran bleiben und vielleicht ein weiteres Buch lesen, wo Grundlagen der Programmierung erklärt werden?
Da ich das Buch nicht kenne, ist das schwer zu sagen. Ein Umstieg auf eine andere Sprache dürfte dir aber vermutlich recht wenig helfen. Wichtig ist, dass du nicht einfach Code abtippst sondern auch verstehst, was dieser Code bis in's Detail tut.

9)Wenn ich an C dran bleiben soll welches Buch könnt ihr für Programmiergrundlagen empfehlen?
Schau mal in Galileo Computing :: C von A bis Z rein. Das wird von den meisten Anfängern gern genommen, da es sich an ANSI-C-Standards hält, die systemübergreifend funktionieren.

10)Wenn ich besser erst Java oder C++ lernen soll, was soll ich dann von beidem lernen?
In heutiger Zeit macht es durchaus Sinn mit einer objektorientierten Sprache anzufangen, um die Konzepte der Objektorientierung von Anfang an zu verinnerlichen. Mit C++ würdest du auch gleich C lernen, während Java sich in einigen Dingen sehr stark von C/C++ unterscheidet. Du solltest dir aber zuerstmal die Frage stellen was du in Zukunft programmieren willst. C wird zumeist nur noch in der Systementwicklung verwendet. C++ braucht man vor allem in Performance-kritischen Bereichen und wenn der Entwickler möglichst viel Kontrolle über das Speicherverhalten seiner Programme braucht oder will. Java hingegen nimmt dem Entwickler durch eine sehr umfangreiche Klassenbibliothek, Garbage-Collector usw. viel Arbeit ab und Java-Programme kann man systemübergreifend verwenden, ohne grossartig portieren zu müssen.

Auf deine Fragen zu Code::Blocks kann ich leider sonst kaum eingehen, da ich diese IDE nicht kenne.
 
Ich fasse noch mal alle meine Fragen zusammen:
1)Geben alle Compiler unabhängig von ihrem Alter bei gleichem Programmtext das gleiche aus?
2)Wie bekomme ich das gepostete Programm ans laufen?
3)Warum wirft das Programm die falschen ergebnisse aus?
4)Wie kann ich auch in Files die Debugfunktionen nutzen?
5)Wie benutze ich die Debugfunktionen?
6)Warum funktionieren meine alten (File)Programme nciht, wenn ich sie in ein Project lade?
7)Gibt es bessere, übersichtlichere Compiler als Code::Blocks?
8)Wäre es bei meiner Zielsetzung sinnvoller erst mal Java oder C++ zu lernen um grundlegende Programmierkonzepte zu lernen, oder soll ich an C dran bleiben und vielleicht ein weiteres Buch lesen, wo Grundlagen der Programmierung erklärt werden?
9)Wenn ich an C dran bleiben soll welches Buch könnt ihr für Programmiergrundlagen empfehlen?
10)Wenn ich besser erst Java oder C++ lernen soll, was soll ich dann von beidem lernen?

Ich hoffe ihr könnt mir da helfen.
Vielen Dank schon mal im Voraus =)
1) Nein. Gibt auch Compiler spezifische Sachen. Gerade bei dem MSVC++ (Microsoft Visual C++) Compiler.

2) Es sollte heißen:
Code:
 int main () { ...
}
Dazu sollte wie Fehlermeldung sagt vor der "}" noch ein "return 1;". Den Quellcode im Detail hab ich mir jetzt nicht mehr angeguckt.

7) Leider ist dein erster Fehler schon der, dass du denkst Code::Blocks ist ein Compiler. CB ist nur eine IDE und dort ist IMO als Standard Compiler GNU-GCC eingestellt (oder war es mingw?). Schau dir bitte erstmal die Grundlagen an: Was ist ein Compiler und was eine IDE?

8)9)10) Naja. Java wäre sicherlich einfacher. C++ nicht. Problem ist, wenn du mit C++ direkt arbeitest und dort eventuell mit Code anfängst der C Funktionen (was gerne mal der Fall ist) benötigt, dann fängste an von C++ Klassen zu C Datentypen zu casten, dass endet dann im Prinzip in noch komplexeren Sachen als du in C hast + Objektorientierung, weil das nunmal der wesentliche Unterschied zwischen C und C++ ist. Ich würde sagen: Mach einfach mit C weiter. Wenn es dir wirklich viel zu schwer ist, dann lerne erstmal Java und lerne Grundlagen über Klassen und Objekte. Die Syntax ist sehr ähnlich zu C/C++, wenn du dann Pointer verstehst kannste auch recht schnell was in C/C++ schreiben. Man benötigt dann aber oft Hilfe, weil Java viel mehr Funktionen bzw. diese oft viel kompakter anbietet.

EDIT: Da war wohl jemand schneller. Als IDE könnte ich übrigens auch noch Eclipse CDT empfehlen.
 
Zuletzt bearbeitet:
Zum Thema Debugging:
Wenn du in C::B die Debug Symbole setzt (Project-Type muss auch Debug und nicht Release sein) , dann musst du , um diese zu verwenden, mit [Debug -> Start] starten.
Der Debugger hält dann an dem Stellen , die du markiert hast , und du kannst dich Zeile für Zeile , o.ä. durch den Code klicken(/hotkeyen :D ).
Währenddessen kannst du sog. watches auf Variablen setzen(Rechtsklick -> Set Watch (oder so)). Dann gibt es noch in der Debug-Leiste eine Option , in welcher du das Fenster mit diesem Watches anzeigen lassen kannst. Dort kannst du dann auch auf Binär,Hex oder Octal umschalten.

Ich hoffe ich hab jetzt nicht mit Kanonen auf Tauben geschossen und du kannst damit was anfangen.

Viele Grüße
nt0r
 
Zurück
Oben