Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Struktura po przekazaniu do funkcji zmienia swoje wartosci

Ostatnio zmodyfikowano 2014-12-13 20:41
Autor Wiadomość
Fear
Temat założony przez niniejszego użytkownika
[C] Struktura po przekazaniu do funkcji zmienia swoje wartosci
» 2014-12-13 13:50:48
Witam, pisze program na laborki, i w funkcji, która ma wypisać wartość struktury wychodzą takie kwiatki, że nagle wiek z 3 zamienia się na jakąś losową liczbę z nikąd, przy przejściu z main do funkcji druk(), a potem jeszcze imie zamienia się na krzaczki.

Oto kod, liczę na pomoc, dzięki :)
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NLEN 15 //maks dlugosc imienia dziecka
#define LOS_ILE 3 //ilosc do wylosowania
int iile = 0; //dlugosc tablicy

typedef struct Dziecko {
    char imie[ NLEN ]; //imie dziecka
    int wiek; //wiek
};
struct Dziecko * pini( int * n, struct Dziecko w )
{
    struct Dziecko * wsk = NULL;
    wsk =( struct Dziecko * ) malloc( sizeof( struct Dziecko ) );
    if( !wsk )
    {
        printf( "Blad alokacji pamieci w funkcji pini" );
        return NULL;
    }
    wsk = & w;
    ( * n ) ++;
    return wsk;
}

void druk( int * n, struct Dziecko * w )
{
    int i;
    struct Dziecko * p;
    p = w;
    for( int i = 0; i < * n; ++i )
    {
        printf( "Imie: %s, Wiek: %d",( * p ).imie,( * p ).wiek );
        p += 1;
    }
}

int main( int argc, const char * argv[] )
{
    struct Dziecko * pPrzedszkole, * pm;
    struct Dziecko k1 = { "Ola", 3 }, k2 = { "Jurek", 5 }, k3 = { "Ula", 2 }, k4 = { "Ania", 3 }, k5 = { "Adam", 4 }, k6 = { "Adam", 4 }, k7 = { "Ula", 7 }, k8 = { "Jurek", 5 }, k9 = { "Adam", 2 };
    char * ctest;
    /* ETAP 1 - inicjalizacja i wypisanie*/
    printf( "******ETAP 1 - inicjalizacja i wypisanie ******\n" );
    pm = pPrzedszkole = pini( & iile, k1 );
    druk( & iile, pm );
    getch();
    return 0;
}
P-122789
darko202
» 2014-12-13 20:24:35
wydaje mi się, że podstawowym błędem w Twoim programie jest sposób użycia słowa :
struct
http://cpp0x.pl/kursy/Kurs-C++​/Struktury-danych/303
typdef  - może też
http://pl.wikipedia.org/wiki​/Typedef


patrząc na załączony program mamy :
1.
typedef struct Dziecko {..}
ponieważ celem typedef jest przypisanie nazw alternatywnych do istniejących typów
pytanie,  co właściwie zrobiłeś ?

potem mamy
struct Dziecko * pini( int * n, struct Dziecko w ) {..}
struct Dziecko * wsk = NULL;
itp. wiele razy

co więc zawiera struktura Dziecko ?

2. np. w
C/C++
struct Dziecko * pini( int * n, struct Dziecko w )
{
    struct Dziecko * wsk = NULL;
    wsk =( struct Dziecko * ) malloc( sizeof( struct Dziecko ) );
    if( !wsk )
    {
        printf( "Blad alokacji pamieci w funkcji pini" );
        return NULL;
    }
    wsk = & w;
    ( * n ) ++;
    return wsk;
}
przekazujesz do metody struct Dziecko

a potem tworzysz nową zmienną lokalną o tej samej nazwie
struct Dziecko * wsk = NULL
przynajmniej tak to wygląda

3. używasz wskaźników różnych typów
co powoduje, że pokazujesz inne niż chciałeś miejsce w pamięci


Podsumowując wydaje się , że gdybyś "struct Dziecko" zastąpił "Dziecko" poza miejscem definicji
to program działałby lepiej

P-122821
Monika90
» 2014-12-13 20:41:52
Przede wszystkim to funkcja pini zwraca adres zmiennej lokalnej w - to jest niezdefiniowane zachowanie .
P-122825
« 1 »
  Strona 1 z 1