[C] Stworzenie tablicy struktur

Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Stworzenie tablicy struktur

Post autor: miki999 »

Witam,

mam sobie strukturę:

Kod: Zaznacz cały

typedef struct
{
const char literka1;
const char literka2;
unsigned long int liczba;
void *const pointer;
} strukturka;

Przykład takiej struktury:

Kod: Zaznacz cały

static unsigned char tablica[15];
strukturka sialala =
{
'A',                     
'B',                   
tablica     
};
Chciałbym sobie stworzyć tablicę takich struktur.
Niby można zrobić to poprzez strukturka tablica_struktur[n], ale co w takim razie ze wskaźnikami? Przecież kompilator nie wie na co (w szczególności na iluelementowe tablice) mają być wskaźnik wewnątrz tych struktur.
Na pewno jest jakaś zasada, aby to rozwiązać.

Będę wdzięczny za pomoc.


Pozdrawiam.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C] Stworzenie tablicy struktur

Post autor: royas »

Chodzi o to pole void *const pointer;?
Nie ma problemu, bo do rozmiaru struktury wchodzi tylko wielkość wskaźnika, a nie wielkość tego na co on wskazuje.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Stworzenie tablicy struktur

Post autor: miki999 »

Chodzi o to pole
Dokładnie tak.

Oczywiście do struktury wchodzi wielkość wskaźnika, ale zakładam, że tworząc tablicę struktur: strukturka tablica_struktur[n], kompilator w tym miejscu dla 1. struktury z tablicy zakłada jakieś miejsce w pamięci, do którego będą wpisywane dane, dla kolejnych to samo. Na logikę jeżeli będę non-stop zapisywał strumień danych zaczynając od adresu wskazywanego przez wskaźnik pierwszej struktury, to w końcu przepełnię miejsce, które kompilator na to przeznaczył i zacznę nadpisywać inne dane (być może dane dla kolejnej struktury).

W tym przypadku:

Kod: Zaznacz cały

static unsigned char tablica[15];
strukturka sialala =
{
'A',                     
'B',                   
tablica     
};
wiem, że mam do dyspozycji co najmniej obszar pamięci odpowiadający 15 charom.

Czy dobrze myślę? A może w ogóle gadam głupoty? :P
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C] Stworzenie tablicy struktur

Post autor: royas »

Jak będziesz tworzył tablicę strukturek, to kompilator nie rezerwuje żadnej pamięci dla tego na co pokazuje .pointer. Rezerwuje jedynie miejsce w strukturze na ten wskaźnik. W sialalala masz pod tym wskaźnikiem tylko tyle miejsca ile ma tablica podana jako inicjalizator tego pola. Ale te 15 charów jest rezerwowane w miejscu tworzenia tablica, a nie w momencie tworzenia sialalala. W przypadku utworzenia strukturka tablica_struktur[n] nie masz w ogóle miejsca zarezerwowanego. A pola .pointer są albo NULL albo mają śmieci.

W takim rozwiązaniu będziesz mieć z przypisaniem tam czegokolwiek, bo jest to wskaźnik stały.
Kolejny problem to to, że jest void* czyli bez rzutowania raczej tego potem nie poużywasz.

Edit:
Gdybyś miał void *pointer; mógłbyś po utworzeniu tablicy struktur, utworzyć tablicę charów dla każdej struktury i ustawić na taką tablicę pointer.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Stworzenie tablicy struktur

Post autor: miki999 »

royas, dzięki za rozwianie wątpliwości.
Edit:
Gdybyś miał void *pointer; mógłbyś po utworzeniu tablicy struktur, utworzyć tablicę charów dla każdej struktury i ustawić na taką tablicę pointer.
I chyba tak zrobię. Po prostu myślałem, że istnieje jakiś myk, by zrobić to z automatu podczas deklaracji samej struktury.
Rozumiem, że najlepiej w pętli dla każdej składowej struktury ustalić taki wskaźnik?
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C] Stworzenie tablicy struktur

Post autor: royas »

Stały wskaźnik można zmodyfikować małym oszustwem:

Kod: Zaznacz cały

void **ptr;
ptr=&(sialala.pointer);
(*ptr)=tablicajakas;
Ale w ogóle jeśli chcesz mieć w każdej strukturze tak samo dużą tablicę, to możesz "wdefiniować" tę tablicę w strukturę, wtedy miejsce na tablicę rezerwuje razem z miejscem na całą strukturę.

Kod: Zaznacz cały

typedef struct
{
    const char literka1;
    const char literka2;
    unsigned long int liczba;
    void *const pointer;
    char napis[15];
} strukturka;
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Stworzenie tablicy struktur

Post autor: Afish »

royas pisze:Stały wskaźnik można zmodyfikować małym oszustwem:

Kod: Zaznacz cały

void **ptr;
ptr=&(sialala.pointer);
(*ptr)=tablicajakas;
To jest niezdefiniowane przez język i możesz otrzymać wyjątek ochrony pamięci (gdy przykładowo ten wskaźnik będzie w pamięci tylko do odczytu).

Odnośnie głównego problemu, to w C99 można dodać tablicę na końcu struktury - nazywa się to Flexible Array Member.
ODPOWIEDZ