Przekazywanie struktury do funkcji, wyswietlanie elementow struktury

0

Co mi tam, nie mam pomyslow ani polskich znakow. Dlaczego to cos nie chce poprawnie wypisac?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define DL 21

typedef struct przodek
{
    char imie[DL];
    struct przodek * ojciec;
    struct przodek * matka;
} Przodek;

void PobierzOsobe(Przodek * P, int i, char * m);
void Inicjuj(Przodek * P);
Przodek * Szukaj(Przodek * P, char * t);
void Wyswietl(Przodek * P, int n);

int main(void)
{
    Przodek osoba;

    Inicjuj(&osoba);
    printf("Podane imie: %s\n", osoba.imie);//tutaj juz szaleje, znaczy nic, a raczej nul wypisuje
    Wyswietl(&osoba, 3);
    PobierzOsobe(osoba.ojciec, 1, osoba.imie);
    PobierzOsobe(osoba.matka, 20, osoba.imie);
    Wyswietl(&osoba, 0);

    return 0;
}

void PobierzOsobe(Przodek * P, int i, char * m)
{
    puts("flaga");
    P = (Przodek *) malloc(sizeof(Przodek));
    puts("flaga");
    if(!P)
    {
        fprintf(stderr, "Blad przydzialu pamieci.\n");
        return;
    }
    printf("Podaj imie %s osoby imieniem %s: [wpisz cyfre aby zakonczyc]\n", i == 1 ? "ojca" : "matki", m);
    if(!(scanf("%s", (* P).imie) == 1  && isalpha(P->imie[0])))
        return;
    P->matka = P->ojciec = NULL;
    PobierzOsobe(P->ojciec, 1, P->imie);
    PobierzOsobe(P->matka, 2, P->imie);
}

void Inicjuj(Przodek * P)
{
    P = (Przodek *) malloc(sizeof(Przodek));
    if(!P)
    {
        fprintf(stderr, "Blad przydzialu pamieci..\n");
        return;
    }
    printf("Podaj imie pierwszej osoby: ");
    scanf("%s", (* P).imie);
    P->matka = P->ojciec = NULL;
    printf("imie po nullach: %s adres: %p\n", P->imie, P->matka);//poprawnie wypisuje imie
}

Przodek * Szukaj(Przodek * P, char * t)
{
    if(strcmp(P->imie, t))
        return P;
    if(P->matka)
        return Szukaj(P->matka, t);
    if(P->ojciec)
        return Szukaj(P->ojciec, t);
    return NULL;
}

void Wyswietl(Przodek * P, int n)
{
    int i = n;
    while(i-- > 0)
        putchar('|');
    printf("%s\n", P->imie);
    if(P->matka)
        Wyswietl(P->matka, n + 1);
    if(P->ojciec)
        Wyswietl(P->matka, n + 1);
}


 

Przykladowe wywolanie programu:

Podaj imie pierwszej osoby: Bogumil  
imie po nullach: Bogumil adres: (nil)
Podane imie: 
|||
||||
|||||SSH_AGENT_PID=636
Naruszenie ochrony pamięci (core dumped)
 

Pewnie jak zwykle glupi blad, pewnie jak zwykle zwyzywa mnie @_13th_Dragon od nieudacznikow i skrytykuje moj kod, no ale coz, raz sie zyje.

1

Temu:

#include <stdio.h>

void A(char x) { x=7; }
void B(char *p) { p=0; }
int main()
  {
   char x=3;
   A(x);
   B(&x);
   printf("x=%d\n",x);
   return 0;
  }
0

W sumie to dalej nie wiem, gdzie jest blad, do funkcji przekazuje adres struktury, no i co dalej? Zle sie odwoluje? Czy zle przekazuje argumenty? Gdzie jest ten blad?

1
pasasap napisał(a):

W sumie to dalej nie wiem, gdzie jest blad, do funkcji przekazuje adres struktury, no i co dalej? Zle sie odwoluje? Czy zle przekazuje argumenty? Gdzie jest ten blad?
Nie!
Przekazujesz do funkcji kopie adresu struktury.
Owszem w funkcji zmieniasz tą kopię ale po powrocie ta kopia znika bezpowrotnie.

0

Taki myk, w takim razie w jaki sposob w funkcji zmieniac pola struktury przekazanej jako argument? Bo o to tak wlasciwie sie rozchodzi.

2
Przodek *Inicjuj1()
  {
   Przodek *P=(Przodek*)malloc(sizeof(Przodek));
   ...
   return P;
  }
void Inicjuj2(Przodek **P)
  {
   *P=(Przodek*)malloc(sizeof(Przodek));
   ...
  }
Przodek *Szukaj(Przodek *P,const char *imie)
  {
   if(!strcmp(P->imie,imie)) return P;
   ...
  }

int main()
  {
   Przodek *P=0;
   P=Inicjuj1();
   Inicjuj2(&P);
   ...   
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1