C-Neuling hat ein Problem

Gast #1537393
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
}
#1537402
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.
Persönliche Seite #1537413
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.
Gast #1537653
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.
Gast #1537687
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren