Programm reagiert nicht auf return 1 oder return 0

Gast #2375113
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
#2375411
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.
Gast #2375419
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
}
Gast #2375429
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
}
Gast #2375444
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.

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