Saya mencoba membuat array struct di mana setiap struct mewakili benda langit.
Saya tidak memiliki banyak pengalaman dengan struct, itulah sebabnya saya memutuskan untuk mencoba menggunakannya daripada sejumlah array. Namun, saya terus mengalami banyak kesalahan berbeda. Saya telah mencoba menerapkan teknik yang telah saya lihat di berbagai utas dan di StackOverflow (seperti Array dari struct di C dan C - menginisialisasi array struct ), namun tidak semuanya berlaku.
Informasi lebih lanjut bagi mereka yang telah membaca sejauh ini: Saya tidak memerlukan semua ini untuk menjadi dinamis, saya tahu / menentukan ukuran semuanya sebelumnya. Saya juga membutuhkan ini menjadi array global karena saya mengakses ini dalam beberapa metode berbeda yang telah menetapkan argumen (yaitu metode GLUT).
Beginilah cara saya mendefinisikan struct di header saya:
struct body
{
double p[3];//position
double v[3];//velocity
double a[3];//acceleration
double radius;
double mass;
};
Saya memiliki daftar variabel global lain yang saya definisikan sebelum saya mendefinisikan interior struct, dan salah satunya adalah array struct ini (pada dasarnya, jika saya terlalu tidak jelas dalam pembicaraan saya yang berkabut, baris di bawah ini di atas barang di atas):
struct body bodies[n];
Asal tahu saja, n
adalah sesuatu yang telah saya definisikan secara sah (yaitu #define n 1
).
Saya menggunakan array ini dalam beberapa metode berbeda, tetapi yang termudah dan paling sedikit memakan ruang adalah bentuk utama saya yang disederhanakan. Di sini saya menginisialisasi semua variabel di setiap struct, hanya untuk mengatur variabel dengan pasti sebelum saya memodifikasinya dengan beberapa cara:
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;
}
Kesalahan saat ini yang saya hadapi adalah di nbody.c:32:13: error: array type has incomplete element type
mana baris 32 adalah tempat saya membuat array struct.
Klarifikasi terakhir, yang saya maksud dengan header adalah ruang di atas int main(void)
tetapi dalam *.c
file yang sama .
struct body bodies[n];
sebelumstruct body {}
deklarasi?Jawaban:
ini bekerja dengan baik. pertanyaan Anda tidak terlalu jelas, jadi cocokkan tata letak kode sumber Anda dengan yang di atas.
sumber
Saya pikir Anda juga bisa menulis seperti itu. Saya juga seorang pelajar jadi saya mengerti perjuangan Anda. Respon agak terlambat tapi ok.
sumber
Jadi untuk menggabungkan semuanya dengan menggunakan
malloc()
:sumber
sizeof *students
adalah hal yang sama dan tidak akan salah jika STUDENT kebetulan berubah.sizeof *students
adalah ukuran dari apa yang ditunjukkan , yaitusizeof(STUDENT)
bukansizeof(STUDENT*)
. Anda membuat kesalahan persis yangptr = malloc(num * sizeof *ptr)
seharusnya dijaga oleh idiom itu. Periksa di sini (perhatikan server, seperti kebanyakan PC modern, memiliki 8 byte pointer sehingga ukurannya 8 dan 32, bukan 4 dan 20).pindah
untuk setelah
Istirahat semua terlihat baik-baik saja.
sumber
Cara lain untuk menginisialisasi array struct adalah menginisialisasi anggota array secara eksplisit. Pendekatan ini berguna dan sederhana jika tidak terlalu banyak anggota struct dan array.
Menggunakan
typedef
penentu untuk menghindari penggunaan kembalistruct
pernyataan setiap kali Anda mendeklarasikan variabel struct:Kemudian deklarasikan array struct Anda. Inisialisasi setiap elemen sejalan dengan deklarasi:
Untuk mengulang, ini adalah solusi yang agak sederhana dan mudah jika Anda tidak memiliki terlalu banyak elemen array dan anggota struct besar dan jika Anda, seperti yang Anda nyatakan, tidak tertarik dengan pendekatan yang lebih dinamis. Pendekatan ini juga dapat berguna jika anggota struct diinisialisasi dengan enum-variabel bernama (dan bukan hanya angka seperti contoh di atas) dimana ini memberikan pembaca kode gambaran yang lebih baik tentang tujuan dan fungsi struktur dan anggotanya pada aplikasi.
sumber
Kesalahan itu berarti bahwa kompilator tidak dapat menemukan definisi tipe struct Anda sebelum deklarasi array struct, karena Anda mengatakan Anda memiliki definisi struct di file header dan kesalahan ada di
nbody.c
kemudian Anda harus memeriksa apakah Anda memasukkan file header dengan benar. Periksa milik Anda#include
dan pastikan definisi struct sudah selesai sebelum mendeklarasikan variabel apa pun dari jenis itu.sumber
main
pernyataan tersebut.Solusi menggunakan pointer:
sumber