www.mikrocontroller.net

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


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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;
      
    break;



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




MFG Max

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klammern setzen ist ab und an doch  sinnvoll {}

PS: if-Schleifen gibt es nicht ;)

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Wie kann ich noch die Warning beheben?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt keine "if-Schleifen". Auch keine "if-else-Schleifen".

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

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Peter: upps. Hatte ich halt noch mitmarkiert. Einfach wegdenken...
SET_Cells habe ich natürlich erstellt.
int SET_Cells (int C)
{

  switch (C)
    {
      case 2:
        PORTB |= (1<<PB0);
    break;
  
        case 3:
        PORTB |= (1<<PB0);
          
  }
  return 0;      
}


MFG Max

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
break vergessen reinzuschreiben. Sorry

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt Zeig doch entlich mal den kompletten quelltext sonst muss man doch 
nur raten.

Autor: Max (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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.

Autor: Peter (Gast)
Datum:

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

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.