C: Ein Zeiger auf Struktur. Prob!

Hi!
Folgendes Problem ist vorhanden:

Code:
for (zaehler = 1; zaehler <= 7; zaehler += 1)
             {
              Zeigen(zaehler);
              scanf ("%s", *(zeiger + i));
              fprintf (datei ,"%s", *(zeiger + i));
             }


Ich bekomm folgende Fehlermeldung, wenn bei dieser scanf() Anweisung etwas eingebe und dieses dann Bestätige:
Die Anweisung in "0x780266c9" verweist auf Speicher in "0x00000000". Der Vorgang
"written konnte nicht auf dem Speicher durchgeführt werden.

Kann mit jemand sagen was ich falsch gemacht habe!^^"
Aso, der zeiger wird durch die Function Zeigen() einer struct zugewiesen. diese hat den Typ char!
Euer STS
 
Zeig mal diese Struct-Definition. Und die genaue Definition von zeiger.

Wenn das Struct nur ein char gross ist, ists klar.

Mach da ein 100 char array; auf jeden Fall gross genug für die Eingabe (plus ein Nullzeichen als Terminator).
 
Hi!
Code:
struct mitarbeiter
  {
   char* Name;
   char* Vorname;
   char* Strassenname;
   char* Hausnummer;
   char* Postleitzahl;
   char* Ort;
   char* Telefonnummer;
  }mitglied[5];

So das ist, die besagte Struktur!^^
Ich hoffe das Hilft!
Euer STS
 
Da fehlen immer noch Informationen, aber ist dir bewusst, dass dein struct keinen Platz für Daten (Zeichenkette), sondern nur welchen für Pointer darauf zur Verfügung stellt? Hast du für jeden der enthaltenen Pointer genug Platz alloziert, um die Zeichenketten aufzunehmen? So etwa:
Code:
mitglied[0].name = new char[100]; // Platz schaffen für Zeichen
//usw
 
Mischt das mit dem C und C++ bitte nicht so drastisch!

Für C++ hast Du natürlich Recht kachelator, aber dort gehört dann auch noch das delete mitglied[0].name nach Benutzung hin.

Für C musst Du dies tun:

#include <malloc.h>
......
mitglied[0].name = (char*)malloc(sizeof(char)*100));
....
free(mitglied[0].name];
 
Hi!
Ich weiß was du meinst, aber bevor ich dass beispiel hier postete
war die struct so:
Code:
struct mitarbeiter
  {
   char Name[50];
   char Vorname[50];
   char Strassenname[50];
   char Hausnummer[50][50];
   char Postleitzahl[50];
   char Ort[50];
   charTelefonnummer[50];
  }mitglied[5];

Aber dabei hats dann auch nicht funktioniert. Das Problem kommt , aber auch nur bei Strings eingabe, mit kombination eines Zeigers wie im obigen Beispiel. Sind alle Typen Integer gibt es keine Probleme.

Hier hab ich mal die Funktion die dem Zeiger die nächste Struktur zuweist:
Code:
void Zeigen(int i)
     {
      switch (i)
        {
         case 1:
                printf ("\n\nVorname: ");
                zeiger = &mitglied[0].Vorname;
                break;
         case 2:
                printf ("Nachname: ");
                zeiger = &mitglied[0].Name;
                break;
         case 3:
                printf ("Strassenname: ");
                zeiger = &mitglied[0].Strassenname;
                break;
         case 4:
                printf ("Hausnummer: ");
                zeiger = &mitglied[0].Hausnummer;
                break;
         case 5:
                printf ("Postleitzahl: ");
                zeiger = &mitglied[0].Postleitzahl;
                break;
         case 6:
                printf ("Ort: ");
                zeiger = &mitglied[0].Ort;
                break;
         case 7:
                printf ("Telefonnummer: ");
                zeiger = &mitglied[0].Telefonnummer;
                break;
        }
     }

Euer STS
 
Von welchem Typ ist denn zeiger? Außerdem ist die Einleseoperation, die du am Anfang benutzt hast, unzulässig, damit bewirkst du jedenfalls nicht das richtige. Alles in allem ist es doch nicht weiter wild:

1. Struktur erstellen - hast du gemacht

2. Speicher reservieren - siehe Bsp.

3. Werte zuweisen
Code:
strcpy(mitglied[0].Name,"Müller");
strcpy(mitglied[1].Vorname,"Karl-Heinz");
...

4. Werte abrufen, Bsp.:
Code:
for (int i; i < 5; i++) printf("Name von Mitglied Nr. %i: %s \n",i,mitglied[i].Name);

Warum dieser Zeigerkram?
 
Hi!
Der Zeigerkram erspart mir eine menge Arbeit bei, meiner Übung!^^
Ich arbeite an einer simplen Datenbank, und um mir arbeit zu sparen
und mit Schleifen arbeiten zu können, mach ich diesen Zeigerkram.
Diese+Zuweisung wird öffters gebraucht und ohne Schleifen ist
das erstens unütze Dateigröße udn Tipparbeit!^^:-)
Euer STS
 
Von welchem Typ ist zeiger denn nun? Ich vermute mal char**, ansonsten wär's murks. So und dann haben wir das:

Code:
Zeigen(zaehler);
scanf ("%s", *(zeiger + i));
fprintf (datei ,"%s", *(zeiger + i));

Den Zeiger bekommst du über die Funktion, die du ja gepostet hast. Beim Einlesen dereferenzierst du, aber du addierst vorher i, warum? Damit lässt du zeiger doch wieder auf eine ganz andere Adresse zeigen, als die, die du über Zeigen geholt hast.
Wenn du mit Zeigeroperationen unbedingt arbeiten möchtest, dann mach's lieber so:

Code:
zeiger = &mitglied[0].name;
for (int i = 0; i < 7; i++)
{
  scanf ("%s", *zeiger);
  fprintf (datei ,"%s", *zeiger);
  zeiger++;
}

Damit schiebst du den Zeiger durch alle Items der Struktur.

Ach so nochwas: Du kannst auch so vorgehen, ist vielleicht noch etwas angenehmer:

Code:
zeiger = &mitglied[0].name;
for (int i = 0; i < 7; i++)
{
  scanf ("%s", zeiger[i]);
  fprintf (datei ,"%s", zeiger[i]);
}
 
Zuletzt bearbeitet:
Hi!
So Problem gelöst!^^
Ich danke euch erstmal für die vielen "Versuche" mir zu helfen.
Es hat sich heraus gestellt das die Lösung des Problems gerade
mal zwei Tastendrücke gebrauch hat. Na, gut dazu kam noch ein#
Mausklick:
Vorher:
Code:
for (zaehler = 1; zaehler <= 7; zaehler += 1)
             {
              Zeigen(zaehler);
              scanf ("%s", *(zeiger + i));
              fprintf (datei ,"%s", *(zeiger + i));
             }

Nachher:
Code:
for (zaehler = 1; zaehler <= 7; zaehler += 1)
             {
              Zeigen(zaehler);
              scanf ("%s", (zeiger + i));
              fprintf (datei ,"%s", (zeiger + i));
             }

Wer den unterschied sieht, erkennt das ein Problem
nicht immer ein Komplizierte Lösung brauch!^^
Euer STS
 
Zurück