Anfängerproblem mit C

WoSoft schrieb:
"Es ist nicht nur nicht erforderlich, zuerst C zu lernen, sondern auch eine schlechte Empfehlung."
---8<---
--->8---
Mit eine Array-Klasse in C++ kann man so etwas ausschließen.

Na "C" ist halt Assembler mit IF/THEN/ELSE . . . also was für echte Machos :cool:

Meine persönliche Meinung zu C++ ist ziemlich vernichtend, aber die Bücher darüber möchte ich hier nicht wiederholen.
Wenn man wirklich OO-Techniken lernen will sollte man sich lieber mal Smalltalk anschauen.
Selbst Java & Co sind dagegen schon ziemlich hybrid (wenngleich sie für den täglichen Einsatz deutliche Vorteile haben).


Gruß,

?=?
 
Hab den geposteten Code compiliert unter Linux gcc

Hatte dann das gleiche Problem wie du

hab dann das fflush durch

void clear_stdin()
{ int re=0;
do
{ re=getchar();
}while( re !='\n');
}

ersetzt dann lief es
 
?=? schrieb:
Na "C" ist halt Assembler mit IF/THEN/ELSE . . . also was für echte Machos :cool:

Meine persönliche Meinung zu C++ ist ziemlich vernichtend, aber die Bücher darüber möchte ich hier nicht wiederholen.
Wenn man wirklich OO-Techniken lernen will sollte man sich lieber mal Smalltalk anschauen.
Selbst Java & Co sind dagegen schon ziemlich hybrid (wenngleich sie für den täglichen Einsatz deutliche Vorteile haben).


Gruß,

?=?

Wenn man für den Mac programmiert, sollte man Cocoa/Objective-C wählen, übrigens ANSI-C mit einer Smalltalk-Erweiterung samt dem Zwang, wirklich objektorientiert zu arbeiten.
 
Wenn ich die fflush durch ein getchar() ersetze sagt der Xcodedebuger : parse error before "if"

@wosoft was soll den deiner meinung nach veruchen? (ich weiß ich nerv und ich hab mir den c,c++,Java-thread schon durchgelesen, bin aber immer noch nicht schlauer)
Ich möchte eigentlich mal schauen, dann so einfache Sachen machen und wenn es dann klappt mal weiter sehen. (als gernespieler natürlich gerne spiele oder so) Aber ich habe keine speziellen Vorstellungen. Es sollte aber schon möglichst auf Apple abgestimmt sein. Wenn portierbar wäre wärs aber auch toll. Ich denk mal am Anfang ist Geschwindigkeit auch nicht soi wichtig.
Tospa
 
Topsa schrieb:
Wenn ich die fflush durch ein getchar() ersetze sagt der Xcodedebuger : parse error before "if"


Tospa

ich glaub du hast das ; (Semikolon) hinter getchar vergessen

also getchar();
 
Topsa schrieb:
Wenn ich die fflush durch ein getchar() ersetze sagt der Xcodedebuger : parse error before "if"

Sorry für die Haarspalterei, aber da meckert der Compiler, nicht der Debugger ;)
Wahrscheinlich fehlt das Semikolon [edit]hinter[/edit] dem getchar() . . .

Als weiteren Schritt solltest du den Tipp von vava in Betracht ziehen.


Gruß,

?=?
 
@ ?=? was sind den nu OO-Techniken? Ich dreh durch!!

VAVA!!! ENDLICH!! Danke für den Tipp!!! Es hat geklappt!
Aber mal ganz sachlich: Seh ich das richtig, das ich C aufgeben soll und was anderes nehmen soll?
 
Bezüglich deines ursprünglichen Codes, so funktioniert es auch

Code:
#define Fflush(int_keyboard_buffer)\
while(( (int_keyboard_buffer) = getchar()) != '\n')


#include <stdio.h>

int main()
{
int a,b,check,std;

printf("Bitte zwei Zahlen eingeben: ");
check=scanf("%d %d",&a,&b);
Fflush(std); /* Unter Linux entfernen VAVA: hier kannst du das obige Makro verwenden Fflush ist nicht fflush 
//getchar() /* für Linux */ 
/* Bei check istgleich 2 wahr die Eingabe richtig */
if(check==2)
printf("Beide Zahlen richtig %d und %d\n",a,b);
/* … nicht richtig, also wahr die 2. Zahl falsch */
else if(check==1)
{
printf("Die 2.Zahl hat das falsche Format!!\n");
printf("Bitte Eingabe wiederholen: ");
/* noch ein Versuch */
check=scanf("%d",&b);
Fflush(std);
if(check)
printf("Eingabe Ok. Ihre Zahlen %d %d\n",a,b);
else
printf("Leider nochmals falsch\n");
}
else
printf("Die Erste oder beide Eingaben waren falsch!\n");
return 0;
}

Das Programmbeispiel geht davon aus das du unter Windows oder Linux arbeitest. fflush(stdin) dürfte auch unter Windows funktioniert.
Unter Linux (Und den anderen *NIX inkl MacOSX) leert fflush() nur Ausgabeströme (stdout) nicht Engabeströme(stdin).

Ich könnte mich aber auch täuschen.(Einige haben dass doch unter Xcode
zum laufen gebracht)

OO-Techniken sind ObjektOrientierte Programmiertechniken
 
WoSoft schrieb:
Wenn man für den Mac programmiert, sollte man Cocoa/Objective-C wählen, übrigens ANSI-C mit einer Smalltalk-Erweiterung samt dem Zwang, wirklich objektorientiert zu arbeiten.

tja, damals, Ende der Achtziger Jahre des letzten Jahrhunderts hat sich leider die falsche Sprache durchgesetzt . . .
Meine Kenntnis von Objective-C beschränkt sich leider darauf, dass die Methodenaufrufe eine Smalltalk-ähnliche Syntax haben.

Objective-C ist sicher die erste Wahl, wenn man nativ für OS X entwickeln will.
Für plattformübergreifendes würde ich Java vorziehen.
Und zum lernen von OO-Konzepten empfehle ich Smalltalk. Da hat man's wirklich mit OO pur zu tun. Keine Memory-Probleme wie in C++, keine Arrays wie in Java, nicht mal primitive Datentypen oder IF/THEN/ELSE.
*Alles* sind Objekte!
Auf den ersten Blick wirkt das befremdlich, aber es sorgt dafür, dass die gesamte Syntax auf eine DIN A4 Seite passt und somit sehr schnell zu erlernen ist.


Gruß,

?=?
 
Topsa schrieb:
@ ?=? was sind den nu OO-Techniken? Ich dreh durch!!

VAVA!!! ENDLICH!! Danke für den Tipp!!! Es hat geklappt!
Aber mal ganz sachlich: Seh ich das richtig, das ich C aufgeben soll und was anderes nehmen soll?

C kann nicht schaden, aber denke dich nicht zu tief hineine, lerne nur die Syntax. In C++ sähe das Beispiel verkürzt so aus:
Code:
#include <iostream>
using namespace std;

int main()
{
   int zahl1, zahl2;
   cout << "Geben Sie 2 Zahlen ein: ";
   cin >> zahl1 >> zahl2;
   if(!cin)
		cout << "Mindesstens eine Eingabe keine Zahl";
	else
		cout << "Ihre Eingaben: " << zahl1 << " und " << zahl2;
	return 0;
}

Ansonsten schau dir doch mal Cocoa an, sozusagen die Mutttersprache von OS X. Unter
www.osxentwicklerforum.de
im Download-Bereich habe ich mit Cocoa-Einstieg eine Einführung bereitgestellt.
 
Was ist den jetzt Smalltalk? Und sollte man OO oder textorientiert anfangen?
 
Topsa schrieb:
@ ?=? was sind den nu OO-Techniken? Ich dreh durch!!

VAVA!!! ENDLICH!! Danke für den Tipp!!! Es hat geklappt!
Aber mal ganz sachlich: Seh ich das richtig, das ich C aufgeben soll und was anderes nehmen soll?

"OO-Technik" ist eine bestimmte Sichtweise auf die Modell-Welt, die du mit deinem Programm schaffts.

Das obige Beispiel ist "klassisch prozedural", d.h. man geht von einem Prozessor aus, der Befehle, die auf passive Datenelemente (=Variablen) wirken (Variablen setzen, etc.).
Entscheidend ist hier der gedankliche Ansatz der passiven Daten und des aktiven Prozessors (=abstrakte Verarbeitungsinstanz, nicht konkret Inte P4, AMD, PPC, etc.).

Bei der Objektorientierten (=OO) Sichtweise geht man von abstrakten Einheiten (eben den Objekten) aus, die nicht nur wie Variablen Daten enthalten, sondern auch in einer definierten Art und Weise auf "Reize" aus ihrere Umgebung (=Methodenaufrufe) reagieren können.
Es gibt nicht mehr den Prozessor, mit dem alles kontrolliert wird, sondern jedes Objekt ist in gewisser Weise eigenständig.

Man baut seine Modell-Welt eben aus anderen Bausteinen.

Soviel zu "OO in a micro nutshell" :cool:
Darüber gibt es viele Bücher, deren Autoren das besser erklären können, als ich (leider gibts auch viele, die das nicht können :().

Meine Empfehlung für'n Einstieg: Smalltalk (besser zum Konzepte lernen) oder Java (besser für den Alltag).
Ich würd mich freuen, wenn Objctive-C nicht so verwurstet ist wie C++ und damit auch empfehlenswert wäre oder, WoSoft?


Gruß,

?=?
 
Du solltest erstmal ein paar grundlegende Texte lesen, C ist IMO für den Start optimal, da lowlevel und grade die Segfaults einem die wichtigsten Sachen beibringen. Auch solltest du den Unterschied zwischen strukturierter und objektorientierter Programmierung herausfinden um dann selbst entscheiden zu können was du lernen willst.
 
?=? schrieb:
tja, damals, Ende der Achtziger Jahre des letzten Jahrhunderts hat sich leider die falsche Sprache durchgesetzt . . .
Meine Kenntnis von Objective-C beschränkt sich leider darauf, dass die Methodenaufrufe eine Smalltalk-ähnliche Syntax haben.

Objective-C ist sicher die erste Wahl, wenn man nativ für OS X entwickeln will.
Für plattformübergreifendes würde ich Java vorziehen.
Und zum lernen von OO-Konzepten empfehle ich Smalltalk. Da hat man's wirklich mit OO pur zu tun. Keine Memory-Probleme wie in C++, keine Arrays wie in Java, nicht mal primitive Datentypen oder IF/THEN/ELSE.
*Alles* sind Objekte!
Auf den ersten Blick wirkt das befremdlich, aber es sorgt dafür, dass die gesamte Syntax auf eine DIN A4 Seite passt und somit sehr schnell zu erlernen ist.


Gruß,

?=?
Tja, wenn man die Wahl hat. Ich bin aber Angestellter in einem großen Konzern und wenn mein Boss sagt, ich brauche eine Klasse mit den und den Methoden, dann impliziert das eine bestimmte Entwicklungsumgebung, in der Smalltalk nicht vorgesehen ist. Und wenn ich einen Treiber schreiben muss, dann sind das SDK und C pur vorgegeben.
 
Sorry, aber ich glaube du fängst 3 Stufen zu hoch an.

Wenn du gerade Anfängst zu Programmieren, dann befasse dich erst mal mit der Theorie. So wie du klingst, weißt du nicht mal was genau ein Compiler, bzw. ein Debugger ist. Du weißt auch noch nicht mal was ein parse error genau ist.

Dir fehlt der Grundstein.

Was prozedurale Programmierung und was Objekt-orientierte Programmierung ist, ist erst mal egal. Vom Grund her sind die meisten Sprachen gleich, da sie an C angelehnt sind.

Gucke dir erst mal an, was Variablen sind, beschäftige dich mit Schleifen, Abfragen und Unterscheidungen. Gucke dir erst mal an, was die "main"-Funktion ist, dann später Funktionsaufrufe und Übergabe/Rückgabe-Werte. Zwischendurch die ganzen Variablen. Was ist ein Integer, Float, String, Char etc. pp. Wozu braucht man die? Etc. Dann noch was Arrays sind. Wozu brauche ich die? Was kann ich damit machen? Was sind Mehr-Dimensionale Arrays?

Dann versuche ein bisschen etwas zu kombinieren. Eine Schleife die durch einen Array läuft, mit ner Wert-Abfrage. Usw. Usw. Usw. Usw.

Wenn du das alles Begriffen hast (begreifen ist nicht gleich "ich habe es mal eingetippt"). Dann kann es weiter gehen. Dann kannst du mit C++ oder Java usw. anfangen. Dann können wir in die OOP gehen. Dann kannst du dich damit Beschäftigen wenn plötzlich "eine Variable" mehrere "Werte" hat. Diesen Wert dann auch nicht einfach rauskopiert, sondern erst mal eine Methode schreibt, die einem die Variable holt. Aber lern erst mal den Grundsatz.

Fang nicht gleich mir dem Auslesen und leeren des Terminals an. Das braucht man später gar nicht, da keine Sau mehr ne reine Standard-Konsolen-Applikation haben will. Da gibt es dann spezielle Konsolen-Librarys (ncurses) die alles erleichtern. Aber im Endeffekt soll doch sicherlich ne schicke GUI-Anwendung entstehen, oder?

Also, vergiss das erst mal. Lernfaktor ist hier doch gleich Null. Du weißt nicht warum es nicht läuft, und wenn es läuft weißt du auch nicht warum es gerade jetzt läuft. Code abtippen kann man jedem Affen beibringen.

Das geht dann "Oh, cool. Das geht ja wirklich", nächste Aufgabe "Oh, das auch.", nächste Aufgabe.... etc.

Das muss nicht sein. Bringt auch nichts. Und sich an einer Aufgabe festbeißen auch nicht. Wenn eine Lektion nicht funktioniert, dann liest man erst mal weiter. Wenn man es brauchen sollte, dann kommt man noch mal zurück. Besonders da du hier ne Aufgabe hast die systemspezifisch ist. So etwas lernt sich nicht gut.

Viel Spaß :)
 
Topsa schrieb:
Wenn ich die fflush durch ein getchar() ersetze sagt der Xcodedebuger : parse error before "if"

@wosoft was soll den deiner meinung nach veruchen? (ich weiß ich nerv und ich hab mir den c,c++,Java-thread schon durchgelesen, bin aber immer noch nicht schlauer)
Ich möchte eigentlich mal schauen, dann so einfache Sachen machen und wenn es dann klappt mal weiter sehen. (als gernespieler natürlich gerne spiele oder so) Aber ich habe keine speziellen Vorstellungen. Es sollte aber schon möglichst auf Apple abgestimmt sein. Wenn portierbar wäre wärs aber auch toll. Ich denk mal am Anfang ist Geschwindigkeit auch nicht soi wichtig.
Tospa

Hallo Topsa,
nachdem dich nun die Freaks aller möglichen Sprachen verwirrt haben, mein Tipp.
Lerne zuerst C, die Mutter aller Programmiersprachen, von einigen Exoten, wie Smalltalk abgesehen. Damit wirst du die grundliegenden Dinge, wie die Blockbildung mit geschweiften Klammern, Verzweigungen (if, else), Schleifen (for, while) etc. kennenlernen und die dann auch in anderen Sprachen, wie C++, Objective-C oder Java wiederfinden.
Was die Portierbarkeit betrifft: Es gibt keine Sprache, die einerseits alle Features eine Computer nutzen kann, wie z.B. Aqua des Mac, um dann auf einem anderen System, wie Windows, dessen Features auszureizen. Gerade bei Grafik und Spielen sieht es da schlecht aus.
Soll ein Programm portierbar sein, muss es von vorne herein dafür konzipiert werden, z.B. indem man die Programmlogik und das GUI (Graphic User Interface = Bedienoberfäche) strikt voneinander trennt und dabei auch noch das alternative Ssytem im Blick hat.
So entwickelt MS jede neue Office-Generation zuerst auf dem Mac, um sie dann später auf Windows zu portieren und schon dabei müssen die Programmierer bei jedem neuen Feature prüfen, ob es unter Windows auch umgesetzt werden kann. Nehme an, Beispiel iTunes, dass Apple umgekehrt genau so verfährt.
 
@ nuke der Compiler übersetzt das geschriebene wort in in die 0 und 1 en (binärcode oder so ähnlich). Bei parse error dachte ich irgendwie an zeilenfehler. Und ein dubbuger durchläuft so weit ich weiß den Code und überprüft ihn nach stynaxfehler und ähnlichem. Variablen müssten doch das gleiche sein wie in der Mathematik, bei basic ist das auch so. Und was soll der Grundsatz sein? Ich bin auch nur ein ärmlicher ex-basictipper...

ich werd mich mal mit den links von vava beschäftigen und es dann mit C weiterversuchen. (ich hab auch bei den vorhergegangenen übungen dieses openbooks versucht eigene Beispiele zu schreiben und die fehler zu finden)

@wosoft wie, ich soll nur die syntax lernen? Wie soll ich das verstehen?

Topsa
 
Topsa schrieb:
@ nuke der Compiler übersetzt das geschriebene wort in in die 0 und 1 en (binärcode oder so ähnlich). Bei parse error dachte ich irgendwie an zeilenfehler. Und ein dubbuger durchläuft so weit ich weiß den Code und überprüft ihn nach stynaxfehler und ähnlichem. Variablen müssten doch das gleiche sein wie in der Mathematik, bei basic ist das auch so. Und was soll der Grundsatz sein? Ich bin auch nur ein ärmlicher ex-basictipper...

ich werd mich mal mit den links von vava beschäftigen und es dann mit C weiterversuchen. (ich hab auch bei den vorhergegangenen übungen dieses openbooks versucht eigene Beispiele zu schreiben und die fehler zu finden)

@wosoft wie, ich soll nur die syntax lernen? Wie soll ich das verstehen?

Topsa
Na gut, Sytnxtax ist etwas wenig, Semantik gehört auch dazu. Wollte damit sagen: Nicht zu sehr die proezedurale Technik angewöhnen, denn um so schwerer fällt die Umstellung auf OOP.
Ansonsten: Syntax-Fehler entdeckt spätestens der Compiler aber auch schon ein guter Editor macht die deutlich.
Ein Parser scannt einen längeren Text und zerlegt ihn in Worte. Höherwerige Parser analysieren die Wort auch und testen nach einigen Regeln. Hier ist es der Parser des Compilers, der im ersten Schritt den Quelltext seziert.
Wenn ein Programm ohne Fehler übersetzt wurde aber dann nicht korrekt läuft, setzt man einen Debugger ein. Damit kann man u.a. den Code schrittweise ablaufen lassen und sich dabei den Inhalt von Variablen ansehen.
 
Zurück
Oben Unten