Linker Operand soll L-Wert sein/Strukturen

Ja, du musst p mit gültigem Speicher initialisieren. Ich sehe aber gerade nicht, warum p ein Zeiger sein muss, du kannst ja auch einfach ein Objekt von personendaten sein lassen.
 
Hier der code nochmal:
C++:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAXSTRING 100

struct adresse
{
  char  vorname[MAXSTRING];
  char  nachname[MAXSTRING];
  char  strasse [MAXSTRING];
  char  ort[MAXSTRING];
  char  PLZ[MAXSTRING];
};

struct personendaten_struct
{
  struct adresse *adresse;
  char  schuhgroesse[MAXSTRING];
  char  groesse[MAXSTRING];
};

typedef struct personendaten_struct personendaten;

void search_print_Person(FILE* text);

void search_print_Person(FILE* text)
{
  int x=0;
  int i=0;
  char temp='x';
  personendaten *p;

  while(!feof(text))
  {	
	fgets(p->adresse->vorname, sizeof(p->adresse->vorname), text); // hier zeige ich auf die struktu?
	fgets(p->adresse->nachname, sizeof(p->adresse->nachname), text);
	fgets(p->adresse->strasse, sizeof(p->adresse->strasse), text);
	fgets(p->adresse->ort, sizeof(p->adresse->ort), text);
	fgets(p->adresse->PLZ, sizeof(p->adresse->PLZ), text);
	fgets(p->schuhgroesse, sizeof(p->schuhgroesse), text);
	fgets(p->groesse, sizeof(p->groesse), text);
  
    fscanf(text,"%c",&temp);
    i=atoi(p->schuhgroesse);

	if(i < 38)
	{
	  printf("%s",p->adresse->vorname);
	  printf("%s",p->adresse->nachname);
	  printf("%s",p->adresse->strasse);
	  printf("%s",p->adresse->ort);
	  printf("%s",p->adresse->PLZ);
	  printf("Schuhgroesse:%s",p->schuhgroesse);
	  printf("Groesse:%s",p->groesse);
	  printf("\n");
	}
  }
}

int main()
{
  FILE*text = NULL;

  text=fopen("adressen.txt","r");
  if(text == NULL)
  {
    printf("Fehler beim LESEN der text adressen.txt");
	exit(-1);
  }

  search_print_Person(text);
  fclose(text);

  return(0);
}
 
Der Code ist mir durchaus bekannt, jetzt musst du mir sagen wo es zwingend nötig ist, dass es sich bei p um einen Zeiger handelt auf ein personendaten-Objekt und nicht um ein personendaten-Objekt selber.
 
p->adresse Zeile 37

p zeigt auf adresse?^^

Wenn ich den * weglasse, dann muss ich statt -> einen . machen. Ich will aber -> machen.
 
p ist ein Zeiger. Der zeigt erst mal irgendwo hin im Speicher. Bei dir ist er noch nicht mal initialisiert und es wurde auch kein Speicher alloziert. Das heißt der Zeiger ist eigentlich erstmal ungültig, an den Speicher etwas hin zu schreiben, wo der Zeiger hinzeigt, ist gefährlich.

Du müsstest erstmal Speicher vom OS anfordern, in die Anfangsdresse des Speichers dem Zeiger übergeben. Da du eine Struktur ablegen willst, ist es sinnvoll, soviel Speicher anzufordern, wie die Struktur benötigt. Das macht man so:

C:
// Expliziter Pointer-Cast weil malloc() einen void* zurück gibt
personendaten p = (personendaten*)malloc( sizeof( personendaten ) );

Damit hast du Speicher alloziert, den du nach der Benutzung wieder ans OS zurückgeben musst:

C:
free( p );

Sonst hast du ein Speicherleck (Memory-Leak) programmiert.

Einfach einen Zeiger zu deklarieren und dann wild Daten reinschreiben bringt dein Programm oder sogar andere Prozesse zum Abstürzen.

Die Frage ist aber: Warum willst du dort unbedingt mit einem Zeiger arbeiten?
 
C++:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAXSTRING 100

struct adresse
{
  char  vorname[MAXSTRING];
  char  nachname[MAXSTRING];
  char  strasse [MAXSTRING];
  char  ort[MAXSTRING];
  char  PLZ[MAXSTRING];
};

struct personendaten_struct
{
  struct adresse *adresse;
  char  schuhgroesse[MAXSTRING];
  char  groesse[MAXSTRING];
};

typedef struct personendaten_struct personendaten;

void search_print_Person(FILE* text);

void search_print_Person(FILE* text)
{
  int x=0;
  int i=0;
  char temp='x';
  personendaten *p;

  personendaten p = (personendaten*)malloc( sizeof( personendaten ) );

  while(!feof(text))
  {	
	fgets(p->adresse->vorname, sizeof(p->adresse->vorname), text);
	fgets(p->adresse->nachname, sizeof(p->adresse->nachname), text);
	fgets(p->adresse->strasse, sizeof(p->adresse->strasse), text);
	fgets(p->adresse->ort, sizeof(p->adresse->ort), text);
	fgets(p->adresse->PLZ, sizeof(p->adresse->PLZ), text);
	fgets(p->schuhgroesse, sizeof(p->schuhgroesse), text);
	fgets(p->groesse, sizeof(p->groesse), text);
  
    fscanf(text,"%c",&temp);
    i=atoi(p->schuhgroesse);

	if(i < 38)
	{
	  printf("%s",p->adresse->vorname);
	  printf("%s",p->adresse->nachname);
	  printf("%s",p->adresse->strasse);
	  printf("%s",p->adresse->ort);
	  printf("%s",p->adresse->PLZ);
	  printf("Schuhgroesse:%s",p->schuhgroesse);
	  printf("Groesse:%s",p->groesse);
	  printf("\n");
	}
  }

  free( p );
}

int main()
{
  FILE*text = NULL;

  text=fopen("adressen.txt","r");
  if(text == NULL)
  {
    printf("Fehler beim LESEN der text adressen.txt");
	exit(-1);
  }

  search_print_Person(text);
  fclose(text);

  return(0);
}

Muss ich das so machen, weil in der Fehlerliste steht dann das sich p(zeile 35) von *p(zeiler 33 )unterscheidet.

Zu deiner Frage: Einfach so als Übung.
 
Zuletzt bearbeitet:
Ich hab aber noch ein anderes Problem... nun habe ich es ohne pointer wieder gemacht, weil für mich leicht ist.

Mit header-file und so:

h-file:
C++:
#ifndef _struct4_h_
#define _struct4_h_ 1

#define MAXSTRING 100

struct adresse
{
  char  vorname[MAXSTRING];
  char  nachname[MAXSTRING];
  char  strasse [MAXSTRING];
  char  ort[MAXSTRING];
  char  PLZ[MAXSTRING];
};

struct personendaten_struct
{
  struct adresse adresse;
  char  schuhgroesse[MAXSTRING];
  char  groesse[MAXSTRING];
};

typedef struct personendaten_struct personendaten;

void search_print_Person(FILE* text);//Fehler	3	error C2143: Syntaxfehler: Es fehlt '{' vor '*' / Fehler	2	error C2143: Syntaxfehler: Es fehlt ')' vor '*' / Fehler	4	error C2059: Syntaxfehler: ')'



#endif

1. c-file:

C++:
#include "strukturen_a4.h"
#include <stdio.h>


void search_print_Person(FILE* text)
{
  int x=0;
  int i=0;
  char temp='x';
  personendaten p;

  while(!feof(text))
  {	
	fgets(p.adresse.vorname, sizeof(p.adresse.vorname), text);
	fgets(p.adresse.nachname, sizeof(p.adresse.nachname), text);
	fgets(p.adresse.strasse, sizeof(p.adresse.strasse), text);
	fgets(p.adresse.ort, sizeof(p.adresse.ort), text);
	fgets(p.adresse.PLZ, sizeof(p.adresse.PLZ), text);
	fgets(p.schuhgroesse, sizeof(p.schuhgroesse), text);
	fgets(p.groesse, sizeof(p.groesse), text);
  
    fscanf(text,"%c",&temp);
    i=atoi(p.schuhgroesse);

	if(i < 38)
	{
	  printf("%s",p.adresse.vorname);
	  printf("%s",p.adresse.nachname);
	  printf("%s",p.adresse.strasse);
	  printf("%s",p.adresse.ort);
	  printf("%s",p.adresse.PLZ);
	  printf("Schuhgroesse:%s",p.schuhgroesse);
	  printf("Groesse:%s",p.groesse);
	  printf("\n");
	}
  }
}

2. C-file
C++:
#include "strukturen_a4.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>



int main()
{
  FILE*text = NULL;

  text=fopen("adressen.txt","r");
  if(text == NULL)
  {
    printf("Fehler beim LESEN der text adressen.txt");
	exit(-1);
  }

  search_print_Person(text);

  fclose(text);

  return(0);
}

Den Fehler hab ich kommentiert im Header-File. Ich hab lange gesucht, aber nichts gefunden was es da haben könnte.
 
Das ist durchaus so, du hast jetzt nämlich beide Varianten gemischt. Du hast mit malloc Speicher zum draufzeigen alloziert und, p dann aber jetzt nicht mehr als Zeiger verwendet. Für eines von beidem solltest du dich entscheiden. Entweder Zeiger mit malloc oder ohne Zeiger ohne Allokation.

/Edit:
Zum Doppelpost:
FILE wird nicht erkannt, wenn du den Header vor stdio einbindest.
 

Neue Beiträge

Zurück