2010-04-04 8 views
5

Próbuję utworzyć tablicę struktur, a także wskaźnik do tej tablicy. Nie wiem, jak duża będzie tablica, więc powinna być dynamiczna. Moja struktura będzie wyglądać mniej więcej tak:Tablica struktur w C

typedef struct _stats_t 
{ 
int hours[24]; int numPostsInHour; 
int days[7]; int numPostsInDay; 
int weeks[20]; int numPostsInWeek; 
int totNumLinesInPosts; 
int numPostsAnalyzed; 

} stats_t; 

... i muszę mieć wielokrotność tych strukturach dla każdego pliku (nieznany) kwota, która będzie analizować. Nie jestem pewien, jak to zrobić. Nie podoba mi się następujące podejście ze względu na ograniczenie rozmiaru tablicy:

# define MAX 10 
typedef struct _stats_t 
{ 
int hours[24]; int numPostsInHour; 
int days[7]; int numPostsInDay; 
int weeks[20]; int numPostsInWeek; 
int totNumLinesInPosts; 
int numPostsAnalyzed; 

} stats_t[MAX]; 

Jak utworzyć tę tablicę? Również, czy wskaźnik do tej tablicy wyglądałby tak?

stats_t stats[]; 
stats_t *statsPtr = &stats[0]; 
+1

Pytania: Czy można zarządzać dynamiczną tablicą "int"? Czy potrafisz zarządzać statyczną tablicą 'struct'? Jeśli odpowiedź na którekolwiek z tych pytań brzmi "Nie", sugerowałabym pracę nad tym pierwszym. Gdy będziesz mógł zarządzać obydwoma, odpowiedź na * to * powinna być oczywista. Na koniec możesz znaleźć pomoc dotyczącą obu powyższych opcji w Stack Overflow już. – dmckee

Odpowiedz

5

Jak to zwykle odbywa się:

int n = <number of elements needed> 
stats_t *ptr = malloc (n * sizeof (stats_t)); 

Następnie, aby wypełnić go,

for (int j = 0; j < n; ++j) 
{ 
    ptr [j] .hours = whatever 
    ptr [j] .days = whatever 
    ... 
} 
+1

a) Powinieneś użyć 'size_t' zamiast' int'. 'int' jest typem podpisu i rzadko chcemy przydzielić tablicę o długości -1. b) Używałbym 'sizeof * ptr' zamiast' sizeof (stats_t) ', ale tutaj nie ma to znaczenia. –

+0

Dziękuję za odpowiedzi. Rozumiem, jak przydzielić pamięci i uzyskać do niego dostęp, ale problem polega na tym, że będę malloc jednej struktury na raz. Za każdym razem, gdy pojawi się nowy plik, zaadresuję dla niego inną strukturę. Nie mogę więc zaszczepić 'n' struktur, a następnie wrócić i nad tym popracować, a raczej muszę powiedzieć "Oto tablica, rozwiń (dodaj do niej) za każdym razem, gdy pojawi się nowy plik." Czy to ma sens? – Hristo

+0

@Hristo: Do ​​tego użyj funkcji 'realloc()', aby zmienić rozmiar tablicy przydzielonej przez 'malloc()'. Właśnie dlatego nazywa się alokację dynamiczną. –

2

Druga opcja wskaźnik jest dobry.

Jeśli chcesz przeznaczyć rzeczy dynamicznie, a następnie spróbuj:

stats_t* theStatsPointer = (stats_t*) malloc(MAX * sizeof(stats_t)); 

jak sugeruje Roland.

Tylko nie zapomnij

free(theStatsPointer); 

kiedy skończysz.

+1

Problem polega na tym, że nie znam MAX od razu ... Nie wiem, z iloma plikami będę miał do czynienia, więc ustawienie MAX byłoby złym pomysłem. – Hristo

+0

Nie chcę się powtarzać, ale ponieważ twój kod jest prawie identyczny z sblom (inny niż poprawna deklaracja "theStatsPointer"), patrz punkt b) w moim komentarzu. Ale +1 za przypomnienie nam "free()". –

+0

@ Chris: Nie widziałem sblornów, dopóki nie napisałem. W momencie, kiedy pisałem, widziałem tylko post Rolanda. –

0

malloc jest tu twoim przyjacielem.

stats_t stats[] = (stats_t*)malloc(N * sizeof(stats_t)); 

stats rodzaj jest wskaźnik do tablicy. Lub możesz użyć składni stats[3] tak, jakby była jawnie zadeklarowana jako tablica.

+0

Problem polega na tym, że nie wiem "n" od razu ... Nie wiem, z iloma plikami będę miał do czynienia. – Hristo

+0

a) Nie możesz zadeklarować czegoś takiego jak 'stats_t stats []'. To jest tablica bez rozmiaru, a nie wskaźnik. Potrzebujesz 'stats_t * stats'. b) Zdecydowanie zalecam, aby nie rzutować zwracanej wartości 'malloc()' w kodzie C i używać 'sizeof (stats_t)', z których oba powodują, że zmiana typu 'stats' jest bardziej skomplikowana. W obsadzie znajdują się również inne, mniej uzasadnione stygmaty z nią związane. –

+0

Co byś polecił zamiast "sizeof"? – sblom

0

podstawie swoich odpowiedziach na innych odpowiedzi to wygląda jak trzeba dynamiczne struktury danych, jak połączona lista. Spójrz na zestaw urządzeń queue(3).

+0

dzięki za sugestię. Przyjrzę się temu. – Hristo

+1

Funkcje 'queue (3)' nie są standardowe. –

+0

Co to jest biblioteka struktury danych C? –