Benbjo Skrevet 14. november 2008 Del Skrevet 14. november 2008 Heisann. Har følgende problem: Jeg skal finne alle filene som ligger i en mappe. Disse (altså NAVNET på filene, ikke filene i seg selv) skal så legges inn i et array. Arrayet må da være så stort at det er plass til alle disse, ergo kan jeg ikke hardkode noe. Har så langt kommet med følgende løsning, men får en feilmelding: void getFiles(){ char* list = malloc(sizeof(system("ls"))); snprintf(list, sizeof(system("ls")), system("ls")); createPacks(list); } feilmeldingen er: passing argument 3 of snprintf makes pointer from integer without a cast. Er det noen annen løsning på dette? Har også et problem med bruk av memcpy. Har følgende kode: unsigned char length = 1 + strlen(message) + sizeof(uint32_t); memcpy(buf, &length, sizeof(length)); memcpy(buf+1, &antPacks, sizeof(antPacks)); memcpy(buf+5, &message, strlen(message)); Problemet er at ingenting legges inn i buf... Buf er altså et char array (men må tenkes på som bytes). All form for hjelp hadde vært fantastisk. Lenke til kommentar
zotbar1234 Skrevet 14. november 2008 Del Skrevet 14. november 2008 Jeg skal finne alle filene som ligger i en mappe. Disse (altså NAVNET på filene, ikke filene i seg selv) skal så legges inn i et array Arrayet må da være så stort at det er plass til alle disse, ergo kan jeg ikke hardkode noe. Har så langt kommet med følgende løsning, men får en feilmelding: void getFiles(){ char* list = malloc(sizeof(system("ls"))); snprintf(list, sizeof(system("ls")), system("ls")); createPacks(list); } Uff, hvor skal man begynne her. Hvis list skal være en "array med filnavn" som attpåtil er av ukjent størrelse (og du ikke bruker C99 som tillater VLA-er), så er det nok best å deklarere den som: char **list = NULL; Neste spørsmål er, hvordan finner du ut hvor mange filer det er snakk om? system("ls") er bare fryktelig feil på veldig mange måter. APUE ("Advanced programming in the UNIX environment") har et kapittel som diskuterer akkurat dette tema, men du har lyst til å se på opendir() og readdir() systemkall. Ideen da er å lese ett og ett navn av gangen og legge dem til list. Dersom det ikke er mer plass i list, må du utvide den. Mao. ca. slik: size_t size = 0ul; size_t available_space = 0ul; char **list = NULL; while ( <new names not exhausted> ) { char *next_name = ...; if ( size >= available_space ) list = reallocate(list, &available_space); list[size++] = next_name; // [*] } [*] Hvis du trenger en kopi av filnavn (hvilket man høyst sannsynligvis gjør), så er det nok lurt å lage sin egen versjon av strdup() og kalle den her. reallocate() (som du bør basere på realloc()) tar og øker størrelsen av det list peker på for å få plass til nye elementer. En relativt fornuftig strategi er å doble størrelsen opptil en viss grense og deretter øke størrelsen med en noe lavere faktor (f.eks. 1.5). I dette tilfellet kan man nok trygt doble hele veien. feilmeldingen er: passing argument 3 of snprintf makes pointer from integer without a cast. Er det noen annen løsning på dette? snprintf() er bare feil her. Dvs ja, du kan bruke snprintf() også, men da må du allokere plass til det som snprintf() skal skrive til. Og *da* sitter du omtrent med forslaget mitt. Har også et problem med bruk av memcpy. Har følgende kode: unsigned char length = 1 + strlen(message) + sizeof(uint32_t); memcpy(buf, &length, sizeof(length)); memcpy(buf+1, &antPacks, sizeof(antPacks)); memcpy(buf+5, &message, strlen(message)); Problemet er at ingenting legges inn i buf... Buf er altså et char array (men må tenkes på som bytes). Unsigned char til størrelser? Er det lurt? Er alle meldinger alltid < 256 bytes? Du viser ikke hvordan buf er definert, og det er jo temmelig viktig. sizeof(length) over er *alltid* 1. Hva er det den første memcpy() egentlig gjør? Den er ekvivalent med "buf[0] = length", men hva er det du *egentlig* vil? Sist, men ikke minst, hvordan vet du av "ingenting legges inn i buf"? Lenke til kommentar
Benbjo Skrevet 15. november 2008 Forfatter Del Skrevet 15. november 2008 buf er bare en char array med 260 plasser, altså: char buf[256]. Alle meldinger er mindre enn det ja. Ideen er at man i buf[0] skal ha hvor stor meldingen er, deretter hvor mange pakker som skal leses (ikke viktig her), og så selve meldingen. Grunnen til at jeg vet at det ikke lagres noe i buf er at jeg tester utskrift og størrelse på den. Lenke til kommentar
zotbar1234 Skrevet 15. november 2008 Del Skrevet 15. november 2008 buf er bare en char array med 260 plasser, altså: char buf[256]. 260 eller 256? Uansett, akkurat det er kanskje ikke så viktig foreløpig. Grunnen til at jeg vet at det ikke lagres noe i buf er at jeg tester utskrift og størrelse på den. Og hvordan gjør du det? (hint: printf()/strlen() kan være feil her). Lenke til kommentar
Benbjo Skrevet 15. november 2008 Forfatter Del Skrevet 15. november 2008 Hmm er ikke helt sikker på hvor stor buf var... men tror det var 256. Selve pakken som lages skal ikke kunne bli større. bruker printf og strlen ja... hvorfor blir ikke dette rett? Hvordan skal jeg da se innholdet i arrayet? Lenke til kommentar
zotbar1234 Skrevet 15. november 2008 Del Skrevet 15. november 2008 (endret) bruker printf og strlen ja... hvorfor blir ikke dette rett? Hvordan skal jeg da se innholdet i arrayet? Det blir ikke nødvendigvis riktig pga spesialbehandling av nulbyte. Vil du dumpe minne rått ut, skriver du en og en byte selv f.eks. vha. fwrite(). Endret 15. november 2008 av zotbar1234 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå