Gå til innhold

[C] Tilgjengelige headere for Arrays på web?


Anbefalte innlegg

Hei der!

 

Etter en stund med C, så finner jeg noen ting som kompliserer livet noen få små hakk; "append", "pop", "del", og lignende slik som jeg er vant med fra Python er ikke-eksisterende. Det må gjøres "manuelt" med allokering, re-allokering, etc.

 

Jeg lurer da på om det er noen her som har kjennskap til noen tilgjengelige headers på det store web, som jeg kan bruke for å forenkle livet litt. Hvor jeg da får muligheten til å legge til element, slette element, enklere ha kontroll over antall elementer i arrayen, og lignende.

 

Håper noen kjenner til noe i den duren! :-)

Endret av warpie
Lenke til kommentar
Videoannonse
Annonse

Ikke verst. Er jeg tvungen til å bladre i kildekoden for "dokumentasjon"?

 

Er ikke helt stabil på C, så noen pointere skader ikke, så håper du kan besvare:

- Kan du gi meg et lite eksempel på bruk, slik at jeg slipper fundere på det / teste meg frem? Ser veldig straight forward ut, inkludere vector.h, så tut å kjør!

 

- La oss si jeg har en array av uchar, hvordan bruker jeg vektor-klassen din for å håndtrede denne? Arrayen kommer fra Python, så størrelsen er allerede allokert.

Endret av warpie
Lenke til kommentar

Jeg har skrevet noe, men det er uferdig og ikke commitet inn. (Så fant jeg noe annet å gjøre og, vel, you know). Alle metoder er beskrevet ganske godt i headerene, men det er ingen oversikt utover dette.

 

Det hele er en øvelse i opaque pointers, så du må være litt forsiktig. Du får -ingen- hjelp av kompilatoren om du spytter inn feil størrelser.

 

Jeg tilbyr dessverre et ganskje kjipt scheme for alloc akkurat nå (hver gang du går tom, doble størrelse). Om du vet hvor stor containeren din skal være på forhånd, bruk hints! Da slipper du masse dyre reallocs.

 

I bunn ligger datatypen Vector. Denne oppfører seg (ganske) likt som C++ vectors. Stacks er bare typedef'd vectors.

 

Vector* vector = create_vector( sizeof( int ), 10 );
for( int i = 20; i > 10; --i )
push( vector, i );

 

Det bør være greit nok hva denne gjør. :--)

 

Stacks gir deg i grunn bare ekstra stackfunksjonalitet på toppen. Access control er dessverre ikke streng nok, så om du virkelig vil kan du også manipulere stacken lenger ned.

 

Deque (queue) er en egen type og kan ikke byttes ut med vector. Den har da naturlig nok enqueue og dequeue fremfor push og pop.

 

Du kan lage en queue fra en vektor med vtoq. Merk at du -ikke- kan få vektoren din tilbake (uten å implementere dette selv - tar imot patcher :>)

 

Jeg tilbyr også heaps, men jeg har i noen versjoner oppdaget noen feil. Jeg tror ikke denne feilen er i master per nå, men jeg ville skrevet tester hver gang du trenger heap.

 

Jeg har også skrevet et par sorts, men ingen av de er parallelliserbare ennå. Jeg tenkte å tilby parallel quicksort etterhvert, men den er ikke på plass ennå.

 

Av trees er det bare red-black per nå. Dette kan også brukes som map. Til det tilbyr jeg også et interface, dvs en struct av function pointers, slik at man senere kan bytte ut underliggende type med et hash map uten å brekke programmet ditt.

 

Det tilbys også stacks og queues basert på linked list. Disse oppfører seg nesten likt som vectors (egentlig alt), men har en annen underliggende type.

 

tl;dr: Det brukes sånn her:

 

operation( container, value );

 

Alle bør være ok dokumentert i headerene, inkludert gotchas.

 

----

 

Edit: jeg har faktisk ingen måte å ta en vilkårlig array (med size) til en vector. Dette kan jeg prøve å få inn i løpet av dagen.

Endret av Lycantrophe
Lenke til kommentar
Edit: jeg har faktisk ingen måte å ta en vilkårlig array (med size) til en vector. Dette kan jeg prøve å få inn i løpet av dagen.

Hadde vært flott om du kunne gjort det, dog har størrelsen på arrayen, den er passert fra Python også. så noe slik som:

>>> Vector* vector = create_from_pointer(arr, size_t);

hadde nok vært fult mulig, og slett ingen dum funksjon! Da slipper en også å iterere over elementene for å legge til. For det høres ut som en sinke.

 

Ellers så høres dette bra ut, skal lese meg opp på kildekoden for å få en ide over hva som skjer! :-)

 

Edit:

For å dele opp en vector eller lage en pointer til en del av en vector (hente x elemeter), vil fremgangsmåten fremdeles være den samme som før (med arrays)?

Noe slik: memcpy(newArr, vector + bytes, size_t); ?

 

Er det noe håp om å få inn en swap-funksjon: swap(element1, element2); ?

Endret av warpie
Lenke til kommentar

Det finnes nok også ferdig løsninger for dette i ymse nytte-libraries (jeg vet GLib har noe), men da må du drasse på et stort og komplisert library ved siden av koden din. Hvor stort problem det er kommer helt an på hvor koden skal brukes; om du skal kjøre på linux-maskiner som allerede har dem installert kan det være helt greit.

 

Alternativt er det nyttig teknisk øvelse å skrive denne koden selv, men det var kanskje ikke det du hadde tenkt å bruke tiden til...

Endret av Djn
  • Liker 1
Lenke til kommentar

Noe slik: memcpy(newArr, vector + bytes, size_t); ?

Nei, fordi vektorobjektet har også metadata. Ser den ikke har blitt pushet, men mener jeg har implementert en copy_vector-funksjon som gjør dette. Skal se gjennom de lokale git-repoene.

 

Er det noe håp om å få inn en swap-funksjon: swap(element1, element2); ?

Har en implementert som brukes til internt bruk. Forøvrig kan du swappe ved å bruke vector at; den returnerer peker.
Lenke til kommentar

Da har du en array-to-vector, hvertfall.

 

https://github.com/lycantrophe/nstl/commit/9ebdd620b401ba56f5fb6476055a7195dbb1662b

 

Jeg fant ikke slice her. Om jeg husker rett ble jeg aldri enig med meg selv om hvordan jeg skulle implementere slice ranges, men jeg tror det å bare hente en kontinuerlig del (uten fancy ranges som i python) var implementert. Skal rote litt med maskinene, men har ikke tid før lørdag, kanskje søndag.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...