Forum: Mikrocontroller und Digitale Elektronik Denkblokade bei switch/case Anweisung?


von switch (Gast)


Lesenswert?

Hallo,

ich wollte nachfolgenden Code verwenden um Adressbereiche vom Speicher 
zu selectieren:
1
    unsigned long *pAdress, adress1, adress2;
2
    pAdress = &adress1;
3
4
    switch ( pAdress )
5
    {
6
    case ( &adress1 ):
7
        return 1;
8
    
9
    case ( &adress1 ):
10
        return 2;
11
    }

Erhalte beim compilieren aber die Fehlermeldungen:
1
C:/Freescale/CW_MCU_v10.2/MCU/ARM_Tools/Command_Line_Tools/mwccarm|Compiler|Error
2
(D:test.c|235|21|1|5797|1)
3
=    switch ( pAdress )  
4
5
Errors caused tool to abort.
6
mingw32-make: *** [Sources/gpio.obj] Error 1
7
>illegal operand 'unsigned long *'
8
C:/Freescale/CW_MCU_v10.2/MCU/ARM_Tools/Command_Line_Tools/mwccarm|Compiler|Error
9
(D:test.c|237|21|1|5828|1)
10
=    case ( &adress1 ):  
11
>illegal constant expression
12
C:/Freescale/CW_MCU_v10.2/MCU/ARM_Tools/Command_Line_Tools/mwccarm|Compiler|Error
13
(D:test.c|240|21|1|5877|1)
14
=    case ( &adress1 ):  
15
>illegal constant expression

Gestalte ich das ganze um in eine If/else Anweisung, funktioniert es 
wieder.
1
    unsigned long *pAdress, adress1, adress2;
2
    pAdress = &adress1;
3
4
    if ( pAdress == &adress1 )
5
    {
6
        return 1;
7
    }
8
    else if ( pAdress == &adress2 )
9
    {
10
        return 2;
11
    }

Kann mir jemand erklähren warum der eine Weg geht, der andere aber 
nicht? In meinen Augen ist das genau das gleiche?

von STK500-Besitzer (Gast)


Lesenswert?

switch schrieb:
> Hallo,
>
> ich wollte nachfolgenden Code verwenden um Adressbereiche vom Speicher
> zu selectieren:
>     unsigned long *pAdress, adress1, adress2;
>     pAdress = &adress1;
>
>     switch ( pAdress )
>     {
>     case ( &adress1 ):
>         return 1;
>
>     case ( &adress1 ):
>         return 2;
>     }


> Gestalte ich das ganze um in eine If/else Anweisung, funktioniert es
> wieder.
>     unsigned long *pAdress, adress1, adress2;
>     pAdress = &adress1;
>
>     if ( pAdress == &adress1 )
>     {
>         return 1;
>     }
>     else if ( pAdress == &adress2 )
>     {
>         return 2;
>     }
> Kann mir jemand erklähren warum der eine Weg geht, der andere aber
> nicht? In meinen Augen ist das genau das gleiche?

AFAIK benutzt switch/case nur Konstanten als Vergleichswerte.

>>illegal constant expression
steht da ja auch...

von Karl H. (kbuchegg)


Lesenswert?

switch schrieb:

> Kann mir jemand erklähren warum der eine Weg geht, der andere aber
> nicht?

Dann schau mal in deinen Unterlagen nach, welche Restriktionen ein 
switch/case an den Datentyp des switch-Ausdrucks (und damit auch 
naturgemäss an die einzelnen case Labels) stellt.

von MaWin (Gast)


Lesenswert?

Die case-Werte müssen konstant sein,
der Compiler kann aber die Adressen noch nicht berechnen
(das macht erst der Linker).

von blob! (Gast)


Lesenswert?

du musst das per if-else Anweisung lösen!

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.