Funktionen... (Fehlermeldung)
-
Bin nun beim Thema Funktionen angelangt..
Komischerweise blieb ich bereits beim 2.
Programm in diesem Themenbereich hängen, wobei
bis jetzt alle glatt verlief.
Hoffe, dass einer weiterhelfen kann:#include <iostream> #include <string> #include <math.h> using namespace std; int main(void) // Hauptprogramm { int x, y, a; cout << "\nBitte geben Sie den ersten von zwei Punkten ein: "; cin >> x; cout << "\nBitte geben Sie den zweiten Punkten ein: "; cin >> y; a=abstand(x,y); cout << "\n\nDer Abstand betraegt: " << a << endl << endl; system("pause"); return 0; } int abstand(int x_lokal, int y_lokal) { int ergebnis; if (x_lokal==y_lokal) { ergebnis=0; }; if (x_lokal > y_lokal) { ergebnis= x_lokal - y_lokal; } else { ergebnis= y_lokal - x_lokal; } return ergebnis; }Fehlermedung:
16
abstand' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) In functionint abstand(int, int)':
26 `int abstand(int, int)' used prior to declaration
-
Du brauchst da eine Vorwärtsdeklaration.
Füg einfach vor der main das hier ein:int abstand(int x_lokal, int y_lokal);EDIT:
Noch ein, zwei Tipps:
- math.h ist C, benutz cmath für den include
- void ist in Funktionsargumentlisten nicht erforderlich (kannst es also weglassen)
- Rück deinen Code einheitlicher ein. Je früher du dir das angewöhnst, desto besser
-
Wow, das war schnell.. Besten Dank, drakon.

Hatte zuvor noch nie was vor der main, aber naja..
Anscheinend geht's.
-
Du musst einfach dran denken, dass Bezeichner (Funktionen, Variablen, Typen...) zum Zeitpunkt der Verwendung bekannt, also deklariert sein müssen. Die Fehlermeldung sagt eigentlich genau aus, wo das Problem liegt.
-
Ja, stimmt. Hatte es mir eigentlich auch gedacht..
Ich hielt mich aber an das Beispiel unseres
Professors, welches irgendwie einwandfrei lief,
obwohl die Reihenfolge der Deklarationen auch
komisch war.int main(void) // Hauptprogramm { int a,b; long l; a=3; b=4; l = flaeche_berechnen(a,b); cout << "Das Ergebnis der Berechnung ist: " << l << endl << endl; system("pause"); return 0; } // Ende Hauptprogramm long flaeche_berechnen (int a_lokal,int b_lokal) { long ergebnis; ergebnis= static_cast<long>(a_lokal*b_lokal); // Berechnung der Fläche um Umwandlung des Variablentyps von int (a_lokal*b_lokal) // nach <long> // static_cast<gewünschter Typ>(umzuwandelnder Typ ) ist der Befehl für // Typumwandlungen return ergebnis; // Zurückgabe des Ergebnisses an den audrufenden Programmteil } // Ende Funktion flaeche_berechnen
-
So sollte das aber ebenfalls einen Fehler geben. Bist du sicher, dass er da keinen Header included hat?
-
Tatsächlich..
Bist echt ein Experte.. Seh's jetzt erst.
Er included
*long int flaeche_berechnen (int a_lokal, int b_lokal);
*und anschließend folgen
15 Zeilen Kommentar, wodurch ich den Header völlig
aus den Augen verlor.Damit kann ich's jetzt vollkommen nachvollziehen.
Ich wünsche dir alles Gute, drakon.
-
Mikrofon schrieb:
Damit kann ich's jetzt vollkommen nachvollziehen.
Ich wünsche dir alles Gute, drakon.Danke, gleichfalls.

-
Ich hoffe, dass Nexus dies sieht, bevor er
offline geht...Kann ich in einer Funktion ein Feld(?) übegeben lassen?
z.B. wenn in einer Funktion 6 Werte verarbeitet werden
sollen.. Kann ich da folgendes eingeben?void funktion(int x[5]);Oder umgekehrt beim Aufrufen der Funktion?:
funktion (z[5]);
-
Mikrofon schrieb:
Ich hoffe, dass Nexus dies sieht, bevor er
offline geht...Keine Angst, ich bleib schon noch kurz.

Arrays können nicht an Funktionen übergeben werden. Was man aber tun kann, ist Zeiger oder Referenzen auf sie zu übergeben.
Folgende Funktionsdeklarationen sind identisch, es wird jedes Mal ein Zeiger auf
intübergeben. Die Grösseninformation in den eckigen Klammern wird dabei ignoriert.void Function(int* Array); void Function(int Array[]); void Function(int Array[357]);Deshalb solltest du die Grösse explizit übergeben (wenn du es nicht mit Templates und Referenzen machst). Du kannst also Folgendes haben:
void Function(int* Array, unsigned int Size) { for (unsigned int i = 0; i < Size; ++i) std::cout << Array[i] << " "; } int main() { const unsigned int ArraySize = 7; // Arraygrösse als Konstante anlegen int Array[ArraySize] = {1, 4, 3, 0, 8, 5, 6}; Function(Array, ArraySize); }Du siehst also, man braucht beim Aufruf nur
Arrayzu schreiben. Man übergibt aber wie gesagt nicht das Array selber. Wenn manArrayschreibt, wird das Array implizit in einen Zeiger auf das erste Element konvertiert. Was man übergibt, ist also dieser Zeiger.Aber statt Arrays kann man auch STL-Container nutzen, dann ist z.B. auch die Grössenübergabe überflüssig. Zudem wird einem da die Speicherverwaltung abgenommen und man kann dynamische Arrays verwalten (zur Laufzeit Elemente anhängen, etc.).
-
Auf dich kann man zählen..

Hattest wie immer recht! Läuft jetzt..
-
Nun übertreibs nicht. So unfehlbar bin ich bei weitem nicht...

Aber gut, dass es dir geholfen hat.

-
Also vorhin konnte ich immer zwischendurch
prüfen etc. und es lief auch... nur jetzt
gibt's zwar beim Kompilieren keine Meldung,
dafür gibt es einen Absturz des "Dos-Fensters"
nach der ersten Eingabe..
Sowas ist das erste mal (nach ca. 100 kleineren
Progs).
Hab die letzten Änderungen, die ich vornahm rück-
gängig gemacht, jedoch ohne Erfolg. Das Ding läuft
nicht mehr..PS: Die Funktion 'gross' ist noch nicht fertig.
//Titel #include <iostream> using namespace std; void gross(int* Array, int size, int &superb); int main(void) { int i, big, max; int* feld; big=6; for (i=1; i<=6; i++) { cout << "\nBitte " << i <<". Zahl von 6 eingeben: "; cin >> feld[i-1]; } gross(feld, big, max); cout << endl << "Die groesste Zahl, die eingegeben wurde lautet: " << max << "\n\n\n"; system("Pause"); return 0 ; } // Hauptprogramm void gross(int* Array, int size, int &superb) { int j, hilf; hilf=0; for(j=6; j>=1 ;j--) { cout << "\n" << Array[size-j]; //Kontrolle via Ausgabe } superb=hilf; }
-
Hallo, mit
int* feld;legst du nur einen Zeiger auf
intan, kein Array. Der Zeiger ist zudem noch uninitialisiert, zeigt also irgendwo hin. Um dafür Platz zu reservieren, könntest du beispielsweisenewbenutzen.Aber in deinem Falle geht es eher um Arrays. Leg also ein solches an, das genügend gross ist, sodass alle Elemente Platz haben.
int feld[6];
-

Vielen Dank nochmals!
Ich hoffe, dass meine Klausur gut verläuft..Dann lade ich dich und drakon zum Essen ein..
Hoffe, ihr wohnt in der Nähe, sodass ich ein
gutes Restaurant kenne, welches nicht allzu
weit weg von euch ist.
-
Hmm, das könnte schwierig werden, drakon und ich wohnen beide in der Schweiz.

Aber mir reicht es, dass ich dir helfen konnte. Es gibt übrigens sehr wenige Leute, die so viel Dankbarkeit zeigen wie du. Das schätze ich sehr, oft hört man gar nichts oder teilweise sogar blöde Kommentare.
Viel Glück bei deiner Klausur.

-
Nexus schrieb:
Viel Glück bei deiner Klausur.

Merci.. Dir auch 'viel Glück' bei allem, was
du dir vornimmst. Möge Gott dir helfen.Okay, mit der Schweiz hatte ich nicht gerechnet.
Dann muss ich mir was anderes überlegen
Zeit hab ich ja noch.. Zur Klausur sind's noch 2 Wochen.Zurück zu C++.. Wenn ich bis dahin Probleme hab',
melde ich mich... falls du gestattest.Schönen Abend noch bzw. Gute Nacht!
-
Mikrofon schrieb:
Merci.. Dir auch 'viel Glück' bei allem, was
du dir vornimmst. Möge Gott dir helfen.Vielen Dank.

Mikrofon schrieb:
Zurück zu C++.. Wenn ich bis dahin Probleme hab',
melde ich mich... falls du gestattest.Sicher, ja. Ich bin relativ oft hier im Forum, und es gibt ja auch sonst sehr viele Leute, die dir bei Problemen helfen können.

Ich wünsche dir auch eine gute Nacht, machs gut.
-
Nabend allerseits...
Kriege in den Array keine Werte
eingelesen...//Titel #include <iostream> using namespace std; void einlesen(int* feld, int poly); int main() { int p; cout << "\nGrad des Polynoms eingeben: "; cin >> p; cout << "\n\n"; int Array[p]; einlesen(Array,p); system("Pause"); return 0; } void einlesen(int* &feld, int poly) { int i; for (i=1; i<=poly; i++) { cout << "Bitte " << i << ". Wert von " << poly << "eingeben :"; cin >> feld[i-1]; } }Es wird nicht kompiliert.
Ein Fehler in einer bestimmten Zeile
des Quellcodes liegt nicht vor.
Die Fehlermeldung lautet:[Linker error] undefined reference to `einlesen(int*, int)'
ld returned 1 exit statusWenn ich unten das &-Zeichen vor 'feld' entferne, klappt's.
Ich möchte aber, dass die eingegeben Werte an's Haupt-
programm zurückgeliefert werden..PS:
Wenn ich in die Zeile 5 statt feld
-> &feld
eingebe (und unten das & unten auch stehen lasse,
gibt es eine andere Fehlermeldung (Zeile 15):15 invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'
-
Du brauchst das & bei der Funktionsdefinition nicht, die Werte werden auch so zurückgeliefert. Das & nach dem zeiger brauchst du nur, wenn du den Zeiger selbst in der Funktion verändern willst.
Ansonsten: Die Funktionsdefinition muss immer mit der deklaration übereinstimmen, sonst bekommst du eben Linkerfehler.