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


von golfbaer (Gast)


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.
1
uebernehmen = 0;
2
if (((oldminute + 1) == minute) && (oldhour == hour) && (oldday == day) && (oldmonth == month) && (oldyear == year)) ||
3
   (((oldminute - 59) == minute) && ((oldhour + 1) == hour) && (oldday == day) && (oldmonth == month) && (oldyear == year))
4
{
5
   uebernehmen = 1;
6
}

von Sven P. (Gast)


Lesenswert?

')' zu viel.

von Noname (Gast)


Lesenswert?

Die Klammern passen nicht.

von Hc Z. (mizch)


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.

von golfbaer (Gast)


Lesenswert?

Hallo mizch,

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

Danke und einen guten Rutsch ins neue Jahr
golfbaer

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Ich würde das in erster Näherung so schreiben:
1
uebernehmen = 
2
    (oldminute + 1 == minute
3
     && oldhour == hour 
4
     && oldday == day 
5
     && oldmonth == month 
6
     && oldyear == year) 
7
    || (oldminute - 59 == minute
8
        && oldhour + 1 == hour 
9
        && oldday == day 
10
        && oldmonth == month 
11
        && oldyear == year);
und das dann noch in zwei Teile mit sinnvollen englischen Namen spalten.

Sieht aber auch logisch unsauber aus.

von Sven P. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Ich würde das in erster Näherung so schreiben:
>
1
> uebernehmen =
2
>     (oldminute + 1 == minute
3
>      && oldhour == hour
4
>      && oldday == day
5
>      && oldmonth == month
6
>      && oldyear == year)
7
>     || (oldminute - 59 == minute
8
>         && oldhour + 1 == hour
9
>         && oldday == day
10
>         && oldmonth == month
11
>         && oldyear == year);
12
>
> 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.

von GoZu (Gast)


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 ;)

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.