Forum: Compiler & IDEs if-else-Schleife in if-Schleife geht nicht?


von Max (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

In meinen Programm ist einer IF-Schleife eine weitere Schleife mit einem 
IF und ELSE. Beim Compilieren meldet AVR-Studio den Fehler:
error: 'else' without a previous 'if'


Der Codeausschnitt:
1
if (voltage > VOLTAGE_CONNECT_2S)
2
        if (voltage > VOLTAGE_CONNECT_3S)
3
          VOLTAGE_CHARGE_SET = VOLTAGE_CHARGE_3S;
4
        SET_Cells(3);
5
          mode = MOD_CHARGING;
6
      else
7
          VOLTAGE_CHARGE_SET = VOLTAGE_CHARGE_2S;
8
        SET_Cells(2);
9
        mode = MOD_CHARGING;
10
      
11
    break;



Achja, es gibt noch ne Warning beim Aufruf von SET_Cells(3);
warning: implicit declaration of function 'SET_Cells'




MFG Max

von Gast (Gast)


Lesenswert?

Klammern setzen ist ab und an doch  sinnvoll {}

PS: if-Schleifen gibt es nicht ;)

von matzunami (Gast)


Lesenswert?

versuchs mal so
if (voltage > VOLTAGE_CONNECT_2S)
{
        if (voltage > VOLTAGE_CONNECT_3S)
        {
        VOLTAGE_CHARGE_SET = VOLTAGE_CHARGE_3S;
        SET_Cells(3);
        mode = MOD_CHARGING;
       }
       else
       {
        VOLTAGE_CHARGE_SET = VOLTAGE_CHARGE_2S;
        SET_Cells(2);
        mode = MOD_CHARGING;
       }
}

mfg
matzunami

von Max (Gast)


Lesenswert?

Hallo,

danke für die schnelle Hilfe. Jetzt geht es.

Wie kann ich noch die Warning beheben?

von Peter (Gast)


Lesenswert?

> Wie kann ich noch die Warning beheben?
in dem du eine Funktion SET_Cells erstellst.

was macht eigentlich das break oben in dem code?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es gibt keine "if-Schleifen". Auch keine "if-else-Schleifen".

Das sind Verzweigungen. Eine Schleife impliziert, daß der enthaltene 
Code wiederholt werden kann.

von Max (Gast)


Lesenswert?

Hallo,

@Peter: upps. Hatte ich halt noch mitmarkiert. Einfach wegdenken...
SET_Cells habe ich natürlich erstellt.
1
int SET_Cells (int C)
2
{
3
4
  switch (C)
5
    {
6
      case 2:
7
        PORTB |= (1<<PB0);
8
    break;
9
  
10
        case 3:
11
        PORTB |= (1<<PB0);
12
          
13
  }
14
  return 0;      
15
}


MFG Max

von Max (Gast)


Lesenswert?

break vergessen reinzuschreiben. Sorry

von Rolf Magnus (Gast)


Lesenswert?

> SET_Cells habe ich natürlich erstellt.

Dann hast du es vor dem Aufruf nicht deklariert. Bevor eine Funktion 
aufgerufen wird, sollte sie dem Compiler bekanntgemacht werden, damit er 
weiß, wie der Aufurf aussehen muß. Wenn du das nicht tust, kommt die 
besagte Warnung.

von Max (Gast)


Lesenswert?

Hbe ich das nicht gemacht?? Wie soll ich denn eine Funktion deklarieren?

MFG max

PS:nicht krumm nehmen, habe bis jetzt nur ganz einfache Sachen in C 
gemacht

von Peter (Gast)


Lesenswert?

> Habe ich das nicht gemacht?
das wissen wir leider nicht, weil du uns immer nur kleine Stückchen vom 
code geschickt hast.

Die Funktion muss vor dem Verwenden bekannt gemacht werden. Entweder im 
dem man sie voher implemnentiert oder voher Deklariert.

von Max (Gast)


Lesenswert?

Hallo,

Wie macht man das denn??

Jede andere Funktion die ich so aufrufe geht doch.

Ich habe keine anderen dateien, alles in der Main.c .

Es geht speziell nur um die eine Funktion.
Liegt es vielleicht daran das ich eine Variable mit übergebe?? Wenn ja 
warum??



MFG Max

von Peter (Gast)


Lesenswert?

jetzt Zeig doch entlich mal den kompletten quelltext sonst muss man doch 
nur raten.

von Max (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

So im Anhang ist sie. Erschlagt mich bitte nicht, ich weis das das sehr 
unsauber ist

von Peter (Gast)


Lesenswert?

hier stimmt die Reihenfolge nicht. Du verwendest erst set_cell und 
danach erzeugt du die funktion.

Entweder musst du die Funktion einfach weiter nach oben schieben oder du 
machst eine forward deklaration.

Das geht in dem du

int SET_Cells (int C);

ganz oben, am besten nach den includes hinschreibst.

von Peter (Gast)


Lesenswert?

Du hast auch noch ein paar sehr unsaubere stellen im code.


Lies dir mal den Artikel durch

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Anforderungen_an_Interrupt-Routinen

Beachte insbesondere wann und warum man volatil verwenden sollte. Und 
was man beachten sollte wenn man auf Variablen >8bit im Interrupt und im 
normalen Programm ablauf zugreift.

von Peter (Gast)


Lesenswert?

Und warum geben alle deine Funktionen ein int zurück? Hast du zu viel 
rechzeit?

von Magnus Müller (Gast)


Lesenswert?

Peter schrieb:
> Das geht in dem du
>
> int SET_Cells (int C);
>
> ganz oben, am besten nach den includes hinschreibst.

Wobei auch

int SET_Cells (int);

reichen würde. Es genügt, dem Compiler bekannt zu geben, dass es eine 
Funktion "SET_Cells" gibt, welche einen Wert im Format int zurückgibt 
und einen Übergabeparameter im Format int benötigt. Der Hinweis auf 
den Namen des Parameters (in diesem Falle "C") ist in der Deklaration 
nicht notwendig.

von Max (Gast)


Lesenswert?

Hallo,

ja ich weis das der Code noch unsauber ist. Die Hauptsache ist erstmal 
das er funktioniert. Von  der Rechenzeit eigentlich unkritisch.

Die Interrupt-Routine vom ADC muss sein. Wenn sich ein Wert ändert muss 
gleich die PWM Frequenz geändert werden.

MFG Max

von Peter (Gast)


Lesenswert?

Du sollst dir durchlesen für was "volatil" da ist - du hast sonst ein 
fehler im code den den sonst NIE findest.

Das mit den Interupt ist schon soweit richtig, man bloss bloss ein paar 
dinge beachten was du nicht gemacht hast.

von Rolf Magnus (Gast)


Lesenswert?

> Der Hinweis auf den Namen des Parameters (in diesem Falle "C") ist
> in der Deklaration nicht notwendig.

Notwendig nicht, aber sinnvoll, weil man dann beim Lesen gleich weiß, 
was die Parameter bedeuten. Das setzt allerdings einen sinnvollen Namen 
voraus.

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.