if-else-Schleife in if-Schleife geht nicht?

Gast #1331162
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
Gast #1331168
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
Gast #1331195
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
Gast #1331373
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.
Gast #1331645
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.
Gast #1331698
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
Gast #1331715
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.
Gast #1331730
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.
Gast #1331741
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
Gast #1331747
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.
Gast #1331929
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.

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