Alle Datentypen-> "nicht deklarierter Bezeichner"
-
Hallo zusammen,
habe ein kleines Problem mit meinem Programm. Es soll verschiedene Kondensatoren einlesen, mir aus eingestellten Werten die billigste Zusammenstellung berechnen und dann den passendsten Kondensator ausgeben.
Hier der Code:#include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <conio.h> #include <string.h> struct kondensator { char bestellnr[20]; double kapazitet; float preis; float spannung; }; int main() { struct kondensator a,b; float maxsp=15,maxc=10; a.preis=0.0; int i=1,z=0; char ch; do { if(a.preis=0.0) { printf("Bitte Datensatz Nr.%i eingeben:\nBestellnr:",i); scanf_s("%s",a.bestellnr); printf("\nC:\n"); scanf_s("%lf",a.kapazitet); printf("\nPreis:\n"); scanf_s("%f",a.preis); printf("\nSpannung:\n"); scanf_s("%f",a.spannung); i++; } else { printf("Bitte Datensatz Nr.%i eingeben:\nBestellnr:",i); scanf_s("%s",b.bestellnr); printf("\nC:\n"); scanf_s("%lf",b.kapazitet); printf("\nPreis:\n"); scanf_s("%f",b.preis); printf("\nSpannung:\n"); scanf_s("%f",b.spannung); i++; printf("Abbrechen?"); scanf_s("%c",ch); if(ch!='\n') { z=1; } } //Berechnung: float floata; float tempca,tempcb; int tempa,tempb; float gesammt1,gesammt2; //1. floata=(maxsp/a.spannung)+0.5; tempa=(int)floata; tempca=(1/(tempa*(1/a.kapazitet))); tempcb=(maxc/tempca)+0,5; tempb=(int)tempcb; gesammt1=tempa*tempb*a.preis; //2. floata=(maxsp/b.spannung)+0.5; tempa=(int)floata; tempca=(1/(tempa*(1/b.kapazitet))); tempcb=(maxc/tempca)+0,5; tempb=(int)tempcb; gesammt2=tempa*tempb*b.preis; if(gesammt1>gesammt2) { strcpy(a.bestellnr,b.bestellnr); a.kapazitet=b.kapazitet; a.preis=b.preis; a.spannung=b.spannung; } }while(!z); printf("Bestellnr:%s\nKapazität:%lf\nPreis:%f\nSpannung:%f",a.bestellnr,a.kapazitet,a.preis,a.spannung); while(!_kbhit()); return 0; }
Das Problem ist nun, der Compiler bringt beim ausführen immer den Fehler "nicht deklarierter Bezeichner". Und zwar bei jeder einzelnen Variable. Sei es float int oder char...
Ist wahrscheinlich nur ne Kleinigkeit, ich komme aber nicht darauf.
Mfg Stefan
-
...
-
Hallo Stefan,
bei C (im Gegensatz zu C++) dürfen Variablendeklarationen nur am Anfang eines Blocks stehen (und danach im Block dürfen nur noch Anweisungen stehen).
Daher funktioniertstruct kondensator a,b; float maxsp=15,maxc=10; a.preis=0.0; int i=1,z=0; char ch;
nicht (da "a.preis=0.0" eine Anweisung ist und danach wieder Variablendeklarationen erfolgen).
Du mußt also die Variablendeklarationen zuerst durchführen und danach dann Anweisungen.
Auch weiter unten im Code hast du noch diesen Fehler drin.P.S. Schau dir auch noch mal die erste if-Abfrage genau an...
-
...
-
Danke für die Antworten!
Das Programm startet nun.
Aber sobald ich die erste Bestellnr eingegeben habe, kommt der Fehler:"Unbehandelte Ausnahme bei 0x593100d8 (msvcr100d.dll) in Kondensatorrechner.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xcccccccc."
Weiß jemand Abhilfe?
-
Guck dir nochmal an, wie scanf funktioniert. Welche Argumenttypen werden für welchen Formatstring erwartet?
-
Swordfish schrieb:
btw: scanf will pointer als Parameter und
<a href= schrieb:
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l">[...] scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or [. The buffer size is passed as an additional parameter immediately following the pointer to the buffer or variable.
-
Achsooooo.
Das &.....
-
...
-
Was heißt Puffergröße? Davon hatten wir bis jetzt nichts in Informatik..
-
Die Größe des Bereichs, in dem scanf_s die Daten ablegt.
Du hast für bestellnr 19 Zeichen Platz. Diese Information musst du scanf_s übergeben.
Warum nimmst du überhaupt scanf_s ?
Hast du dir mal die Referenz zu dieser Funktion angesehen?
-
...
-
DirkB schrieb:
Warum nimmst du überhaupt scanf_s ?
Hast du dir mal die Referenz zu dieser Funktion angesehen?Ich benutze vs und das erlaubt mir nur scanf_s weil das Normale unsicher sei.
Wie reserviere ich nun speicher? Oder gibts alternativen?
-
Stefan032 schrieb:
DirkB schrieb:
Warum nimmst du überhaupt scanf_s ?
Hast du dir mal die Referenz zu dieser Funktion angesehen?Ich benutze vs und das erlaubt mir nur scanf_s weil das Normale unsicher sei.
Wie reserviere ich nun speicher? Oder gibts alternativen?Nimm einfach scanf und ignorier die Warnung.
-
Stefan032 schrieb:
Wie reserviere ich nun speicher?
Brauchst du nicht, den hast du ja schon.
Du musst nur noch angeben, wieviel Daten da rein passen.Auch mein Tipp:
Nathan schrieb:
Nimm einfach scanf und ignorier die Warnung.
Aber nur diese Warnung. Man kann die auch abstellen.
Mach mal die Forensuche (Suchabfrage powered by Google) mit der Warningnummer.
-
Stefan032 schrieb:
if(a.preis=0.0) /* das ist Anfänger-Müll */ ... tempcb=(maxc/tempca)+0,5; /* noch mehr Müll */ tempcb=(maxc/tempca)+0,5; /* noch mehr Müll */
Solange du solche Fehler machst, brauchst du gar nicht erst versuchen, dein Programmdesign zu entwerfen.
-
Wutz schrieb:
Stefan032 schrieb:
if(a.preis=0.0) /* das ist Anfänger-Müll */ ... tempcb=(maxc/tempca)+0,5; /* noch mehr Müll */ tempcb=(maxc/tempca)+0,5; /* noch mehr Müll */
Solange du solche Fehler machst, brauchst du gar nicht erst versuchen, dein Programmdesign zu entwerfen.
Also, ich bin Anfänger, deswegen ist mir jetzt eine nicht sachliche Meinung gerade egal. Ich habe dieses "runden" so im Net gefunden. Wenn man solche Sachen schreibt, kann man auch Änderungsvorschläge zeigen.
Edit: Gehe ich euch auf die Nerven oder was soll das? Das bin ich von diesem Forum garnicht gewohnt...
-
Mal nicht so empfindlich.
Bei einem if sollte ein Vergleich stehen und keine Zuweisung.
Zudem ist der Vergleich auf Gleichheit bei Fließkommazahlen schwierig.
Bei 0.0 geht es noch, wenn du ihn vorher direkt zugewiesen hast.Und was der Kommaoperator macht, wirst du als Anfänger nicht einschätzen können.
Aber du wirst sicher ein Fließkommazahl meinen. Nur schreibt man die in C (trotz des Namens) nicht mit einem Komma sonderm mit einem Dezimalpunkt.Runden würdest du auch nur, wenn du aus dem Ausdruck eine Ganzzahl machst oder einem int zuweist.
-
DirkB schrieb:
Mal nicht so empfindlich.
Bei einem if sollte ein Vergleich stehen und keine Zuweisung.
Zudem ist der Vergleich auf Gleichheit bei Fließkommazahlen schwierig.
Bei 0.0 geht es noch, wenn du ihn vorher direkt zugewiesen hast.Und was der Kommaoperator macht, wirst du als Anfänger nicht einschätzen können.
Aber du wirst sicher ein Fließkommazahl meinen. Nur schreibt man die in C (trotz des Namens) nicht mit einem Komma sonderm mit einem Dezimalpunkt.Runden würdest du auch nur, wenn du aus dem Ausdruck eine Ganzzahl machst oder einem int zuweist.
Den Fehler mit der Zuweisung habe ich gesehen und behoben..
Die Abfrage soll nur bewirken dass ich mindestens zwei Sätze einlesen muss.
-
Ich brauche leider noch mal Hilfe..
Die Eingabe geht. Aber Ich bekomme am Schluss nur Kauderwelsch raus.http://s1.directupload.net/file/d/3472/8x9z2zd6_jpg.htm
Weiß jemand woran es liegt?