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_ttime_h=RTC[TIME_H];
3
uint8_ttime_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***
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ß.
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...
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.
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?
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.
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?
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.
> 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.
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???
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.
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.
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 :-)
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
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.
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!
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.
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
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.
Rufus Τ. Firefly schrieb:> Muss man nicht
Ich meinte schon, dass man sich ja im Zweifelsfall die zweiteAusgabe 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