hallo, ich habe ein kleines Programm in C geschrieden.Das Programm soll nur der Bereich einer Variable überprüfen.Wenn der Bereich stimmt, wird eine andere Funktion aufgerufen. Wenn Zahl auch die Werte 32 hat ist auch die transmitt Funktion aufgerufen. Wo mache ich Fehler. Danke
Nina wrote: > Wo mache ich Fehler. > Danke Z. B. da:
1 | if(0<= zahl<=15) |
Wenn überhaupt, dann
1 | if((0 <= zahl) && (zahl <= 15)) |
Es sind zwei Bedingungen zu erfüllen, und die kann man in C nicht in einer Abfrage überprüfen.
Compilerwarnungen auch mit angucken:
1 | foo.c:20: warning: comparison is always true due to limited range of data type |
2 | foo.c:20: warning: comparisons like X<=Y<=Z do not have their mathematical meaning |
Die Bedingung (0<= zahl<=15) ist immer wahr. Warum? Siehe hier: Beitrag "Re: RC5-Auswertung Problem"
Hallo, ich habe mich sehr schnell gefreut. Die transmitt Funktion wird nur aufgerufen für zahl=0; für andere Werte klappt nicht. Nina
Das kann so überhaupt nicht funktionieren und dürfte zu einer ganzen Reihe Fehlermeldungen beim Compilieren führen! Zuweisungen an Variablen dürfen in C nur innerhalb von Funktionen stehen. In main() fehlt nebenbei noch eine Endlosschleife (was allerdings kein Fehler i.e.S. ist, aber den Compiler zumindest zu einer Warnung veranlassen dürfte, da eine Funktion vom Typ int einen Rückgabewert braucht, ein return hier aber fehlt...). Weitere Fehlermeldungen dürften dadurch hervorgerufen werden, dass die aufgerufenen Funktionen zum Zeitpunkt ihres Aufrufs nicht bekannt sind. Also bitte compilierbaren Code posten!
> if(((0>=(zahl))&& ((zahl)<= 14)))
Und nochmal: Zahl ist unsigned und kann nie kleiner als Null werden!
Dementsprechend ist die Abfrage "0 >= zahl" völlig sinnfrei! Das müsste
auch eine Compilerwarnung geben (wie oben schon mal erwähnt), die aber
angesichts der anderen schon kaum noch eine nennenswerte Rolle spielt!
Nina wrote: > Hallo, > ich habe mich sehr schnell gefreut. Die transmitt Funktion wird nur > aufgerufen für zahl=0; für andere Werte klappt nicht. > Du musst anfangen dir selbst zu helfen. Setze doch einfach mal für zahl ein paar Werte ein. ZB. 1 Deine Abfrage lautet (mal um etliche Klammern befreit) if( ( 0 >= zahl ) && ( zahl <= 14 ) Jetzt mal für zahl gleich 1 eingesetzt. if( ( 0 >= 1 ) && ( 1 <= 14 ) Der erste Ausdruck lautet 0 >= 1 Ist das wahr oder falsch? Ist 0 tatsächlich größer oder gleich 1? Offensichtlich nicht. Und da damit der erste Ausdruck bereits falsch ist, brauchst du den 2.ten erst gar nicht berücksichtigen. Wenn bei einem UND ein Teilausdruck falsch ist, dann ist der ganze Ausdruck falsch. Abgesehen davon. Wie bereits gesagt: zahl ist ein unsigned Wert. Der kann per Definition nicht kleiner als 0 sein.
hallo Johannes, mein compiler zeigt keinen Fehler, deswegen möchte ich die aufgabe weiter machen.
Nina wrote:
> mein compiler zeigt keinen Fehler, [...]
Das kann mit dem Code nicht sein! Der wimmelt nur so von
Syntaxfehlern!
1 | uint8_t zahl1=4; |
2 | uint8_t zahl2=6; |
3 | uint8_t zahl3=8; |
So weit i.O. ...
1 | zahl=4; |
Hier wird einer Variable, die gar nicht existiert, außerhalb einer Funktion ein Wert zugewiesen --> Schon mal mindestens 2 Fehler!
1 | uint8_t buffer; |
2 | int l=0; |
3 | int k=0; |
4 | int counter=0; |
Das ist zumindest syntaktisch OK...
1 | int main(void) |
2 | {
|
3 | chek(); |
4 | fehler(); |
5 | }
|
Sowohl chek() als auch fehler() sind dem Compiler zu diesem Zeitpunkt unbekannt --> Wahrscheinlich Warnmeldungen à la "implicit declaration of..."
1 | void chek(void) |
2 | {
|
3 | |
4 | if(((zahl1)<= 14)) |
5 | {
|
6 | counter++; |
7 | }
|
8 | else
|
9 | return; |
10 | |
11 | if(((zahl2)<= 10) |
12 | {
|
13 | counter++; |
14 | }
|
15 | else
|
16 | return; |
17 | if(((zahl3)<= 8)) |
18 | {
|
19 | counter++; |
20 | }
|
21 | else
|
22 | return; |
Naja, zumindest keine Syntaxfehler...
1 | if (counter==3) |
2 | {
|
3 | transmitt(); |
4 | }
|
5 | }
|
Und wieder: transmitt() kennt der Compiler gar nicht, weil erst weiter unten definiert!
1 | void transmitt(void) |
2 | {
|
3 | buffer=2*zahl; |
4 | }
|
5 | |
6 | void fehler(void) |
7 | {
|
8 | printf("Wert ausser dem Bereich:%s"); |
9 | }
|
printf ist dem Compiler auch nicht bekannt, weil die entsprechende Bibliothek gar nicht eingebunden ist! Der Code war im Original übrigens grauenvoll formatiert. Exzessive Verwendung von Leerzeilen und relativ unmotiviertes Einrücken tragen sicher nicht positiv zur Lesbarkeit bei... Und wie schon im anderen Thread gesagt: C-Buch kaufen und lesen. Ohne Grundlagen geht gar nichts und das Forum ist dafür nicht da! (Amnmerkung: Der Code stammt aus dem zweiten Thread von Nina, der mittlerweile wegen Doppelposting geschlossen wurde...)
Ich habe da nur einen Rat an euch beide: "Gebt es auf! Es macht keinen Sinn!" DEtlef
Hallo Johannes, bitte sei nicht aufgeregt, ich brauche nur Hilfe.Wir können noch einmal versuchen. Hier ist eine saubere Code
Nina wrote:
> Hier ist eine saubere Code
...und immer noch mit den selben Fehlern! Und "sauber" ist auch was
Anderes...
Johannes M. wrote: > Nina wrote: >> Hier ist eine saubere Code > ...und immer noch mit den selben Fehlern! Und "sauber" ist auch was > Anderes... @Nina Allerdings. Sauber ist wirklich was anderes. Jetzt gehst du erst mal her und schmeisst alle überflüssigen Klammern raus. Du hast jede Menge Klammern die den Blick aufs wesentliche verschleieren und nichts, aber auch gar nichts zur Klarheit beitragen. Aus
1 | if(((zahl1)<= 14)) |
2 | |
3 | {
|
4 | counter++; |
5 | }
|
6 | else
|
7 | return; |
wird so
1 | if( zahl1 <= 14 ) |
2 | counter++; |
3 | else
|
4 | return; |
Sieht doch gleich viel besser aus. Alternativ kann man auch die { } Klammern drinnen lassen
1 | if( zahl1 <= 14 ) |
2 | {
|
3 | counter++; |
4 | }
|
5 | else
|
6 | {
|
7 | return; |
8 | }
|
oder so
1 | if( zahl1 <= 14 ) { |
2 | counter++; |
3 | }
|
4 | else { |
5 | return; |
6 | }
|
ist in dem Fall (bei nur einer abhängigen Anweisung) Geschmackssache. Ich persönlich mag es nicht, weil es den Code zu m.M. zu sehr in die Länge zieht. Danach gehst du her und stellst erst mal deine Einrückungen richtig. Nach jeder { wird zb. 2 Leerzeichen eingerückt und nach jeder } wird die nachfolgende Zeile wieder 2 Leerzeichen ausgerückt. (Statt 2 kann man auch 4 nehmen. Mehr ist meist unpraktisch, weil man zu schnell an den rechten Rand kommt) So was
1 | int main(void) |
2 | {
|
3 | chek(); |
4 | fehler(); |
5 | |
6 | }
|
geht zum Beispiel gar nicht. Das int bei /int main()/ muss am linken Rand stehen. Der Aufruf der Funktion chek ist zwar sauber eingerückt aber schon in der nächsten Zeile stimmt die Einrückung schon wieder nicht. Und die Leerzeile vor der schließenden } trägt nichts, aber auch gar nichts zur Lesbarkeit bei. Generell: Wenn dir etwas wichtig genug ist, dass du Leerzeilen davor oder dahinter einfügen willst, dann kannst du als bessere Alternative auch gleich überflüssigen Leerzeilen durch einen Kommentar ersetzen, der die Situation erklärt. Ansonsten sind auch mehrere Leerzeilen hintereinander genausowichtig wie mehrere Rufzeichen beim Posten in einem Forum: völlig unsinnig. Sieh dir mal den Abschnitt an
1 | if(((zahl1)<= 14)) |
2 | |
3 | {
|
4 | counter++; |
5 | }
|
6 | else
|
7 | return; |
8 | |
9 | if(((zahl2)<= 10)) |
10 | |
11 | {
|
12 | counter++; |
13 | }
|
14 | else
|
15 | return; |
16 | if(((zahl3)<= 8)) |
Warum ist da nach dem ersten if eine Leerzeile? Will uns die irgendetwas sagen? gehört das nachfolgende { counter++; ... etwas nicht mehr zu diesem if? Warum ist allerdings vor dem if(((zahl3)<= 8)) keine Leerzeile? Da wäre sie doch sinnvoll! Denn schliesslich gehört dieser Teil nicht mehr zum vorhergehenden if. Baue deinen Code so auf, dass er leicht lesbar ist. Dann hast du und jeder andere der ihn lesen muß sehr viel mehr davon. Und nein. Eine ordentliche Codeformatierung ist nicht Selbstzweck sondern ist eine deiner Waffen um Fehler im Code zu finden. PS: chek schreibt sich übrigens mit ck - check. Auch solche offensichtliche Tippfehler tragen beileibe nicht zum einfachen Codeverständnis bei.
Karl heinz Buchegger wrote: > PS: chek schreibt sich übrigens mit ck - check. > Auch solche offensichtliche Tippfehler tragen beileibe nicht > zum einfachen Codeverständnis bei. ...und transmit mir nur einem t am Ende. Aber das ist eher Fliegendreck im Vergleich mit dem Rest. Ich finde es eher sehr verdächtig, dass Nina behauptet, ihr Compiler würde das da ohne irgendwelche Fehler- und Warnmeldungen übersetzen. Das hat fast Troll-Format.
Johannes M. wrote: > Karl heinz Buchegger wrote: >> PS: chek schreibt sich übrigens mit ck - check. >> Auch solche offensichtliche Tippfehler tragen beileibe nicht >> zum einfachen Codeverständnis bei. > ...und transmit mir nur einem t am Ende. Aber das ist eher > Fliegendreck im Vergleich mit dem Rest. Allerdings. Ich finde es nur immer wieder bezeichnend, dass die Leute mit dem grauslichsten Code immer die meisten (läppischen) Fehler drin haben. Hundertausend Leerzeilen zwischen 2 Anweisungen aber dort wo Leerzeichen den Lesefluß unterstützen könnten sind keine. > Ich finde es eher sehr > verdächtig, dass Nina behauptet, ihr Compiler würde das da ohne > irgendwelche Fehler- und Warnmeldungen übersetzen. Das hat fast > Troll-Format. Full ACK. Das bringt sie so nie und nimmer durch den Compiler. @Nina: Ich würde es so schreiben
1 | #include <stdio.h> |
2 | #include <stdint.h> |
3 | |
4 | uint8_t zahl1 = 4; |
5 | uint8_t zahl2 = 6; |
6 | uint8_t zahl3 = 8; |
7 | uint8_t zahl = 4; |
8 | uint8_t buffer; |
9 | |
10 | void fehler( void ) |
11 | {
|
12 | printf( "Wert ausser dem Bereich:" ); |
13 | }
|
14 | |
15 | void transmit( void ) |
16 | {
|
17 | buffer = 2 * zahl; |
18 | }
|
19 | |
20 | void check( void ) |
21 | {
|
22 | if( zahl1 <= 14 && |
23 | zahl2 <= 10 && |
24 | zahl3 <= 8 ) |
25 | transmit(); |
26 | }
|
27 | |
28 | int main( void ) |
29 | {
|
30 | check(); |
31 | fehler(); |
32 | }
|
PS: Ich weiß, daß es hier noch viel zu tun gäbe aber ich will ihr auch nicht zuviel auf einmal ändern. Sie muß die Änderung ja auch noch überschauen und mit ihrem eigenen Code vergleichen können.
Danke! Ich wette darauf hat Nina jetzt etwa 24h gewartet. Endlich hat ihr jemand das Programm geschrieben. Obwohl ich glaube jetzt kommen wir erst zum eigentlichen Problem. Das war doch nur vorgeplänkel. DEtlef
DEtlef wrote:
> erst zum eigentlichen Problem. Das war doch nur vorgeplänkel.
:-)
Allerdings.
Sieh dir das Program an. Damit kann man im Grunde nichts anfangen.
Aber ist mal ein Anfang um die Syntax zu zeigen.
hallo, ich danke euch für die Hinweisen und werde auch auf die Schreibfehler achten. Danke
> Sieh dir das Program an. Damit kann man im Grunde nichts anfangen.
Och, das würde ich nicht sagen... Ein Compiler mit eingeschalteter
Optimierung hat hier ein richtiges Erfolgserlebnis... Schade das
Compiler keine Jubel-Gefühle zeigen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.