www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Neuling hat ein Problem


Autor: golfbaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bin noch relativer C-Anfänger und brauche mal Eure Hilfe.

Bekomme die Fehlermeldung "syntax error at near '||'===> ||"
bei folgenden Programmzeilen angezeigt.
uebernehmen = 0;
if (((oldminute + 1) == minute) && (oldhour == hour) && (oldday == day) && (oldmonth == month) && (oldyear == year)) ||
   (((oldminute - 59) == minute) && ((oldhour + 1) == hour) && (oldday == day) && (oldmonth == month) && (oldyear == year))
{
   uebernehmen = 1;
}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
')' zu viel.

Autor: Noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Klammern passen nicht.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Klammern reichen nicht aus.  Du musst den gesamten if-Ausdruck 
klammern, hast aber zwei Klammerausdrücke und ein || dazwischen.

Also vorne und hinten noch eine Klammer dazu.  Ein Editor, der die 
jeweils entsprechende andere Klammer markiert, hilft hier mächtig.

Autor: golfbaer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo mizch,

vielen Dank für Deinen Tip.
Jetzt funktioniert es !

Danke und einen guten Rutsch ins neue Jahr
golfbaer

Autor: Jürgen S. (starblue) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das in erster Näherung so schreiben:
uebernehmen = 
    (oldminute + 1 == minute
     && oldhour == hour 
     && oldday == day 
     && oldmonth == month 
     && oldyear == year) 
    || (oldminute - 59 == minute
        && oldhour + 1 == hour 
        && oldday == day 
        && oldmonth == month 
        && oldyear == year);
und das dann noch in zwei Teile mit sinnvollen englischen Namen spalten.

Sieht aber auch logisch unsauber aus.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen S. schrieb:
> Ich würde das in erster Näherung so schreiben:
>
> uebernehmen =
>     (oldminute + 1 == minute
>      && oldhour == hour
>      && oldday == day
>      && oldmonth == month
>      && oldyear == year)
>     || (oldminute - 59 == minute
>         && oldhour + 1 == hour
>         && oldday == day
>         && oldmonth == month
>         && oldyear == year);
> 
> und das dann noch in zwei Teile mit sinnvollen englischen Namen spalten.
>
> Sieht aber auch logisch unsauber aus.

Einen DCF-Empfänger kann man durchaus auch schöner umsetzen, mit 
beliebig tiefer Redundanz ;-)
Logisch wird die Konstruktion oben immer mal wieder eine Synchronisation 
aussetzen.

Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin selbst noch C/C++ Anfänger, aber würde das ganze nicht so viel 
besser und eleganter funktionieren:

1) Überhaupt gleich schreiben:
uebernehmen = (oldminute != minute);

Im Prinzip schaust du, ob eine Sekunde vor gezählt wurde (also um 1 
inkrementiert wurde) oder ob zurückgesetzt wurde. Warum machst du das 
über so komische Verrenkungen wie -59? Warum gibst du nicht gleich 
absolut 0 an wie eine Konstante? Dadurch hast du auch weniger Fehler, 
den wenn du "=" statt "==" schreibst, wäre das eine Zuweisung zu einer 
Konstante und dadurch hättest du schon einen Compilerfehler...

2)Falls du es doch so wie hier programmieren würdest, würde ich das 
ganze in Strukturen aufteilen. Eine Struktur time mit minute, hour , 
day... usw. und dann erzeugst du
struct time oldtime;
struct time newtime;

3) Ich würde das ganze in eine Funktion packen. z.b.
uint_8t check_if_new_time(const * const struct time oldtime, const * 
const struct time newtime);

Danach wäre der Aufruf:
uebernehmen = check_if_new_time(&oldtime, &newtime);
viel schöner und leichter zu lesen. (vll. gehören da noch casts hin auf 
Konstant? Weiß jetzt gerade nicht, glaube aber schon.)


Da ich selbst noch programmier-Anfänger bin, würde soetwas gescheiter 
sein oder sollte es doch so wie hier geschrieben werden? Ich würde es 
allerdings mit Strukturen und Funktionen machen oO. Sollte die Funktion 
dann nicht auf inline sein? Über Antworten wäre ich wirklich dankbar ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.