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

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

19.07.2015, 19:20

C binary Tree. Pointer Problem

Wir haben eine alte Aufgabe zum Üben bekommen. Hier mal ein Teil der Aufgabe(Texte gekürzt!):

Zitat


Binärbaum mit int Werten soll erstellt werden.
gegeben:
#include <stdio.h>
#include <stdlib.h>
#define nil ((void*)0)
1.Definieren sie die beiden Datentypen für den Binärbaum. Zeigertyp für die Knotenverweise soll baum heissen.
2.Definieren sie Konstruktorfunktion mkKnoten, die einen Baumknoten erzeugt und Datenkomponente initialisiert.
gegeben: baum mkKnoten(int wert, baum links, baum rechts);

Ausserdem ist die main gegeben:

C-/C++-Quelltext

1
2
3
4
5
6
int main()
{
baum test;
test = mkKnoten(1,nil,nil); (hier gekürzt)
[...]
}


Nun habe ich 1 und 2 so gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct ba
{
    struct ba *links, *rechts;
    int wert;
}_baum,*baum;

baum mkKnoten(int wert, baum links, baum rechts)
{
    baum b = (baum)malloc(sizeof(baum));
    b->links = links;
    b->rechts = rechts;
    b->wert = wert;
    return b;
}

Aber ich kann es nicht compilieren, da die nil in der main nicht gehen, wegen: "'baum mkKnoten(int,baum,baum)' : Konvertierung von Argument 2 von 'void *' in 'baum' nicht möglich" Ich habe aber keine Ahnung, wie ich das sonst machen soll. Ja, probiert habe ich schon einige Zeit und auch schon die Fragestellung abgesurft ;)

Ich hoffe mir kann hier jemand weiterhelfen :)

2

19.07.2015, 19:41

Wenn ich das Richtig überlicke, dürfte es daran liege das du keinen Pointer nutz.

Du kannst halt für 'baum' keine nullptr übergebn für 'baum*' schon.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

19.07.2015, 19:47

Der Aufruf in der main und die Signatur für mkKnoten sind aber vorgegeben. Was genau muss ich also ändern?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

19.07.2015, 19:50

Du versuchst vermutlich deinen C Code mit einem C++ Compiler zu bauen. Konvertierungen von void* sind in C vollkommen ok, in C++ aber nur explizit erlaubt. In C ist es sogar verpöhnt die Rückgabe von malloc explizit zu casten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tobiking« (19.07.2015, 20:09)


ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

5

19.07.2015, 22:02

Perfekt, Tobiking hat Recht :)
MinGW runtergeladen und mit C compiler compiliert und es klappt ohne Probleme, der Visual Studio Compiler war Schuld ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

20.07.2015, 01:16

Der "Visual Studio Compiler" ist natürlich auch ein C Compiler, du hast ihm wohl selbst gesagt, dass er deinen Code als C++ Code kompilieren soll, vermutlich, indem du den Code in eine .cpp statt in eine .c Datei gepackt hast... ;)

Btw: Gibt es einen bestimmten Grund, wieso es unbedingt C sein muss?

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

7

20.07.2015, 01:21

Das kann ehrlich gesagt auch gut möglich sein ;)

Naja, weil unser Professor das unbedigt so will. Genauso wie er deutsche Begriffe liebt, ich sag ja nur "Laufzeitkeller", "entkellern","kellern"... :dash:

8

20.07.2015, 06:35

Laufzeitkeller? Das Wort ergibt ja nicht einmal Sinn.

Ein typedef x* y ist auch irgendwie verwirrend, weil man das typedef kennen muss, um zu sehen, dass y ein Pointer ist. Wenn sich jemand den Code anguckt und das übersieht, wird er verwirrt sein.

Dein malloc ist (vermutlich aus dem Grund) falsch. sizeof(baum) ist nicht die Größe des Baums, sondern die Größe des Zeigers auf den Baum. Du musst sizeof(_baum) dort hinschreiben.

Ich würde das dem Professor sagen. Er wird das schon verstehen, wenn du ihm sagst, dass man typedef so nicht verwenden sollte, da baum ja kein Baum ist. baum ist nur ein Zeiger auf einen Baum. Niemand würde auf die Idee kommen, dass ich ein Eiffelturm bin, wenn ich auf den Eiffelturm in Paris zeige.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Magogan« (20.07.2015, 06:44)


DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

20.07.2015, 09:15

Niemand würde auf die Idee kommen, dass ich ein Eiffelturm bin, wenn ich auf den Eiffelturm in Paris zeige.

:D Super Vergleich.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

10

20.07.2015, 09:15

Sorry, da hast du natürlich Recht. In der aktuellen Version steht natürlich nicht mehr Baum im malloc. Das war nurnoch ein Überbleibsel meiner verzweifelten Versuche. Schlussendlich lag es wie erwähnt am C++ Compiler.

Laufzeitkeller ist halt eine Ableitung von diesem KellerSpeicher, er mag halt deutsche Worte ;)

Bei dem typedef gebe ich dir absolut recht, wobei hier natürlich eine Änderung zu pBaum o.Ä. schon helfen würde. Aber durch den vorgegeben Aufruf von mkKnoten(und einer anderen Funktion, in der test auch als Zeiger verwendet wird), bin ich natürlich dazu gezwungen das so zu lösen. In Übungen usw könnte man ja rebellieren, aber in der kommenden Klausur werde ich mich mal allem fügen ;)

Werbeanzeige