Forum: PC-Programmierung "Einfaches" Problem bei C


von Michael D. (etzen_michi)


Lesenswert?

Guten Tag.

Ich bin daher das ich nun der Meinung bin mich ausreichend auf Assembler 
eingearbeitet zu haben dabei C zu Lernen.

Dabei habe ich momentan dieses einfache Problem:
1
#include <stdio.h>
2
3
float Summe;
4
5
int main()         {
6
                  
7
float Zahl();
8
float Zahl2();
9
float Addiere();
10
void Ausgabe();
11
12
Summe = Addiere(Zahl,Zahl);
13
//Ausgabe(Summe);
14
15
Zahl();
16
system("Pause");
17
return 0;
18
}
19
20
float Zahl(int Zahl)       {
21
      printf("\nBitte geben sie eine Zahl ein: ");
22
      scanf("%f", &Zahl);
23
      return Zahl;
24
      }
25
26
      
27
float Addiere(float Zahl1, float Zahl2)             {
28
      return (Zahl1+Zahl2)
29
      }

"Previous declaration of 'Addiere' was here" in Zeile 9
Aber ich muss das doch ankündigen oder??

Wie ist es richtig geschrieben das ich das Programm compilieren kann 
sodass er mich zwei Ziffern abfragt und diese Addiert.

Erklärung ist hier fast interessanter als der Lösungsweg ^^.

Wie muss solch eine Verschachtelung aufgebaut sein?
Was muss bei der bekanntmachung eines Unterprogramms in der Klammer 
stehen?

von MitLeser (Gast)


Lesenswert?

Entweder die Funktionen "über" die main() schreiben oder
per Prototyp am Anfang der Datei bekannt machen.

von Klaus W. (mfgkw)


Lesenswert?

Der Fehler ist, daß Deklaration (Zeile 9) und Definition (unten) nicht 
zusammenpassen.
Den ersten Teil der Fehlermeldung hast du unterschlagen...

von Michael D. (etzen_michi)


Lesenswert?

Nu habe ich den Fehler in Zeile5 (da der Ausschnitt nun höher ist).

Desweiteren habe ich den Fehler:

"an argument type that has a default promotion can't match an empty 
parameter name list declaration" in Zeile 29
1
(float Addiere (float Zahl1,float Zahl2);

Braucht ihr alle 7 Fehlermeldungen?

Zum Programmieren nutze ich DEV-C++


Inwiefern passen die nicht zusammen?

Sind doch beides float Addiere()

von Klaus W. (mfgkw)


Lesenswert?

Michael Dierken schrieb:
> Braucht ihr alle 7 Fehlermeldungen?

Eigentlich brauchst du die, aber wenn wir etwas dazu sagen sollen, dann 
brauchen wir die zusammen mit dem jeweils aktuellen Quelltext.
Es sei denn, die Hellseher des Forums sind gerade anwesend.

von Klaus W. (mfgkw)


Lesenswert?

Michael Dierken schrieb:
> Sind doch beides float Addiere()

Aber es gibt auch noch jeweils eine PARAMETERLISTE.
Der Rückgabewert ist nicht alles.

Ein C-Buch mal zu lesen würde vielleicht helfen.

von NurEinGast (Gast)


Lesenswert?

Ich denke Du kannst Dir gleich mal angewöhnen, eine Funktion mit Name 
UND Parametern zu beschreiben.

Obe schreibst Du

float Addiere();

unten steht

float Addiere(float Zahl1, float Zahl2)
{
   ...
}

Das passt nicht zusammen.
Oben sagst Du - die Funktion hat keine Parameter
( Obwohl dann auch ein void fehlt )
Unten hat sie dann doch welche.

von Michael D. (etzen_michi)


Lesenswert?

Der Übersicht halber nochmal der Quelltext (bin vlt. schon etwas weiter 
gekommen):
1
#include <stdio.h>
2
3
float Summe;
4
5
6
int main()         {
7
                  
8
float Zahl();
9
float Addiere(float Zahl1, float Zahl2);
10
void Ausgabe();
11
12
Summe = Addiere(Zahl,Zahl);
13
//Ausgabe(Summe);
14
15
16
system("Pause");
17
return 0;
18
}
19
20
float Zahl(int Zahl)       {
21
      printf("\nBitte geben sie eine Zahl ein: ");
22
      scanf("%f", &Zahl);
23
      return Zahl;
24
      }
25
26
      
27
float Addiere(float Zahl1, float Zahl2)             {
28
      return (Zahl1 + Zahl2)
29
      }

Fehlermeldungen:

In function `main':
12 incompatible type for argument 1 of `Addiere'
12 incompatible type for argument 2 of `Addiere'
In function `Addiere':
29 syntax error before '}' token

Sind immerhin nun "nurnoch" 3Fehler in diesem extrem langen Koplexen 
Programm (Ist ja fast wie mein erstes Diktat).

Wachtler: Bin gerade dabei mit einem Online Tutorial zu Lernen (Erst 
gelesen und nun am Programmieren).

Edit: Nun sinds nurnoch die beiden in Zeile 12.

von ich (Gast)


Lesenswert?

Michael Dierken schrieb:
> Ich bin daher das ich nun der Meinung bin

Gibt's dafür bitte auch einen Quelltext?

von NurEinGast (Gast)


Lesenswert?

float Zahl;  // *************  () WEG

Is ja ne float variable, keine Funktion



float Addiere(float Zahl1, float Zahl2)             {
      return (Zahl1 + Zahl2); // ************ Semikolon fehlte
      }

von Michael D. (etzen_michi)


Lesenswert?

Für meine Assembler Fortschritte?

Habe ich zuhause.

Meine erfolgreichen Programme waren zuletzt:


Frequenzzähler um 32Bit Umrechner für Drehzahl Auto

Gerät zum Auslesen der Fehlercode meines Autos

Keyboard auf TextDisplay

Ansteuerungsroutine für GrafikLCD.

sowie

Routine zum Anzeigen einer Grafik auf GrafikLCD mit angabe Position X, Y 
im Pixel ohne über Rand schreiben.

von Kontrolle (Gast)


Lesenswert?

1
#include <stdio.h>
2
3
float Zahl(void);   // Parameterliste nicht vergessen
4
float Addiere(float Zahl1, float Zahl2);
5
void Ausgabe(float); // Parameterliste nicht vergessen
6
7
int main()         {
8
                  
9
  float Summe, Zahl = 1.0;
10
11
  Summe = Addiere(Zahl,Zahl);
12
//  Ausgabe(Summe);
13
14
  system("Pause");
15
  return 0;
16
}
17
18
19
float Zahl(void)       {  // was sollte das int da?
20
      float Zahl;
21
      printf("\nBitte geben sie eine Zahl ein: ");
22
      scanf("%f", &Zahl);
23
      return Zahl;
24
      }
25
26
      
27
float Addiere(float Zahl1, float Zahl2)             {
28
      return (Zahl1 + Zahl2);
29
      }

Nimm lieber double statt float, ist genauer. (Bei scanf dann aber "%lf")

von Michael D. (etzen_michi)


Lesenswert?

Habe das mit dem "Zahl" angepasst das nun Zahl als Funktion und Zahlx 
als Variable vorhanden ist sowie float Zahlx in den Prototypen für Zahl 
eingefügt, bekomme aber weiterhin die gleiche Fehlermeldung:
1
#include <stdio.h>
2
3
float Summe;
4
5
6
int main()         {
7
                  
8
float Zahl(float Zahlx);
9
float Addiere(float Zahl1, float Zahl2);
10
void Ausgabe();
11
12
Summe = Addiere(Zahl,Zahl);
13
//Ausgabe(Summe);
14
15
16
system("Pause");
17
return 0;
18
}
19
20
float Zahl(float Zahlx)       {
21
      printf("\nBitte geben sie eine Zahl ein: ");
22
      scanf("%f", &Zahlx);
23
      return Zahlx;
24
      }
25
26
      
27
float Addiere(float Zahl1, float Zahl2)             {
28
      return (Zahl1 + Zahl2);
29
      }

In function `main':
12 incompatible type for argument 1 of `Addiere'
12 incompatible type for argument 2 of `Addiere'

Warum kann man die Funktion "Zahl" nicht so in die Funktion "Addiere" 
einsetzen?

Ich habe mal testweise

Test = Zahl(); geschrieben.

Hier erhalte ich den Fehler: too few arguments to function `Zahl'

Das Programm Zahl geht wieder (Habe die float Zahlx gelöscht und einmal 
eins IN das Programm Zahl geschrieben.

von Klaus W. (mfgkw)


Lesenswert?

Michael Dierken schrieb:
> float Zahl(float Zahlx);
> ...
> Summe = Addiere(Zahl,Zahl);

Willst du unbedingt die Funktion Zahl an Adiere übergeben?
Oder warum schreibst du das hin?

von Michael D. (etzen_michi)


Lesenswert?

Danke für die Hilfe.

Fehler war:

Addiere(Zahl(), Zahl());

Es fehlten die () nach den Zahl.


Ich möchte das sich das Unterprogramm Addiere mittels des Unterprogramms 
Zahl zwei Zahlen holt und diese dann Addiert.

von Uwe .. (uwegw)


Lesenswert?

Du solltest die Bezeichner etwas sorgfältiger wählen. Dein "Zahl()" ist 
ja keine Zahl, sondern eine Funktion, die eine Zahl einliest. Da wäre 
ein passender Name z.B. ZahlEinlesen(). Dann erkennt man beim Aufruf mit
Summe = Addiere(  ZahlEinlesen(),  ZahlEinlesen() )
sofort, dass da zweimal eine Zahl eingelesen wird. Bei Zahl() weiß man 
hingegen nicht, wo die Zahl nun herkommt...

von peterguy (Gast)


Lesenswert?

Versuchs mal so in der Art (ohne Garantie, habs nicht getestet):
1
#include <stdio.h>
2
3
4
float getZahl();
5
float Addiere(float, float);
6
7
8
9
int main()         {
10
  float Summe, Zahl1, Zahl2;
11
  
12
  Zahl1 = getZahl();
13
  Zahl2 = getZahl();
14
  Summe = Addiere(Zahl1,Zahl2);
15
  
16
  printf("\nSumme: %f", Summe);
17
  
18
  system("Pause");
19
  return 0;
20
}
21
22
float getZahl()       {
23
    float Zahlx;
24
      printf("\nBitte geben sie eine Zahl ein: ");
25
      scanf("%f", &Zahlx);
26
      return Zahlx;
27
      }
28
29
      
30
float Addiere(float Zahl1, float Zahl2)             {
31
      return (Zahl1 + Zahl2);
32
      }

von Michael D. (etzen_michi)


Lesenswert?


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.