Collections-C คือไลบรารีของโครงสร้างข้อมูลทั่วไปสำหรับภาษา C
โครงสร้างที่เก็บข้อมูลในรูปแบบ void*
คอนเทนเนอร์ | คำอธิบาย |
---|---|
CC_Array | อาร์เรย์แบบไดนามิกที่ขยายโดยอัตโนมัติเมื่อมีการเพิ่มองค์ประกอบ |
CC_List | รายการที่เชื่อมโยงทวีคูณ |
CC_SList | รายการที่เชื่อมโยงเพียงรายการเดียว |
CC_Deque | อาร์เรย์แบบไดนามิกที่รองรับการแทรกและการลบเวลาคงที่ที่ตัดจำหน่ายที่ปลายทั้งสองด้านและการเข้าถึงเวลาคงที่ |
CC_HashTable | แผนที่คีย์-ค่าที่ไม่เรียงลำดับ รองรับการแทรก การลบ และการค้นหาค่าเวลาคงที่ในกรณีที่ดีที่สุด |
CC_TreeTable | แผนที่คีย์-ค่าที่เรียงลำดับ รองรับการแทรกเวลาลอการิทึม การลบ และการค้นหาค่า |
CC_HashSet | ชุดที่ไม่เรียงลำดับ การค้นหา การลบ และการแทรกจะดำเนินการตามเวลาคงที่ที่ตัดจำหน่าย และในกรณีที่เลวร้ายที่สุดจะใช้เวลาเชิงเส้นที่ตัดจำหน่าย |
CC_TreeSet | ชุดที่สั่ง. การค้นหา การลบ และการแทรกจะดำเนินการในเวลาลอการิทึม |
CC_Queue | โครงสร้าง FIFO (เข้าก่อนออกก่อน) รองรับการแทรก การลบ และการค้นหาเวลาอย่างต่อเนื่อง |
CC_Stack | โครงสร้าง LIFO (เข้าหลังก่อนออก) รองรับการแทรก การลบ และการค้นหาเวลาอย่างต่อเนื่อง |
CC_PQueue | คิวลำดับความสำคัญ |
CC_RingBuffer | บัฟเฟอร์แหวน |
CC_TSTTable | ตารางแผนผังการค้นหาแบบไตรภาค รองรับการแทรก การค้นหา การวนซ้ำ และการลบ |
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
}
โครงสร้างที่จัดเก็บข้อมูลที่มีความยาวตามต้องการโดยตรง
คอนเทนเนอร์ | คำอธิบาย |
---|---|
CC_ArraySized | อาร์เรย์แบบไดนามิกที่ขยายโดยอัตโนมัติเมื่อมีการเพิ่มองค์ประกอบ |
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
}
พูลหน่วยความจำคือบล็อกหน่วยความจำที่อยู่ติดกันที่ได้รับการจัดสรรไว้ล่วงหน้า
คอนเทนเนอร์ | คำอธิบาย |
---|---|
CC_DynamicPool | บนฮีป พูลหน่วยความจำที่อาจขยายได้ |
CC_StaticPool | สระว่ายน้ำคงที่ |
/* 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 ;
}
แพ็คเกจเหล่านี้มักจะสามารถติดตั้งผ่านตัวจัดการแพ็คเกจการแจกจ่ายของคุณ
ในการสร้างโปรเจ็กต์ อันดับแรกเราต้องสร้างไดเร็กทอรี build แยกต่างหาก (หากยังไม่มี):
mkdir build
จากไดเร็กทอรีนี้เราสามารถรันคำสั่ง cmake
และกำหนดค่าบิลด์ได้:
cmake ..
หรือ cmake -DSHARED=True
เพื่อสร้าง Collections-C build เป็นไลบรารีที่ใช้ร่วมกันcmake -DSHARED=False
ในการสร้างไลบรารีแบบคงที่ เมื่อ cmake
สร้าง makefiles เสร็จแล้ว เราสามารถสร้างไลบรารี่ได้โดยการรัน make
ภายในไดเร็กทอรี build ของเรา
ตัวอย่างของการโคลนและการสร้างไลบรารีแบบคงที่:
git clone https://github.com/Collections-C.git
cd Collections-C
mkdir build
cd build
cmake -DSHARED=False
make
หากต้องการรันการทดสอบ (จากไดเร็กทอรี build
):
make test
หากต้องการรันการทดสอบแต่ละรายการ เพียงเรียกใช้ไฟล์ปฏิบัติการที่เหมาะสม ตัวอย่างเช่น:
build/test/array_test
ในการติดตั้งไลบรารีให้รัน:
sudo make install
ตามค่าเริ่มต้น ไลบรารีและส่วนหัวจะถูกติดตั้งในไดเร็กทอรี /usr/local/lib/
และ /usr/local/include
คุณต้องทำให้รันไทม์ของระบบทราบตำแหน่งของไลบรารีใหม่เพื่อให้สามารถเรียกใช้แอปพลิเคชันที่เชื่อมโยงแบบไดนามิกได้ นี่อาจทำได้ง่ายเพียงแค่เรียกใช้คำสั่งต่อไปนี้หาก /etc/ld.so.conf
ของคุณมีไดเร็กทอรีการติดตั้ง
หมายเหตุ: macOS ไม่รองรับ ldconfig
sudo ldconfig
หากเราสร้างและติดตั้งไลบรารี่แล้ว เราสามารถเขียนโปรแกรม Hello World ง่ายๆ และบันทึกลงในไฟล์ชื่อ 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 ;
}
ตอนนี้เราจำเป็นต้องคอมไพล์และลิงก์โปรแกรมของเรา เนื่องจาก make
builds ทั้งไลบรารีแบบสแตติกและไดนามิก เราจึงสามารถเลือกได้ว่าไลบรารีใดที่เราต้องการเชื่อมโยงเข้ากับโปรแกรมของเรา
หากเราต้องการเชื่อมโยงไลบรารีเข้ากับโปรแกรมของเราแบบคงที่ เราสามารถส่งแฟล็ก -static
ไปยังคอมไพเลอร์ได้
หมายเหตุ: บน macOS แฟล็ก -static
นั้นไม่เป็นมิตรมากนัก (ต้องการให้ไลบรารีทั้งหมดเชื่อมโยงแบบคงที่) ดังนั้นเราจึงสามารถแทนที่ -static -lcollectc
ด้วยเส้นทางแบบเต็มไปยังไลบรารีแบบคงที่ ซึ่งเป็น /usr/local/lib/libcollectc.a
โดยดีฟอลต์
gcc hello.c -static -lcollectc -o hello
หรือในทำนองเดียวกันเมื่อรวบรวมด้วยเสียงดังกราว:
clang hello.c -static -lcollectc -o hello
สิ่งนี้จะเชื่อมโยงไลบรารีโดยการคัดลอกลงในไฟล์ปฏิบัติการ เราสามารถใช้ตัวเลือกนี้ได้หากเรา ไม่ ต้องการให้ Collections-C เป็นการ พึ่งพารันไทม์ อย่างไรก็ตาม สิ่งนี้มาพร้อมกับค่าใช้จ่ายในการสร้างไฟล์ปฏิบัติการที่ใหญ่ขึ้น
นอกจากนี้เรายังสามารถเลือกเชื่อมโยงกับไลบรารีแบบไดนามิกขณะรันไทม์ได้ นี่เป็นลักษณะการทำงานเริ่มต้นหากละเว้นแฟล็กคอมไพเลอร์ -static
:
gcc hello.c -lcollectc -o hello
หรือเสียงดังกราว:
clang hello.c -lcollectc -o hello
การลิงก์แบบไดนามิกทำให้ไฟล์ปฏิบัติการมีขนาดเล็กลง แต่จำเป็นต้องมี libcollectc.so
ในทุกระบบที่โปรแกรมจะถูกดำเนินการ
บางครั้งคอมไพลเลอร์อาจมีปัญหาในการค้นหาไลบรารีหรือส่วนหัว โดยปกติจะเป็นเพราะมันค้นหาในไดเร็กทอรีที่ไม่ถูกต้อง ซึ่งอาจเกิดขึ้นได้หากไลบรารีหรือส่วนหัวหรือทั้งสองอย่างได้รับการติดตั้งในไดเร็กทอรีที่ไม่ได้มาตรฐานหรือไม่ได้ติดตั้งเลย
หากเป็นกรณีนี้ เราสามารถบอกคอมไพลเลอร์ได้อย่างชัดเจนว่าจะค้นหาได้จากที่ไหนโดยส่งตัวเลือก -I[path to headers]
และ -L[path to libraries]
:
gcc hello.c `pkg-config --cflags --libs collectionc` -o hello
หากทุกอย่างเป็นไปด้วยดีกับการคอมไพล์ เราสามารถรันไฟล์ปฏิบัติการได้:
./hello
และควรพิมพ์ Hello, World!
ไปที่คอนโซล
ยินดีบริจาค
หากคุณมีคำขอคุณลักษณะหรือพบข้อบกพร่อง โปรดเปิดประเด็นใหม่ได้เลย หากคุณต้องการร่วมเขียนโค้ด โปรดดูที่ CONTRIBUTING.md สำหรับรายละเอียดเพิ่มเติม