Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 5%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 392 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

jazzdee

Lebende Foren Legende

Dabei seit: 12.11.2002

Beiträge: 1 886

 

1 Zum Seitenanfang

Samstag, 11. März 2006, 14:39

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.

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;
}
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

2 Zum Seitenanfang

Samstag, 11. März 2006, 14:53

Übergeb einen Zeiger auf die Struktur und greife darüber auf die Struktur zu^^

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (11. März 2006, 15:01)

 

jazzdee

Lebende Foren Legende

Dabei seit: 12.11.2002

Beiträge: 1 886

 

3 Zum Seitenanfang

Samstag, 11. März 2006, 15:04

also der prototyp ist nicht richtig

du hast das hier gesagt.

Quellcode

1
int calc_bonus(Kunde *pKunde); //Funktionsdeklaration


im prototyp darf aber eigentlich nur der datentyp stehen.
wird jedenfalls so nicht kompiliert...
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

4 Zum Seitenanfang

Samstag, 11. März 2006, 15:26

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

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

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »silence« (11. März 2006, 15:32)

 

jazzdee

Lebende Foren Legende

Dabei seit: 12.11.2002

Beiträge: 1 886

 

5 Zum Seitenanfang

Samstag, 11. März 2006, 16:22

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:

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)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

6 Zum Seitenanfang

Samstag, 11. März 2006, 21:12

Ja, ich hab mir den Prototyp gespart, er würde so aussehen:

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

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »silence« (11. März 2006, 21:20)

 

jazzdee

Lebende Foren Legende

Dabei seit: 12.11.2002

Beiträge: 1 886

 

7 Zum Seitenanfang

Samstag, 11. März 2006, 21:34

ah ok, danke!

sag mal: kannst du mir vielleicht ein buch empfehlen? bzw. wie hast du c++ gelernt?
 

Jimmy1212

Jungspund

Dabei seit: 09.03.2006

Beiträge: 18

 

8 Zum Seitenanfang

Samstag, 11. März 2006, 21:49

Da kann ich ein gutes empfehlen, behandelt auch nochmal die Grundlagen..undzwar:

"jetzt lerne ich C++" , Markt+Technik Verlag

ISBN: 3-8272-6722-6


Einfach mal den KLappentext und Rezesionen online lesen...
 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

9 Zum Seitenanfang

Samstag, 11. März 2006, 22:14

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 :evil:
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog