Forum: Compiler & IDEs Probleme mit while-Schleife


von Robert M. (pielo)


Lesenswert?

Hallo,

ich werde jetzt sicher mit einem Problem kommen bei denen die meisten 
sich fragen werden, warum macht er sowas wenn er es nicht kann. Die 
Antwort ist, weil ich es mir in Kopf gesetzt habe das Problem irgendwie 
zu lösen und ich dachte ich bekomme das so hin.

So nun erstmal zum Problem. Ich versuche krampfhaft eine while-Schleife 
hinzubekommen, in der für eine bestimmte Zeit ein Text in einer Matrix 
ausgegeben wird.

Bis jetzt hab ich folgendes
1
while{
2
  uint8_t time_h = RTC[TIME_H];
3
  uint8_t time_m = RTC[TIME_M];
4
 
5
  if (time_h == 8 && time_m >= 30 && time_m <= 45 )
6
  {
7
  text_scroll("&&&&Pause",100,1)    // Text "Pause"
8
  } 
9
 
10
else {
11
    //Rest der Funktion
12
13
  return;
14
  }
15
}

Nur leider kommen da folgende Fehler
1
error: expencted '(' before '{' token          //Fehler zeigt auf die Zeile "while{"
2
error: 'time_h' undeclared (first use in this function)        // Fehler zeigt auf die Zeile " if (time_h == 8 && ..."

Kann mir vielleicht einer sagen wo hier mein Fehler liegt?

P.S.: Ich bin leider noch ziemlicher Anfänger auf dem Gebiet


***lg Pielo***

von Peter II (Gast)


Lesenswert?

also bei mir hat while immer eine bedingung

http://www.peacesoftware.de/ckurs10.html

von "Alternative für Deutschland" Wähler (Gast)


Lesenswert?

Und wo ist die Bedingung für die while-Schleife?

int a = 1;

while(a)
{
// krims-krams
}

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

In deinem While-Statement ist die vorgegebene Struktur (Syntax) nicht 
gegeben. die Syntax einer WHILE Anweisung ist:

while BEDINGUNG do ANWEISUNG

daraus ist direkt ersichtlich, daß z.B. die BEDINGUNG beim Eintritt in 
die While-Schleife schon vorliegen bzw. auswertbar sein muß.

von Moin (Gast)


Lesenswert?

Die while-schleife braucht immer eine Bedingung.
Diese schreibt man eingeklammer dahinter, desshalb hat der Compiler erst 
() erwartet.
wenn du willst das die while schleife Bedingunglos durchläuft schreib 
die klammern trotzdem hin und lass sie leer oder schreib ne eins rein...

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

das sind deine "Bausteine":

BEDINGUNG:  in der für eine bestimmte Zeit
ANWEISUNG:  ein Text in einer Matrix ausgegeben

von Robert M. (pielo)


Lesenswert?

Danke für die schnellen Antworten.

Ich habe es jetzt folgendermaßen probiert
1
  uint8_t time_h = RTC[TIME_H];
2
  uint8_t time_m = RTC[TIME_M];
3
 
4
5
while(time_h == 8 && time_m >= 30 && time_m <= 45 )
6
7
  {
8
  text_scroll("&&&&Pause",100,1)    // Text "Pause"
9
  }

Jetzt hab ich das Problem das er in der Schleife hängen bleibt.

von Peter II (Gast)


Lesenswert?

Robert Manzke schrieb:
> Jetzt hab ich das Problem das er in der Schleife hängen bleibt.

das ist doch aber das was du programmiert hast. Also liegt erstmal kein 
fehler vor.

von Robert M. (pielo)


Lesenswert?

Peter II schrieb:
> Robert Manzke schrieb:
>> Jetzt hab ich das Problem das er in der Schleife hängen bleibt.
>
> das ist doch aber das was du programmiert hast. Also liegt erstmal kein
> fehler vor.

Ja das mag sein, ich müsste jetzt irgendwie noch einfügen das er bei 
jedem Durchlauf die Uhrzeit neu überprüft, aber wie mach ich das?

von "Alternative für Deutschland" Wähler (Gast)


Lesenswert?

Klar.
Du mußt ja auch die while-Schleife wieder abbrechen.
Immer wenn das Element in a in while(a) {} Null ist, bricht er ab. Du 
kannst es innerhalb der geschweiften Klammern ändern.

von Robert M. (pielo)


Lesenswert?

Ja so hab ich das mit der while-Schleife auch gedacht, daher meine 
Annahme das wenn time_m > 45 dann ist die Bedingung "0" und die Schleife 
müsste abrechen. Oder hab ich da einen groben Denkfehler?

von Karl H. (kbuchegg)


Lesenswert?

Robert Manzke schrieb:

> Ja das mag sein, ich müsste jetzt irgendwie noch einfügen das er bei
> jedem Durchlauf die Uhrzeit neu überprüft, aber wie mach ich das?


Das überprüfen ist nicht dein Problem.
Aber es wird wenig Sinn haben, wenn du einmalig VOR der Schleife die 
Uhrzeit feststellst und dann ständig überprüfen lässt ob diese einmalig 
festgestellte Uhrzeit schon einen Abbruch der Schleife erzwingen soll.

Du wirst schon innerhalb der Schleife deine Uhrzeit neu holen müssen. 
Denn Variablen ändern ja nicht irgendwie magisch ihren Wert.


Wie soll denn in
1
while(time_h == 8 && time_m >= 30 && time_m <= 45 )
2
3
  {
4
  text_scroll("&&&&Pause",100,1)    // Text "Pause"
5
  }

time_m jemals 46 werden? Da gibt es keine Anweisung, die time_m 
verändern würde.
Wenn du selbst auf etwas wartest, schaust du ja auch regelmässig auf 
deine Armbanduhr und stellst die dann vorliegende Zeit fest und 
entscheidest anhand dieser neuen Ablesung, was zu tun ist.

von Karl H. (kbuchegg)


Lesenswert?

> Die Antwort ist, weil ich es mir in Kopf gesetzt habe das Problem
> irgendwie zu lösen und ich dachte ich bekomme das so hin.

Das denken viele.
Und ein ums andere mal stellt sich immer wieder heraus: Programmieren 
ist wesentlich, und zwar richtig wesentlich, komplexer als sie es sich 
in ihren kühnsten Träumen auch nur ansatzweise vorgestellt haben.
Wenn du es lernen willst, dann brauchst du erst mal ein C-Buch. Ohne 
dein Werkzeug (die Programmiersprache) gut zu kennen, brauchst du mit 
dem Rest erst gar nicht anzufangen. Es hat schon seinen Grund, warum ein 
gutes C-Buch mindestens 200 Seiten hat. Und das bringt dir erst mal nur 
die Sprache an sich und einige der unbedingt notwendigen Basistechniken 
bei.

von Robert M. (pielo)


Lesenswert?

Ja, das hatte ich auch schon mal angetestet, sah dann so aus
1
  uint8_t time_h = RTC[TIME_H];
2
  uint8_t time_m = RTC[TIME_M];
3
 
4
5
while(time_h == 8 && time_m >= 30 && time_m <= 45 )
6
7
  {
8
  text_scroll("&&&&Pause",100,1)    // Text "Pause"
9
  uint8_t time_h = RTC[TIME_H];
10
  uint8_t time_m = RTC[TIME_M];
11
12
  }

wobei hier dann folgende Warnung kam und er trotzdem fest hing
1
warning: unused variable 'time_h' [-Wunused-variable] 
2
warning: unused variable 'time_m' [-Wunused-variable]

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Robert Manzke schrieb:
> time_m >= 30 && time_m <= 45

überleg auch mal, was du damit ausdrücken willst.

deine Variable kennt nur einen Wertebereich von 0 .. 255

sofern du time_m regelmäßig einliest und diese Variable ihren Wert 
verändert, wird sie ihn (so deute ich das) kontinuierlich von 0 ... 45 
hochzählen.

time_m wird also irgendwann mal den Wert 29, 30, 31, 32 ... 45, 46 haben

Durch deine Und-Verknüpfung wird alles "<= 45" wird so ausgewertet 
werden, als daß die Bedingung noch nicht erfüllt ist, also <= 17, <=30, 
<= 34, <= 43, ....

-_> Das ist NICHT notwendig, jeden Zwischenwert einzeln zu prüfen. Da 
kommt immer nur "Bedingung ist noch nicht erfüllt" raus.

Oder hast du etwas ganz anderes vorgehabt???

von Rene H. (Gast)


Lesenswert?

Ja, weil Du time_h und time_m zweimal deklariert hast.
Nimm die zweiten uint8_t raus.

Grüsse,
R.

von Karl H. (kbuchegg)


Lesenswert?

Robert Manzke schrieb:
> Ja, das hatte ich auch schon mal angetestet, sah dann so aus
>
> [c]
>   uint8_t time_h = RTC[TIME_H];
>   uint8_t time_m = RTC[TIME_M];
>
>
> while(time_h == 8 && time_m >= 30 && time_m <= 45 )
>
>   {
>   text_scroll("&&&&Pause",100,1)    // Text "Pause"
>   uint8_t time_h = RTC[TIME_H];
>   uint8_t time_m = RTC[TIME_M];

Das hier sind 2 neue Variablen, die nur zufällig dieselben Namen haben, 
wie die beiden Variablen ausserhalb der Schleife. Aber ansonsten haben 
die nichts miteinander zu tun.


  while(time_h == 8 && time_m >= 30 && time_m <= 45 )
  {
    text_scroll("&&&&Pause",100,1)    // Text "Pause"
    time_h = RTC[TIME_H];
    time_m = RTC[TIME_M];
  }


Es hilft nichts. Du brauchst ein C-Buch.
Das sind alles Fehler der Kategorie: erste Programmierwoche, erste 
Stunde.
Einfach irgendwelche Codezeilen durch die Gegend kopieren und zu hoffen, 
dass das genau das macht was man will, ist nicht zielführend.
Wenn du am Strassenverkehr teilnehmen willst, musst du ja auch erst mal 
die Schilder und ihre Bedeutung lernen. Für fast alles in Deutschland 
muss man eine Prüfung ablegen und sei es noch so banal. Nur Kinder 
zeugen und Programmieren kann jeder nach Lust und Laune.

von Karl H. (kbuchegg)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Robert Manzke schrieb:
>> time_m >= 30 && time_m <= 45
>
> überleg auch mal, was du damit ausdrücken willst.

Hat er im Eröffnungsposting schon gesagt.
er will den Text von 8:30 bis 8:45 scrollen lassen.



Das man das im Endeffekt komplett anders macht ist schon klar (Timer und 
eventbasiert arbeiten). Aber erst mal gehts darum ihm ein paar 
Basisdinge in C beizubringen.

von Udo S. (urschmitt)


Lesenswert?

Ich kann dir nur ans Herz legen auf Karl Heinz zu hören.
Deine Fehler sind ziemlich haarsträubend.
Programmieren heisst halt auch im Zeitalter eines Guttenbergs nicht 
"copy and paste" sondern Grundlagen lernen und Schritt für Schritt 
vorgehen.
Und man lernt (als Anfänger) nicht durch Beispielcode, sondern nur durch 
Code den man sich selbst ausgedacht und geschrieben hat.

An Beispielcode lernt man öfter nur wie man es nicht macht :-)

von Robert M. (pielo)


Lesenswert?

ja OK ich sehe es ein, werde mir wohl ein Buch besorgen müssen und mich 
mal ein wenig belesen und reinfuchsen. Könnt ihr da Lektüre empfehlen, 
ich hatte ja schon öfters mal geschaut, aber da gibt es ja sooo viel.

Aber nix desto trotz DANKE an alle für eure Bemühung.

P.S.: es geht jetzt mit dem Code von Karl Heinz Buchegger

von Karl H. (kbuchegg)


Lesenswert?

Robert Manzke schrieb:
> ja OK ich sehe es ein, werde mir wohl ein Buch besorgen müssen und mich
> mal ein wenig belesen und reinfuchsen. Könnt ihr da Lektüre empfehlen,
> ich hatte ja schon öfters mal geschaut, aber da gibt es ja sooo viel.

Wie immer ist der Klassiker

Kernighan&Ritchie
Programmieren in C

eine Empfehlung wert. Wobei das englische Original der deutschen 
Übersetzung vorzuziehen ist. Die Übersetzung soll nicht so prickelnd 
sein.

Aber abgesehen davon: geh in die nächste Buchhandlung und schmökere in 
den Büchern. Einfach mal ein wenig vergleichen, mit wessen Schreibstil 
du am besten zurecht kommst. Hüte dich am Anfang vor allem, was sich als 
Kompendium verkauft. Ein Buch, welches zu 90% daraus besteht die 
Systemfunktionen aufzuzählen und deren Parameter zu beschreiben hat zwar 
seine Berechtigung, ist aber nicht das was du brauchst. Du brauchst ein 
Buch mit textueller Erklärung, mit Codebeispielen, mit Übungsaufgaben.


Und auch ja: Such nicht nach C-Büchern für die AVR-Programmierung. Die 
gibt es nämlich nicht. Was du brauchst ist erst mal ein C-Buch. Und zwar 
reines C und nicht etwa Windows-Programmierung mit C. Von dem arbeitest 
du das erste Drittel im Idealfall auf dem PC durch. Denn auf dem PC 
funktioniert alles genau so, wie es im Buch beschrieben ist. Auch 
Ein-/Ausgabe. Etwas, was man von einem AVR nicht sagen kann. Dort 
funktioniert erst mal überhaupt nichts von alleine. Und schon gar nicht 
so, wie beschrieben. Du hast nichts davon, wenn du erst mal Halbprofi 
sein müsstest nur um die ordinäre Textausgabe mit printf in Betrieb 
nehmen zu können. Da beißt sich die Katze in den Schwanz.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Programmieren
> ist wesentlich, und zwar richtig wesentlich, komplexer als sie es sich
> in ihren kühnsten Träumen auch nur ansatzweise vorgestellt haben.
> Wenn du es lernen willst, dann brauchst du erst mal ein C-Buch. Ohne
> dein Werkzeug (die Programmiersprache) gut zu kennen, brauchst du mit
> dem Rest erst gar nicht anzufangen.

naja, neben der guten Handhabung des Werkzeugs (eigentlich: darüber 
hinaus) braucht es noch umfangreich der "algorithmischen Denkweise", 
sowie (eher uC spezifisch) einem grundlegenden Verständnis von 
Algorithmen und Datenstrukturen, und technischen Systemen.

Die Diskussion darüber ist ja schon unendlich oft geführt worden. Ich 
behaupte mal: Jemand, der das zuvor genannte kennt und kann, für den 
sollte es relativ leicht sein, irgendwas anstelle von Pseudosprache in 
irgendeine Programmiersprache auszudrücken. Ich kann auch "meiner Oma" 
die grundlegende Funkion von Bubblesort erklären, und die kennt keine 
einizige Programmiersprache!

von Udo S. (urschmitt)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Ich kann auch "meiner Oma"
> die grundlegende Funkion von Bubblesort erklären,

Erkläre ihr mal den Quicksort :-)

von Karl H. (kbuchegg)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Karl Heinz Buchegger schrieb:
>> Programmieren
>> ist wesentlich, und zwar richtig wesentlich, komplexer als sie es sich
>> in ihren kühnsten Träumen auch nur ansatzweise vorgestellt haben.
>> Wenn du es lernen willst, dann brauchst du erst mal ein C-Buch. Ohne
>> dein Werkzeug (die Programmiersprache) gut zu kennen, brauchst du mit
>> dem Rest erst gar nicht anzufangen.
>
> naja, neben der guten Handhabung des Werkzeugs (eigentlich: darüber
> hinaus) braucht es noch umfangreich der "algorithmischen Denkweise",
> sowie (eher uC spezifisch) einem grundlegenden Verständnis von
> Algorithmen und Datenstrukturen, und technischen Systemen.
>
> Die Diskussion darüber ist ja schon unendlich oft geführt worden. Ich
> behaupte mal: Jemand, der das zuvor genannte kennt und kann, für den
> sollte es relativ leicht sein, irgendwas anstelle von Pseudosprache in
> irgendeine Programmiersprache auszudrücken. Ich kann auch "meiner Oma"
> die grundlegende Funkion von Bubblesort erklären, und die kennt keine
> einizige Programmiersprache!


Kein Einwand.
Aber irgendwo muss man mal anfangen. Ich denke, dass es einfacher ist, 
sich über Algorithmen zu unterhalten, wenn die Programmiersprache zu dem 
geworden ist, was sie sein soll: mein Werkzeug und was damit 
zusammenhängt - was sie kann und was sie nicht von sich aus kann.
Ähnlich wie ich mich in einem Malkurs nicht erst 30 Minuten über 
Bildkomposition unterhalte nur um dann erst mal eine 10 minütige 
Einführung in Pinselauswaschen und die Proportionen eines 
Strichmännchens geben zu müssen.

von gemolkener Euro-Retter (Gast)


Lesenswert?

>Erkläre ihr mal den Quicksort :-)
Quicksort... den gibt's hier:
http://www.youtube.com/watch?v=kDgvnbUIqT4

von Simon H. (simi)


Lesenswert?

Zuerst musst Du der Oma die Rekursion erklären. Und um die zu verstehen, 
muss sie erst die Rekursion verstehen.
:-)

von Stefan W. (dl6dx)


Lesenswert?

Karl Heinz Buchegger schrieb: (zu [K&R])
> Wobei das englische Original der deutschen Übersetzung vorzuziehen ist.
> Die Übersetzung soll nicht so prickelnd sein.

Das gilt in vollem Umfang nur für die erste Ausgabe. Da ist die 
Übersetzung wirklich sehr eigen ("character arrays" wird zu "Zeichen 
Vektoren" usw.)

Die Übersetzung der zweiten Ausgabe ist besser. (Wobei man heute wohl 
Begriffe wie "Compiler" und "Linker" nicht mehr eindeutschen würde. 
Damals war das im akademischen Umfeld durchaus noch üblich.)

Im Zweifel kann man sich ja beide Versionen besorgen.

Grüße

Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stefan Wagner schrieb:
> Im Zweifel kann man sich ja beide Versionen besorgen.

Muss man nicht, die erste Ausgabe beschreibt das nun wirklich komplett 
veraltete "K&R-C", das unter anderem keine Funktionsprototypen kennt und 
daher beim Aufruf von Funktionen dem Compiler keine Chance zur 
Typprüfung --bis auf den des Rückgabewerts-- gibt.

Nein, wenn, dann die zweite Ausgabe, die C89 ("ANSI-C") beschreibt, was 
bis auf die nach wie vor nur von wenigen* Compilern unterstützten 
C99-Erweiterungen auch als weiterhin gültig angesehen werden kann.

*) gcc ist einer davon, durchaus ein Schwergewicht. Aber im 
kommerziellen Lager wird die Luft schnell sehr dünn.

von Stefan W. (dl6dx)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Muss man nicht

Ich meinte schon, dass man sich ja im Zweifelsfall die zweite 
Ausgabe in Englisch und Deutsch besorgen könne, denn

> das nun wirklich komplett veraltete "K&R-C"

sollte man in der Tat nicht mehr verwenden.

Grüße

Stefan

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.