C++ Struktur an Funktion übergeben!
Hallo, ich musste ein kleines C++ Programm schreiben. Da hatte ich auch noch kein Problem. Sinn war es, die Strukturen kennenzulernen. Nun soll aber das Programm (welches ich gleich unten poste) so geändert werden, dass die Funktion, die den Bonus berechnet keine einzelnen Werte übergeben bekommt, sondern die gesamte Struktur.
habe schon versucht in Zeile 7 folgendes zu machen:
int calc_bonus(struct);
damit kommt er aber nicht klar
Im Gründe müsste ich nur wissen, was ich oben im Prototypen angeben muss, damit ich die Struktur übergeben kann.
habe schon versucht in Zeile 7 folgendes zu machen:
int calc_bonus(struct);
damit kommt er aber nicht klar

Im Gründe müsste ich nur wissen, was ich oben im Prototypen angeben muss, damit ich die Struktur übergeben kann.
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <string.h>
#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#include <ctype.h>
int calc_bonus(double, int);
int main()
{
char kunde_name[20], kunde_ort[20];
double kunde_umsatz=0, kunde_bonus=2;
struct Kunde
{
int lieferantennummer;
char name[20];
char ort[20];
double umsatz;
int bonussatz;
int bonus;
};
struct Kunde K1;
// ---------------------------------- //
cout << "Geben Sie Ihren Namen ein: ";
cin >> kunde_name;
cout << "Geben Sie Ihren Wohnort ein: ";
cin >> kunde_ort;
cout << "Geben Sie Ihren Umsatz ein: ";
cin >> kunde_umsatz;
// ---------------------------------- //
strcpy(K1.name, kunde_name);
strcpy(K1.ort, kunde_ort);
// ---------------------------------- //
K1.lieferantennummer = 1;
K1.umsatz = kunde_umsatz;
K1.bonussatz = kunde_bonus;
K1.bonus = calc_bonus(K1.umsatz, K1.bonussatz);
// ---------------------------------- //
cout.setf(ios::fixed);
cout << setprecision(2);
clrscr();
// ---------------------------------- //
cout << "------------------------------" << endl;
cout << "Erfassung von Lieferantendaten" << endl;
cout << "------------------------------" << endl;
cout << "Nr.:\t" << K1.lieferantennummer << endl;
cout << "Name:\t" << K1.name << endl;
cout << "Ort:\t" << K1.ort << endl;
cout << "Umsatz:\t" << K1.umsatz << endl;
cout << "Bonus:\t" << K1.bonus << endl;
getch();
return 0;
}
int calc_bonus(double umsatz, int bonussatz)
{
int bonus;
bonus = ((umsatz * bonussatz) / 100);
return bonus;
}
|
Übergeb einen Zeiger auf die Struktur und greife darüber auf die Struktur zu
z.B.
Edit: Vielleicht etwas abstrakt, ich beziehe es einmal auf dein Beispiel:
Sollte eigentlich so gehen, ich schau mal nachher ob sich das überhaupt übersetzten lässt XD

z.B.
|
|
Quellcode |
1 2 3 4 |
void MyFunction(structname *pStruct)
{
pStruct->Variable;
}
|
Edit: Vielleicht etwas abstrakt, ich beziehe es einmal auf dein Beispiel:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 |
int calc_bonus(Kunde *pKunde); //Funktionsdeklaration
Kunde myKunde; //Instanz von Kunde erstellen
calc_bonus(&myKunde); //Funktionsaufruf, Referenz auf myKunde
int calc_bonus(Kunde *pKunde)
{
std::cout << pKunde->lieferantennummer << std::endl;
//Code bla bla
}
|
Sollte eigentlich so gehen, ich schau mal nachher ob sich das überhaupt übersetzten lässt XD
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (11. März 2006, 15:01)
Ich hab das schon richtig gesagt, du hast nur deine Struct NACH der Funktion deklariert, deshalb kennt die Funktion deine Struktur beim kompilieren nicht ;_;
Ich hab dir mal ein Beispiel geschrieben o_O
btw,
Das tut er auch:
int Funktion(Kunde *pKunde); ist nicht anderes als
int Funktion(int einWert); ist nichts anderes als
[typ] Funktion([typ] [Name]);
stell dir einfach vor, "K1" ist eine Variable vom Typ "Kunde", genauso, wie "lieferantennummer" eine Variable vom Typ int ist.
Struct gehören zu den zusammengesetzten Datentypen
Ich hab dir mal ein Beispiel geschrieben o_O
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <iostream>
#include <conio.h>
struct Kunde
{
int lieferantennummer;
char name[20];
char ort[20];
double umsatz;
int bonussatz;
int bonus;
};
//Zwei möglichkeiten eine Struktur zu übergebeb,
// 1. Per Referenz / Zeiger
void myFunction(Kunde *pKunde)
{
std::cout << pKunde->name << std::endl;
}
// 2. Als Kopie
void myFunctionOhneZeiger(Kunde kKunde)
{
std::cout << kKunde.name << std::endl;
}
int main(int argc, char *argv[], char *env[])
{
//Zwei Möglichkeiten eine Struct Instanz zu erstellen:
Kunde K1;
strcpy(K1.name, "Kunde 1");
Kunde *K2 = new Kunde;
strcpy(K2->name, "Kunde 2");
//ein "&" muss vor K1 stehen, da wir den Zeiger auf das Objekt, und nicht das
//Objekt selbst brauchen
myFunction(&K1);
//Hier muss kein "&" stehen, da K2 bereits ein Zeiger auf Kunde ist!
myFunction(K2);
//Ok, wers braucht: Möglichkeit Nr3 (nicht nach dem Sinn fragen)
//Wir dereferenzieren K2, um ihm hinterher zu referenzieren
myFunction(&(*K2));
//Und nun das ganze mit unser Zweiten Funktion, ohne Zeiger!
myFunctionOhneZeiger(K1);
//Und falls wir einen Pointer haben (K2):
myFunctionOhneZeiger(*K2);
return 0;
}
|
btw,
Zitat
im prototyp darf aber eigentlich nur der datentyp stehen.
Das tut er auch:
int Funktion(Kunde *pKunde); ist nicht anderes als
int Funktion(int einWert); ist nichts anderes als
[typ] Funktion([typ] [Name]);
stell dir einfach vor, "K1" ist eine Variable vom Typ "Kunde", genauso, wie "lieferantennummer" eine Variable vom Typ int ist.
Struct gehören zu den zusammengesetzten Datentypen
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (11. März 2006, 15:32)
vielen dank für deine hilfe, jetzt klappt es.
allerdings hast du in deinem beispiel KEINEN prototyp benutzt?!
du hast einfach die Funktion vor die main-funktion gesetzt.
wie würde es denn aussehen wenn du einen prototypen nutzt? du sagst, dass folgendes im prototyp stehen muss:
in der schule habe ich gelernt, dass ein prototyp so aussieht:
und die funktion wird dann später so aufgebaut:
allerdings hast du in deinem beispiel KEINEN prototyp benutzt?!
du hast einfach die Funktion vor die main-funktion gesetzt.
wie würde es denn aussehen wenn du einen prototypen nutzt? du sagst, dass folgendes im prototyp stehen muss:
Zitat
[typ] Funktion([typ] [Name]);
in der schule habe ich gelernt, dass ein prototyp so aussieht:
Zitat
[typ] Funktion([typ]);
und die funktion wird dann später so aufgebaut:
Zitat
[typ] Funktion([typ] [Name])
{
//bla bla bla
}
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »jazzdee« (11. März 2006, 16:22)
Ja, ich hab mir den Prototyp gespart, er würde so aussehen:
und
Natürlich ist es wie du sagtest, [typ] Funktion([typ]), aber man kann auch beim Prototypen den Namen der Variable schreiben, als z.B. void Funktion(int Variable).
Da ist man in C/C++ frei
Die meisten Leute, die ich kenne schreiben aber die Variablennamen auch beim prototypen hin, hilft bei der Leserlichkeit meiner Meinung nach
Mal ein Beispiel:
und
Welcher Code ist schneller/leichter verständlich?
|
|
Quellcode |
1 |
void myFunction(Kunde *pKunde); |
und
|
|
Quellcode |
1 |
void myFunctionOhneZeiger(Kunde kKunde); |
Natürlich ist es wie du sagtest, [typ] Funktion([typ]), aber man kann auch beim Prototypen den Namen der Variable schreiben, als z.B. void Funktion(int Variable).
Da ist man in C/C++ frei

Die meisten Leute, die ich kenne schreiben aber die Variablennamen auch beim prototypen hin, hilft bei der Leserlichkeit meiner Meinung nach

Mal ein Beispiel:
|
|
Quellcode |
1 2 |
int BerechneViereck(int, int); int Bruch(int, int); |
und
|
|
Quellcode |
1 2 |
int BerechneViereck(int SeiteA, int SeiteB); int Bruch(int Zaehler, int Nenner); |
Welcher Code ist schneller/leichter verständlich?
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »silence« (11. März 2006, 21:20)
Markt und Technik Bücher sind immer gut 
Ich hab eigentlich kein "C++ Buch" zu hause, vielmehr Bücher zu allen möglichen Teilbereichen, STL, DirectX, Unix Entwicklung, Windows etc.
Das einzige gesamtwerk ist wohl die C++ Bibel schlichtweg, "The C++ Programming Language" von Bjarne Stroustrup (Erfinder von C++
)
Ansonsten hatte ich ein gutes Script von meinem Lehrer, sollte mal ein Buch werden, ist aber nie erschienen

Ich hab eigentlich kein "C++ Buch" zu hause, vielmehr Bücher zu allen möglichen Teilbereichen, STL, DirectX, Unix Entwicklung, Windows etc.
Das einzige gesamtwerk ist wohl die C++ Bibel schlichtweg, "The C++ Programming Language" von Bjarne Stroustrup (Erfinder von C++
)Ansonsten hatte ich ein gutes Script von meinem Lehrer, sollte mal ein Buch werden, ist aber nie erschienen
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
Blog


