Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » warning

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.10.2003, 18:23 Uhr
Pablo
Supertux
(Operator)


Ich hab folgendes:

C++:
typedef struct {
  double value;
  char name[255];
  struct MAP* next;
} MAP;



Ich versuche eine arte map der STL in C zu machen. Ja, ich weiß ich weiß, bestimmt kommen Kommentare wie "mach es lieber in C++, usw... das ist schmutzig....:"
Ich mache mit Absicht unter C, nur so zum Spaß, und ich mag diese schmutzige Sachen

Nun, ich habe folgendes:

C++:
void addElement(MAP** map, double val, const char* name){
  MAP* temp = (MAP*) malloc(sizeof(MAP));
  MAP* p=*map;

....

  while(p->next!=NULL) p=(MAP*)p->next;
  p->next=temp; // hier krieg ich ein Warning

}



Wieso kriege ich folgende Meldung?

Code:
map2.c:27: warning: assignment from incompatible pointer type


Ich hab alles möglich gemacht, alle möglich castings gemacht, die ich kenne, nix bringt diese Warnung weg, wieso krieg ich sie denn überhaupt? Wenn ich zum Beispiel

C++:
p=p->next; // nochmal die selbe Meldung
...
p=(MAP*)p->next; // keine Meldung mehr



Wieso krieg ich immer eine Warnung Meldung? Sind denn next und p nicht Variablen vom selben Typ?

Es ist ja nicht schlimm, das Programm funktioniert sowieso, aber ich mag nicht, wenn ich Warnungen beim Compilieren kriege.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.10.2003, 19:30 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Ich hab folgendes:

C++:
typedef struct {
  double value;
  char name[255];
  struct MAP* next; // gibts doch garnicht!
} MAP;




Siehe kommentar: Der type MAP ist ein typedef für eine namenslose struct. Folglich gibt es struct MAP nicht. Ich weiß ja nicht, welchen Compiler Du benutzt, aber ich würde meinen popo daruf verwetten, daß mein Compiler eine Fehlerledung machen würde, genau bei der Zeile ich ich oben angebe.

So gehts dann vielleicht wieder:

C++:
typedef struct MAP_s {
  double value;
  char name[255];
  struct MAP_s* next; // gibts doch garnicht!
} MAP;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.10.2003, 19:37 Uhr
Pablo
Supertux
(Operator)


Ich benutze gcc 2.95.3

Ach so, ich werde es testen, wieso "gibts doch garnicht"?, weil es zu krank ist?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.10.2003, 19:43 Uhr
Pablo
Supertux
(Operator)


Ja, so hat es funktioniert, ich kriege keine Warnungen mehr. Ich habe wirklich nicht daran gedacht, weil ich in anderen C Bücher auch etwas ähnliches gemavht haben und hab so übernommen.

Sollte aber der Compiler nicht eine Fehlermeldung oder Warnung spucken, wenn man eine namenslose Struct macht?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2003, 21:10 Uhr
Hans
Library Walker
(Operator)



Code:
struct [i]struct-type-name[/i]
{
  type-member-name;
  type-member-name;
  ...
} Strukturvariablen;
,

mit typedef hatte ich bisher auch so meine schwierigkeiten, aber ich glaube Dein Problem hängt mit der structdefinition zusammen. Allgemein sieht die so aus|CODE||Du hast in Deinem Code oben aber den struct-type-name weggelassen, stattdessen aber unten Variablen definiert. Damit konntest Du zwar arbeiten, aber weil Du der Struktur keinen TypenNamen gegeben hast, hat der Compiler gemeckert. Denn den Typenname braucht er bei typedef, damit er weis, auf welchen Typ sich die Neudefinition bezieht.
Wie z.B. bei
C++:
typedef Uint unsigned int;
Da gibst Du ja auch den Typennamen, hier unsigned int an, den Du Dir zu Uint erklärst.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 21.10.2003 um 21:20 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.10.2003, 21:20 Uhr
Pablo
Supertux
(Operator)


Danke für die Antwort, ich habe schon verstanden, was das ganze verursacht hat
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.10.2003, 21:55 Uhr
virtual
Sexiest Bit alive
(Operator)


@Hans
Andersrum:

C++:
typedef unsigned int uint;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.10.2003, 22:44 Uhr
0xdeadbeef
Gott
(Operator)


Abgesehen davon werden maps der Geschwindigkeit halber normalerweise als Bäume (das verbreitetste sind, glaub ich, Red-Black-Bäume) implementiert, nicht als Liste. Dazu kommt, dass du dich auf zwei Datentypen festlegst. Um das ganze wirklich in C durchzuziehen, musst du ein paar ziemlich fiese Präprozessor-Moves ziehen. Sowas in der Art:

C++:
#define DECLARE_MAP(__MAP_KEY, __MAP_VALUE) \
typedef struct __MAP_##__MAP_KEY##_##__MAP_VALUE { \
  __MAP_##__MAP_KEY##_##__MAP_VALUE *left; \
  __MAP_##__MAP_KEY##_##__MAP_VALUE *right; \
  /* ein bisschen mehr RB-tree-spezifisches Zeug */ \
  __MAP_KEY key; \
  __MAP_VALUE val; \
  int * (*compare) (__MAP_KEY, __MAP_KEY); \
} MAP_##MAP_KEY##_##__MAP_VALUE


Und dann nachher im Code:

C++:
typedef char[256] string;
DECLARE_MAP(double, string);

/* ... */

MAP_double_string my_map;


Das ist jetzt nur so dahingekladdet, von daher wird es so wahrscheinlich ein paar Syntaxfehler haben, aber das Prinzip sollte klar werden, denke ich.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.10.2003 um 22:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: