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

Gast #1331162
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
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
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
> 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 #1331617
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
Gast #1331645
> 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
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
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
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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.