Forum: Compiler & IDEs fehler beim Compiler??


von tex (Gast)


Lesenswert?

Hi.
Ich versuche mich am mega 128 mit dem avr-gcc (GCC) 3.4.1 Compiler,
aber wie verstehen uns irgendwie nicht. Neben 1000 anderen Dingen die
einfach nicht funktionieren wollen, gibt die folgende Zeile (Bitte
nicht deren Sinn kommetieren!!) nichts aus, wohingegen die gleiche
Zeile ohne for-Schleife genau das tut, was man von ihr erwartet.



for (i=1;i==7;i++)
  {
        display_cursor(1,9);
  display_string("mist");
      }

Falls nebenbei noch jemand eine Idee hat, wie ich eine Variable auf
meinem Display ausgegeben bekomme wäre ich auch über diesen Tip
dankbar.

von Matthias (Gast)


Lesenswert?

Hi

100 mal schreiben:
Ich will C lernen.

Copy&Paste gilt nicht. Schau dir mal die Definition der for-Schleife an
dann wirst du sehen das der Fehler garantiert nicht beim Compiler
liegt.

BTW:
Man sollte sich vor einer solch simplen Frage mal selber die Frage
stellen ob es überhaupt sein kann das der Compiler einen solch banalen
Fehler macht. Du bist bei weitem nicht der einzigste der den AVRGCC
benutzt. Würde er bei einer so simplen Schleife aber schon scheitern
wärst du nicht der erste dem das auffällt.

Matthias

von Rufus T. Firefly (Gast)


Lesenswert?

Den Inhalt der Klammer hinter dem Wort "for" solltest Du Dir nochmal
genauer ansehen.

Hilfreich ist die Lektüre des Buches "Programmieren in C" von
Kernighan & Ritchie in der zweiten Auflage, erschienen etwa 1990 im
Hanser Verlag.


Der Ausdruck in der Klammer hinter for enthält drei durch Semikola
getrennte Ausdrücke
- einen Initialisierungsausdruck, mit dem eine Startbedingung
hergestellt wird
(hier: i = 1)
- ein Schleifenfortsetzungskriterium. Solange das zutrifft, wird der
Inhalt des auf das for-Statement folgenden Blocks ausgeführt
(hier: i == 7)
- und ein Ausdruck, der nach jedem Ausführen des auf das for-Statement
folgenden Blockes ausgeführt wird und oft zum Inkrementieren von
Zählvariablen genutzt wird
(hier: i++)

Wie man leicht sieht, bewirkt der zweite Ausdruck (den ich
Schleifenfortsetzungskriterium nannte), daß die Schleife kein einziges
Mal durchlaufen wird, weil dieses Kriterium bereits durch den
Initialisierungsausdruck nicht erfüllt wird.

Besser funktionierte die ganze Chose, wenn da stünde:

  for (i = 1; i < 7; i++)
  {
     bla..
  }

Dann wird die Schleife sechs mal durchlaufen.


<milder Sarkasmus>
Fast 80% aller Leute, die einen Compilerfehler gefunden haben wollen,
können nicht richtig C. Schreib' Dich nicht ab. Lerne C.
</milder Sarkasmus>

von Matthias (Gast)


Lesenswert?

schneller :-)

Matthias

von Rufus T. Firefly (Gast)


Lesenswert?

Mist. Ich wusste es.

(dabei heisse ich gar nicht Bernd)

von tex (Gast)


Lesenswert?

Danke, Freunde!
Ihr habt eine ungemein aufbauende Art!;
Ich weiß das ich nicht C programmieren kann darum versuche ich es zu
lernen!
Ich habe den verdammten Fehler ca 4 Stunden lang gesucht. Inzwischen
habe ich es geschafft meine Variable auszugeben. Zwei Probleme habe ich
noch. Ich würde gerne eine Variable zusammenbasteln. Beispiel: Ich habe
eine Variable aus 3 zweistelligen ints und möchte daraus eine
Zeichenkette machen, die ich dann anzeigen kann? Geht sowas?
2. Meine jetzt endlich ausgegebene Variable wandle ich mit itoa um aber
sie ist am Anfang 4 Zeichen lang und wird dann weniger, bis sie Null
wird.
Damit bleiben am Ende die Nullen stehen, so das die Zahl statt 0001
1000 anzeigt. Die drei Nullen am Ende sind natürlich nur stehen
geblieben, von den vorhergehenden Programmzyklen. Muss ich jetzt
aufwendig ausrechnen wieviele Stellen meine Zahl hat, oder gibt es
einen einfachen Weg?

@Rufus
ich bin mir nicht sicher, aber könnte es sein, dass es in Pascal so
ist, das die Schleife ausgeführt wird, bis das Kriterium erfüllt ist?

von tex (Gast)


Lesenswert?

@Rufus
Gibt es ggf noch etwas aktuelleres das auch die AVR Familie im
speziellen behandelt?
Ich hatte dam al was sehr schönes für die 8031, das
Microcontrollerkochbuch hieß. Habe sowas leider noch nicht für die AVRs
gefunden

von Matthias (Gast)


Lesenswert?

Hi

es herscht hier machmal ein etwas rauher Umgangston. Gewöhn dich dran.
Wer hier ordentliche Fragen stellt
(http://www.catb.org/~esr/faqs/smart-questions.html) bekommt auch meist
ordentliche Antworten.

Wenn du C lernen willst hilft dir sicher http://www.schellong.de/c.htm.
Ein IMHO sehr gutes C Tutorial für Leute die schonmal (in einer anderen
Sprache) programmiert haben.

Ein gutes Buch zu den AVR's kenne ich leider nicht. Wie man eine
Ganzzahl-Variable in einen String umwandelt wurde hier schon endlos oft
dikutiert. Bemüh doch einfach mal die Forensuche.

Matthias

von tex (Gast)


Lesenswert?

@Matthias
Die Forensuche ist zugegebener Maßen eine gute Sache, das Blöde daran
ist, das man erst weiss wonach man suchen muss, wenn man die Lösung
gefunden hat.
String hätte ich hier nie gesucht, weil ich String nur von TP kenne.

von Peter D. (peda)


Lesenswert?

"aber könnte es sein, dass es in Pascal so
ist, das die Schleife ausgeführt wird, bis das Kriterium erfüllt
ist?"

Wenn ich das richtig erinnere, heißen Schleifen in TP "until".
In C heißen sie aber "while". "for" ist nur ein Spezialfall davon
(kann man immer nach "while" umschreiben).

Peter

von Stefan Seegel (Gast)


Lesenswert?

Tach,

in Pascal (oder auch Delphi) würde das heißen

for i:=1 to 7 do
begin
  do_was_nettes;
end;

Ansonsten kann man natürlich auch, wie Peter sagt, mit

i:=1;
while i < 7 do
begin
  do_was_toller;
  i:=i + 1;
end;

Schleifen bauen, oder auch mit

i:=1;
repeat
  do_was_abgefahrenes;
  i:=i+1;
until i > 7;


Bis zu einem anderen Thread, gesundes neues Jahr!
Stefan

von tex (Gast)


Lesenswert?

das kommt davon, wenn man auf zu viel hochzeiten tanzt.
PS. In Excel heist es dann
=solange(i<7)
=tu(was(nettes()))
=weiter()
Danke Euch allen!
Ich melde mich wenn mich das Nächste Problem heimsucht zu dem mir die
Forensuche keine Lösung anzubieten vermag. Ich vergnüge mich jetzt erst
mal mit den AD-Wandlern und dann mit den Interrups und Timern
Dann wisst ihr schon mal was als nächstes kommt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.