[C] Struktura po przekazaniu do funkcji zmienia swoje wartosci
Ostatnio zmodyfikowano 2014-12-13 20:41
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 :) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h>
#define NLEN 15 #define LOS_ILE 3 int iile = 0;
typedef struct Dziecko { char imie[ NLEN ]; int 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; printf( "******ETAP 1 - inicjalizacja i wypisanie ******\n" ); pm = pPrzedszkole = pini( & iile, k1 ); druk( & iile, pm ); getch(); return 0; } |
|
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/303typdef - może też http://pl.wikipedia.org/wiki/Typedefpatrzą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 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 |
|
Monika90 |
» 2014-12-13 20:41:52 Przede wszystkim to funkcja pini zwraca adres zmiennej lokalnej w - to jest niezdefiniowane zachowanie . |
|
« 1 » |