Próbuję stworzyć tablicę struktur, w których każda struktura reprezentuje ciało niebieskie.
Nie mam zbyt dużego doświadczenia ze strukturami, dlatego zdecydowałem się spróbować ich użyć zamiast całej masy tablic. Jednak ciągle napotykam na wiele różnych błędów. Próbowałem zaimplementować techniki, które widziałem w różnych wątkach i na StackOverflow (takie jak Array of structs w C i C - zainicjuj tablicę struktur ), jednak nie wszystkie z nich miały zastosowanie.
Dalsze informacje dla tych, którzy przeczytali do tej pory: nie potrzebuję tego, aby być dynamicznym, wiem / określam rozmiar wszystkiego wcześniej. Potrzebuję również, aby była to tablica globalna, ponieważ uzyskuję do niej dostęp w kilku różnych metodach, które mają zdefiniowane argumenty (tj. Metody GLUT).
Oto jak definiuję strukturę w moim nagłówku:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Mam listę innych zmiennych globalnych, które definiuję przed zdefiniowaniem wnętrza struktury, a jedną z nich jest tablica tej struktury (w zasadzie, jeśli jestem zbyt niejasny w moim zamglonym mowie, wiersz poniżej jest nad rzeczami powyżej):
struct body bodies[n];
Dla twojej wiadomości n
jest to coś, co zgodnie z prawem zdefiniowałem (tj #define n 1
.).
Używam tej tablicy w kilku różnych metodach, ale najłatwiejszą i najmniej zajmującą miejsce jest uproszczona forma mojego main. Tutaj inicjalizuję wszystkie zmienne w każdej ze struktur, aby ustawić zmienne na pewne, zanim je zmodyfikuję:
int a, b;
for(a = 0; a < n; a++)
{
for(b = 0; b < 3; b++)
{
bodies[a].p[b] = 0;
bodies[a].v[b] = 0;
bodies[a].a[b] = 0;
}
bodies[a].mass = 0;
bodies[a].radius = 1.0;
}
Bieżący błąd, z którym się spotykam, to miejsce, w nbody.c:32:13: error: array type has incomplete element type
którym linia 32 jest miejscem, w którym tworzę tablicę struktur.
Ostatnie wyjaśnienie, przez nagłówek mam na myśli spację powyżej, int main(void)
ale w tym samym *.c
pliku.
struct body bodies[n];
przedstruct body {}
deklaracją?Odpowiedzi:
to działa dobrze. Twoje pytanie nie było zbyt jasne, więc dopasuj układ swojego kodu źródłowego do powyższego.
źródło
Myślę, że mógłbyś to też napisać w ten sposób. Jestem też studentem, więc rozumiem twoją walkę. Trochę późna odpowiedź, ale ok.
źródło
Aby to wszystko połączyć, używając
malloc()
:źródło
sizeof *students
jest tym samym i nie będzie źle, jeśli UCZNIOWIEC kiedykolwiek się zmieni.sizeof *students
jest rozmiarem tego, na co wskazuje , tj .sizeof(STUDENT)
niesizeof(STUDENT*)
. Popełniasz dokładnie taki błąd, przed którymptr = malloc(num * sizeof *ptr)
ma strzec idiom. Sprawdź tutaj (zwróć uwagę, że serwer, podobnie jak większość współczesnych komputerów, ma wskaźniki 8-bajtowe, więc rozmiary to 8 i 32 zamiast 4 i 20).ruszaj się
po
Reszta wygląda dobrze.
źródło
Innym sposobem inicjalizacji tablicy struktur jest jawna inicjalizacja elementów tablicy. To podejście jest przydatne i proste, jeśli nie ma zbyt wielu elementów strukturalnych i tablicy.
Użyj
typedef
specyfikatora, aby uniknąć ponownego użyciastruct
instrukcji za każdym razem, gdy deklarujesz zmienną struct:Następnie zadeklaruj swoją tablicę struktur. Inicjalizacja każdego elementu idzie w parze z deklaracją:
Powtarzam, jest to raczej proste i nieskomplikowane rozwiązanie, jeśli nie masz zbyt wielu elementów tablicy i dużych elementów strukturalnych oraz jeśli, jak powiedziałeś, nie jesteś zainteresowany bardziej dynamicznym podejściem. Takie podejście może być również przydatne, jeśli elementy składowe struktury są inicjowane za pomocą nazwanych zmiennych wyliczeniowych (a nie tylko liczb, jak w powyższym przykładzie), dzięki czemu zapewnia czytelnikowi kodu lepszy przegląd celu i funkcji struktury i jej elementów członkowskich w określonych Aplikacje.
źródło
Ten błąd oznacza, że kompilator nie jest w stanie znaleźć definicji typu twojej struktury przed deklaracją tablicy struktur, ponieważ mówisz, że masz definicję struktury w pliku nagłówkowym, a błąd jest
nbody.c
wtedy powinieneś sprawdzić, czy poprawnie dołączasz plik nagłówkowy. Sprawdź swoje#include
i upewnij się, że definicja struktury została wykonana przed zadeklarowaniem jakiejkolwiek zmiennej tego typu.źródło
main
instrukcją.Rozwiązanie wykorzystujące wskaźniki:
źródło