Collections-C adalah perpustakaan struktur data generik untuk bahasa C.
Struktur yang menyimpan data dalam bentuk void*
.
Wadah | keterangan |
---|---|
CC_Array | Array dinamis yang diperluas secara otomatis saat elemen ditambahkan. |
CC_List | Daftar Tertaut Ganda. |
CC_SList | Daftar tertaut tunggal. |
CC_Deque | Array dinamis yang mendukung penyisipan dan penghapusan waktu konstan yang diamortisasi di kedua ujungnya dan akses waktu konstan. |
CC_HashTable | Peta nilai kunci yang tidak berurutan. Mendukung penyisipan, penghapusan, dan pencarian nilai waktu konstan diamortisasi kasus terbaik. |
CC_TreeTable | Peta nilai kunci yang diurutkan. Mendukung penyisipan waktu logaritmik, penghapusan dan pencarian nilai. |
CC_HashSet | Himpunan yang tidak berurutan. Pencarian, penghapusan, dan penyisipan dilakukan dalam waktu konstan diamortisasi dan dalam kasus terburuk dalam waktu linier diamortisasi. |
CC_TreeSet | Satu set yang dipesan. Pencarian, penghapusan, dan penyisipan dilakukan dalam waktu logaritmik. |
CC_Queue | Struktur FIFO (masuk pertama keluar pertama). Mendukung penyisipan, penghapusan, dan pencarian waktu yang konstan. |
CC_Stack | Struktur LIFO (masuk terakhir keluar pertama). Mendukung penyisipan, penghapusan, dan pencarian waktu yang konstan. |
CC_PQueue | Antrian prioritas. |
CC_RingBuffer | Penyangga cincin. |
CC_TSTTable | Tabel pohon pencarian terner. Mendukung penyisipan, pencarian, iterasi, dan penghapusan. |
int value = 20 ;
CC_Array * array ;
if ( cc_array_new ( & array ) != CC_OK ) { /*Create a new array.*/
// handle error
}
if ( cc_array_add ( & array , ( void * ) & value ) != CC_OK ) { /* Add the pointer to the value to the array */
// handle error
}
Struktur yang menyimpan data dengan panjang sembarang secara langsung.
Wadah | keterangan |
---|---|
CC_ArraySized | Array dinamis yang diperluas secara otomatis saat elemen ditambahkan. |
int value = 20 ;
CC_SizedArray * array ;
if ( cc_sized_array_new ( sizeof ( int ), & array ) != CC_OK ) { /* Create a new array that stores values the size of an int*/
// handle error
}
if ( cc_sized_array_add ( & array , & value ) != CC_OK ) { /* Copy the value into the array */
// handle error
}
Kumpulan memori adalah blok memori yang berdekatan yang telah dialokasikan sebelumnya
Wadah | keterangan |
---|---|
CC_DynamicPool | Di heap, kumpulan memori berpotensi dapat diperluas |
CC_StaticPool | Kolam tetap |
/* CC_StaticPool can enable the use of the structures on the stack */
#include "memory/cc_static_pool.h"
#include "cc_list.h"
CC_StaticPool * pool ;
// Alloc wrappers
void * pool_malloc ( size_t size ) { cc_static_pool_malloc ( size , pool );}
void * pool_calloc ( size_t count , size_t size ) { cc_static_pool_calloc ( count , size , pool );}
void pool_free ( void * ptr ) { cc_static_pool_free ( ptr , pool );}
int main ( int argc , char * * argv ) {
uint8_t buffer [ 2000 ]; /* Large enough buffer. */
cc_static_pool_new ( sizeof ( buffer ), 0 , buffer , buffer , & pool ); /* allocate the pool structure inside the buffer */
CC_ListConf conf ; /* Create a new list config */
cc_list_conf_init ( & conf );
conf . mem_alloc = pool_malloc ; /* Set list memory allocators to pool allocators */
conf . mem_calloc = pool_calloc ;
conf . mem_free = pool_free ;
CC_List * list ;
cc_list_new_conf ( & conf , & list ); /* The newly created list will be allocated inside the "buffer" array*/
// Use the list
return 0 ;
}
Paket-paket ini biasanya dapat diinstal melalui manajer paket distribusi Anda.
Untuk membangun proyek, pertama-tama kita perlu membuat direktori build terpisah (jika belum ada):
mkdir build
Dari direktori ini kita dapat menjalankan perintah cmake
dan mengkonfigurasi build:
cmake ..
atau cmake -DSHARED=True
untuk menjadikan Koleksi-C dibangun sebagai perpustakaan bersamacmake -DSHARED=False
untuk membangun perpustakaan statis Setelah cmake
selesai menghasilkan makefile, kita dapat membangun perpustakaan dengan menjalankan make
di dalam direktori build kita.
Contoh mengkloning dan membangun perpustakaan statis:
git clone https://github.com/Collections-C.git
cd Collections-C
mkdir build
cd build
cmake -DSHARED=False
make
Untuk menjalankan pengujian (dari direktori build
):
make test
Untuk menjalankan pengujian individual, cukup jalankan executable yang sesuai. Misalnya:
build/test/array_test
Untuk menginstal perpustakaan, jalankan:
sudo make install
Secara default perpustakaan dan header akan diinstal di direktori /usr/local/lib/
dan /usr/local/include
.
Anda harus membuat runtime sistem mengetahui lokasi perpustakaan baru agar dapat menjalankan aplikasi yang terhubung secara dinamis. Ini mungkin sesederhana menjalankan perintah berikut jika /etc/ld.so.conf
Anda berisi direktori instalasi.
Catatan: macOS tidak mendukung ldconfig.
sudo ldconfig
Jika kita sudah membangun dan menginstal perpustakaan, kita dapat menulis program hello world sederhana dan menyimpannya ke file bernama hello.c
:
#include <stdio.h>
#include <collectc/cc_array.h>
int main ( int argc , char * * argv ) {
// Create a new array
CC_Array * ar ;
cc_array_new ( & ar );
// Add a string to the array
cc_array_add ( ar , "Hello World!n" );
// Retreive the string and print it
char * str ;
cc_array_get_at ( ar , 0 , ( void * ) & str );
printf ( "%s" , str );
return 0 ;
}
Sekarang kita perlu mengkompilasi dan menghubungkan program kita. Karena make
membangun perpustakaan statis dan dinamis, kita dapat memilih mana yang ingin kita tautkan ke dalam program kita.
Jika kita ingin menghubungkan perpustakaan ke program secara statis, kita dapat meneruskan flag -static
ke kompiler
Catatan: Di macOS, tanda -static
sangat tidak bersahabat (ini mengharuskan semua perpustakaan ditautkan secara statis). Jadi kita bisa mengganti -static -lcollectc
dengan path lengkap ke perpustakaan statis. Yaitu /usr/local/lib/libcollectc.a
secara default.
gcc hello.c -static -lcollectc -o hello
atau serupa saat mengkompilasi dengan dentang:
clang hello.c -static -lcollectc -o hello
Ini akan menghubungkan perpustakaan dengan menyalinnya ke dalam file yang dapat dieksekusi. Kita dapat menggunakan opsi ini jika kita tidak ingin memiliki Collections-C sebagai ketergantungan runtime , namun hal ini mengorbankan pembuatan executable yang lebih besar.
Kita juga dapat memilih untuk menghubungkan dengan perpustakaan secara dinamis saat runtime. Ini adalah perilaku default jika menghilangkan flag kompiler -static
:
gcc hello.c -lcollectc -o hello
atau dengan dentang:
clang hello.c -lcollectc -o hello
Penautan secara dinamis menghasilkan executable yang lebih kecil, namun mengharuskan libcollectc.so
ada di setiap sistem tempat program akan dijalankan.
Terkadang kompiler mungkin kesulitan menemukan perpustakaan atau header. Hal ini biasanya karena mencarinya di direktori yang salah, yang mungkin terjadi jika perpustakaan atau header atau keduanya dipasang di direktori non-standar atau tidak dipasang sama sekali.
Jika hal ini terjadi, kita dapat secara eksplisit memberi tahu kompiler di mana mencarinya dengan meneruskan opsi -I[path to headers]
dan -L[path to libraries]
:
gcc hello.c `pkg-config --cflags --libs collectionc` -o hello
Jika semuanya berjalan baik dengan kompilasi, kita dapat menjalankan file executable:
./hello
dan itu akan mencetak Hello, World!
ke konsol.
Kontribusi dipersilakan.
Jika Anda memiliki permintaan fitur, atau menemukan bug, silakan buka terbitan baru. Jika Anda ingin menyumbangkan kode, lihat CONTRIBUTING.md untuk lebih jelasnya.