incompatible types in assignment

musiKk

musiKk

Dr. Strangelove
Hallo, ich bins mal wieder. :/

Ich versuch mal das Umfeld um die Frage so weit zu straffen, wie es geht:

Ich habe folgende Strukturen:

Code:
struct satztyp {
	char name[20];
	char vorname[20];
	char anschrift[50];
	char telefon[20];
};

struct index {
	char name[20];
	long position;
};

Um folgende Funktion dreht es sich (erst Prototyp, dann die Funktion bei der Deklaration):

Code:
struct indexElement* add(char*, long, struct indexElement*);

struct indexElement* add(char* name, long bytePos, struct indexElement* start) {
	struct index *newIndex;
	newIndex=(struct index*) malloc (sizeof(struct index));
	[COLOR="Red"]newIndex->name=name;[/COLOR]
	newIndex->position=bytePos;

Aufgerufen wird die Funktion:

Code:
struct satztyp temp;
	struct indexElement *start=NULL;
	while(fread(&temp, sizeof(struct satztyp), 1, fp)) {
		char* name=temp.name;
		start=add(name, ftell(fp), start);

Fuer die rot markierte Zeile schreit mich der Compiler an: incompatible types in assignment.

Warum? newIndex->name ist vom Typ char*, name ist vom Typ char*. Habe schon Trial and Error like (mir rennt die Zeit davon, wuerde ich ueber alles nachdenken, was ich tu, wuerd ich gar nix mehr schaffen) alle moeglichen Kombinationen von * und & ohne Erfolg ausprobiert.

Waere sehr nett, wenn mir jemand auf die Spruenge helfen koennte. :(
 
Hallo!

Ich bin auch nicht ganz fit auf dem Gebiet der Zeiger und hab vor nicht allzulanger Zeit auch einfach alle Möglichkeiten von * und & durchprobiert. Das man damit oft nicht weiterkommt ist klar. Mir hat die Lektüre des Buches "The C Programming Language" von Kernighan und Ritchie sehr dabei geholfen nicht mehr planlos alles durchzuprobieren. Das nur am Rande.

Jetzt zu deinem Problem:
Fuer die rot markierte Zeile schreit mich der Compiler an: incompatible types in assignment.

Warum? newIndex->name ist vom Typ char*, name ist vom Typ char*.

Schauen wir uns einfach mal die zwei Zeilen in deinem Code an und ich versuche dir daran zu erklären was falsch läuft.
Code:
char* name=temp.name;
Nach dieser Zeile, weißt der Pointer name auf die Adresse des Arrays temp.name.
Code:
newIndex->name=name;
Was du hier versuchst ist: einem "statischem" char-Array (das schon eine Adresse hat da durch "char name[20]" ein Speicherbereich reserviert wurde) eine andere Adresse unterzuschieben.
Was du willst ist: das Array auf das der Pointer name zeigt in das Array newIndex->name kopieren.
Die einfachste Möglichkeit dies zu erreichen wäre eine Funktion wie strcpy oder sprintf zu verwenden. z.B.:
Code:
strcpy(newIndex->name, name);
Ich hoffe das hilft dir weiter!

Falls ich Fehler bei der Beschreibung gemacht habe korrigiert mich bitte.

Gruß,
Philip
 
Ja, vielen Dank. Heute frueh ist es mir auch aufgefallen. Da der Speicher vorher schon mit einem 20 Byte langen Array belegt ist, kann ich da nicht einfach was zuweisen. Den String zu kopieren war auch meine Idee, werde ich gleich machen.
War wohl zu unkonzentriert gestern, bald sind Pruefungen, es wird langsam stressig.

Aber vielen Dank fuer die Antwort. :)
 
Nimm strncpy! Damit kannst Du sicherstellen, dass Du nicht durch einen zu langen String anderen Speicher überschreibst.
 
strcpy sollte es in diesem Fall auch tun, da beide Zeichenketten maximal 20 Zeichen lang sein koennen (bzw 19 wegen \0).
Habe das Programm heut auch schon vorgestellt und abhaken lassen. :)
 

Ähnliche Themen

dovecot und postfix Konfiguration Problem

fußballstatistik auswerten

NagiosGrapher 1.7.1 funktioniert nicht

struct in Datei speichern

Aus Datei lesen

Zurück
Oben