Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

1

19.03.2011, 10:52

Typecast - Ich komm nicht weiter

Hallo,

ich habe in der Vorlesung eine Aufgabe bekommen, es handelt sich um Bankkonten. Es gibt mehrere Arten von Bankkonten, einmal die normalen und die gebührenpflichtigen Konten. Eine Teilaufgabe war es jetzt, dass die Funktionen deposit() und withdraw() für jeden Typ Konto verwendet werden können.

Ich habe jetzt die Funktion deposit (withdraw() ) ist verhält sich eigentlich ähnlich, deshalb poste ich nur eine Funktion:

C-/C++-Quelltext

1
2
3
4
void deposit_ChargedAccount (struct ChargedAccount* a, long amount) {
    deposit(a, amount);
    a->count++;
}


C-/C++-Quelltext

1
2
3
void deposit (struct Account* b, long amount) {
  b->balance += amount;
}


Wie man sieht, sind die Datentypen natürlich inkompatibel. Wenn ich den Funktionsaufruf jetzt umgestalte, mit einem Typecast, dann funktioniert das nicht wirklich.

C-/C++-Quelltext

1
2
3
4
void deposit_ChargedAccount (struct ChargedAccount* a, long amount) {
    deposit((struct Account *)a, amount);
    a->count++;
}


Das funktioniert allerdings nicht wirklich, der Professor meinte auch, man könne beides in void-pointer umwandeln, wäre zwar unelegant, aber es würde dann funktionieren, aber auch das funktioniert nicht so ganz.
Wenn ihr den gesamten Code benötigt, dann müsst ihr euch melden.
Ganz oben steht noch ein

C-/C++-Quelltext

1
typedef struct Account* Account;

Wenn ich im Typecast also nur (Account*) a mache, klappt es auch nicht, ich stehe da gerade auf dem Schlauch.

MfG Sascha

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

19.03.2011, 11:00

Du könntest ChargeAccount von Account erben lassen (Konten beinhalten ja die selbe zugrunde liegende Logik, mach also Sinn). Dann reicht es wenn du eine

C-/C++-Quelltext

1
2
3
void deposit (struct Account* b, long amount) {
  b->balance += amount;
}
deklarierst. Sofern balance natürlich auch eine property von beiden Accounts ist, wovon ich jetzt einfahc mal ausgehe.
Da Account die BasisKlasse ist wovon ChargeAccount erbt, akzeptiert die Methode/Funktion fortan Objekte beider Typen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

3

19.03.2011, 11:03

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
/* Konto. */
struct Account {
  long number;      /* Kontonummer. */
  String holder;    /* Kontoinhaber. */
  long balance;     /* Kontostand in Cent. */
};

/* Gebührenpflichtiges Konto */
struct ChargedAccount {
    struct Account isCharged;  /* Property-Vererbung struct Account*/
    int count;
};


Kleine Übersicht über die Konten, vielleicht noch als Zusatz: Es MUSS reines C sein, C++ ist nicht :D

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

19.03.2011, 11:04

C-/C++-Quelltext

1
struct ChargeAccount : Account { 
statt property Vererbung, direkte Vererbung.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

19.03.2011, 11:56

Vererbung geht nicht, weil es wie er geschrieben hat ja reines C sein muss.
So wie ich das sehe hat der ChargedAccount den normalen Account als Member namens isCharged von daher würd ich das einfach so machen:

C-/C++-Quelltext

1
2
3
4
void deposit_ChargedAccount (struct ChargedAccount* a, long amount) {
    deposit(a->isCharged, amount);
    a->count++;
}


Ich kenn mich mit der C-Syntax aber nicht ganz so aus...

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

6

19.03.2011, 12:13

Vererbung geht nicht, weil es wie er geschrieben hat ja reines C sein muss.
So wie ich das sehe hat der ChargedAccount den normalen Account als Member namens isCharged von daher würd ich das einfach so machen:

C-/C++-Quelltext

1
2
3
4
void deposit_ChargedAccount (struct ChargedAccount* a, long amount) {
    deposit(a->isCharged, amount);
    a->count++;
}


Ich kenn mich mit der C-Syntax aber nicht ganz so aus...

Hallo,

so bringt er mir leider genau denselben Fehler.
main.c:91: error: conflicting types for 'deposit'

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

19.03.2011, 12:45

Jo, da fehlt ja auch der Adress-Operator:

C-/C++-Quelltext

1
deposit( &(a->isCharged), amount);


Immerhin erwartet die Funktion "deposit" einen Pointer.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

19.03.2011, 12:50

isCharged ist kein guter Name..(is<irgendwas> impliziert eigentlich überall einen Rückgabetypen von bool) Ich würde das eher einfach account nennen.

Affje

Treue Seele

  • »Affje« ist der Autor dieses Themas

Beiträge: 89

Beruf: Student

  • Private Nachricht senden

9

19.03.2011, 12:58

Danke schonmal für die Antworten, aber auch mit dem Adressoperator davor klappt es leider nicht, selber Fehler.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

19.03.2011, 13:06

Wenn du nicht konkreter wirst können wir dir auch nicht weiter helfen.
Zeig mal ein vollständiges Beispiel. Ich vermute, dass du den Fehler einfach noch wo anders hast.

Werbeanzeige