Forum: Mikrocontroller und Digitale Elektronik Programm reagiert nicht auf return 1 oder return 0


von student (Gast)


Lesenswert?

Hey ich habe folgendes Probelm,

ich habe folgenden code:
1
//main.c
2
void main(void)
3
{
4
  bool vtest = false;
5
  int ret = 0;
6
7
  init();   
8
9
  if (!vtest){
10
    ret = test();
11
  }
12
13
  while (ret){
14
15
    switch_output_K3_ON;
16
    _delay_ms(1000);
17
    switch_output_K3_OFF;  
18
    _delay_ms(1000);  
19
  }    
20
}
21
22
23
//switch.c
24
int test(void)
25
{
26
27
//.... CAN definitionen
28
  
29
bool test_ON = true;
30
31
while (test_ON){
32
  if(can_rcv && can_rcv_message.id == 0x255){
33
     switch (can_rcv_message.data[0])
34
     {        
35
     case 0xFF:
36
           switch_output_K1_ON;
37
           _delay_ms(1000);
38
           switch_output_K1_OFF;  
39
           _delay_ms(1000);
40
           test_ON = false;
41
           return 1;
42
           break;
43
44
     case 0x00:
45
           switch_output_K2_ON;
46
           _delay_ms(1000);
47
           switch_output_K2_OFF;  
48
           _delay_ms(1000);
49
           test_ON = false;
50
           return 0;
51
           break;
52
     default:
53
           test_ON = false;
54
           break;  
55
     }
56
   }
57
}      
58
}

Der Code funktioniert eigentlich super. Ich empfange CAN Nachrichten und 
lasse die Ausgaenge K1 und K2 blinken, jedoch reagiert mein Programm 
nicht auf return Befehl und somit gehe ich nicht in die while Schleife 
in main.c um den Ausgang K3 zu schaltem. Kann mir einer sagen was ich 
falsch mache? Auch wenn die Variable test_ON auf falsch setze, dann gehe 
ich auch nicht aus der while Schleife von switch.c. Was ich auch 
irgendwie nicht ganz verstehe.

Help & Danke

von Marcus O. (marcus6100)


Lesenswert?

innerhalb int test(void) fehlt am ende der Funktion eine return 
Anweisung (die dann im default Fall ausgeführt wird, wenn die Schleife 
verlassen wird). Du solltest auf die Compilerwarnung hören. Und 
irgendwie ist das sehr hässlich programmiert...

von Helge O. (_elko_)


Lesenswert?

Mein Prof hat uns immer die Ohren lang gezogen, wenn wir mehr als ein 
einziges RETURN hatten.

was soll das programm zurückgeben, falls es in den default Zweig geht? 
Da gibts keine Rückgabe....
Glaube, dass man das nicht darf, und der Compiler die beiden anderen 
Returns deswegen wegcompiliert? Ist gerade nur so geraten, wäre ggf. nen 
Ansatzpunkt.

von student (Gast)


Lesenswert?

Hey,

danke fuer den Tipp. Habe gerade ausprobiert (siehe unten), leider 
erfolglos, vielleicht habe ich was falsch verstanden?

@Marcus
Frage was meinst du hässlich programmiert? Meinst du die delays? Wenn ja 
das ist nur test.
1
//main.c
2
void main(void)
3
{
4
  bool vtest = false;
5
  int ret = 0;
6
7
  init();   
8
9
  if (!vtest){
10
    ret = test();
11
  }
12
13
  while (ret){
14
    switch_output_K3_ON;
15
    _delay_ms(1000);
16
    switch_output_K3_OFF;  
17
    _delay_ms(1000);  
18
  }    
19
}
20
21
22
//switch.c
23
int test(void)
24
{
25
26
//.... CAN definitionen
27
  
28
bool test_ON = true;
29
30
while (test_ON){
31
  if(can_rcv && can_rcv_message.id == 0x255){
32
     switch (can_rcv_message.data[0])
33
     {        
34
     case 0xFF:
35
           switch_output_K1_ON;
36
           _delay_ms(1000);
37
           switch_output_K1_OFF;  
38
           _delay_ms(1000);
39
           test_ON = false;
40
           return 1;
41
           break;
42
43
     case 0x00:
44
           switch_output_K2_ON;
45
           _delay_ms(1000);
46
           switch_output_K2_OFF;  
47
           _delay_ms(1000);
48
           test_ON = false;
49
           return 0;
50
           break; 
51
     }
52
   }
53
} 
54
return 0;     
55
}

von student (Gast)


Lesenswert?

Interessant ist selbst wenn ich return nur am ende als default benutze 
und test_ON auf false gesetzt habe dann geht die schleife weiter.
1
//main.c
2
void main(void)
3
{
4
  bool vtest = false;
5
  int ret = 0;
6
7
  init();   
8
9
  if (!vtest){
10
    ret = test();
11
  }
12
13
  while (ret){
14
    switch_output_K3_ON;
15
    _delay_ms(1000);
16
    switch_output_K3_OFF;  
17
    _delay_ms(1000);  
18
  }    
19
}
20
21
22
//switch.c
23
int test(void)
24
{
25
26
//.... CAN definitionen
27
  
28
bool test_ON = true;
29
30
while (test_ON){
31
  if(can_rcv && can_rcv_message.id == 0x255){
32
     switch (can_rcv_message.data[0])
33
     {        
34
     case 0xFF:
35
           switch_output_K1_ON;
36
           _delay_ms(1000);
37
           switch_output_K1_OFF;  
38
           _delay_ms(1000);
39
           test_ON = false;
40
           break;
41
42
     case 0x00:
43
           switch_output_K2_ON;
44
           _delay_ms(1000);
45
           switch_output_K2_OFF;  
46
           _delay_ms(1000);
47
           test_ON = false;
48
           break; 
49
     }
50
   }
51
} 
52
return 1;     
53
}

von student (Gast)


Lesenswert?

Also es funktioniert. Es lag total nicht an dem Code, sondern an einer 
anderen Variable, die nichts damit zu tun hat. ??????????? Verstehe 
nicht, aber es funktioniert. ??????
Was ich gemacht haben ist, ich habe alle Warungen im Compiler elimiert 
habe und es ging auf einmal.

DANKE JUNGS.

von Haudrauf ! (Gast)


Lesenswert?

Sonst gibt es auch noch einen Simulator...

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.