Sida 1 av 1

Fråga kring pekare, C.

Postat: 30 mars 2012, 13:49:22
av Zajber
Håller på att damma av mina C-skills och det går sådär just nu.

Jag har två arrayer:

Kod: Markera allt

char input[255]={'t','e','s','t'};
char output[255];
Det jag vill göra med detta är en funktion som mellan varje tecken lägger in "0x00" så att output ser ut så här:

Kod: Markera allt

{'t',0x00,'e',0x00,'s',0x00,'t'0x00,}
Jag ville göra detta med en funktion som tar in de två adresserna till dessa arrayer och sedan modifierar detta och återgår med resultatet i output enligt:

Kod: Markera allt

void convert_filename(char *string,char *filename){

	unsigned int i=0,j=0;

	for(i=0;i<=512;i++){
		if ((i%2) == 1){
			filename[i] = 0x00;
		}
		else if ((i%2) == 0){
			filename[i] = string[j];
			j++;
		}
	}

} 
och den anropas med:

Kod: Markera allt

convert_filename(&filename_string, &filename_filename);	
Hur gör man detta på rätt sätt? Just nu blir det bara slubbagojja av allt.

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 13:52:24
av AndLi
Kalla funktionen med något av nedanstående, så ska det funka... (bägge skage samma resultat)

convert_filename(input, output);

convert_filename(&input[0], &output[0]);

edit: sen är ju buffern bara 256, men du loopar outputen till 512...
Och mina input/output är felvända ovan...

edit2: nä de är inte felvända....

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 13:53:13
av Zajber
Ehm. Ser nu att jag kör 512 itterationer på arrayen fast den endast är 255. :doh:

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 13:53:24
av blueint
Hur ser hexdumpen av slubbagojjan ut?

Din funktion borde fungera förutsatt att den får adekvata pekare.

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 13:58:08
av Zajber
Det var nog min miss med storleken på arrayen som ställde till det. Programmet hoppade ur och debuggern verkade tappa positionen efter beräkningen innan.

Men nu funkar det.

Anropar funktionen korrekt nu också. :)

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 14:22:24
av Zeela
Man borde väl kunna förkorta funktionen till nåt i stil med nedan för att slippa modulooperationen

Kod: Markera allt

void convert_filename(char *string,char *filename){

   unsigned int i=0,j=0;

   for(i=0;i<256;i++){
      filename[j++] = string[i];
      filename[j++] = 0x00;
   }

}
(har inte kompilerat eller testat, men nåt åt det hållet...)

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 14:35:12
av anders_w
Några kommertarer angående storleken på arrayer:
du deklarerar char input[255] och loopar med for(i=0;i<=512;i++)
det var naturligtvis fel och är korrigerat nu,
men för att det ska vara korrekt måste du deklarera 256 och loopa 0 till 255
eller deklarera 512 och loopa till 511. tänk på det så kan du undvika en del problem.

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 14:42:10
av AndLi
Jag brukar nästintill alltid loopa till i<128 istället för i<=128.

du kan då ha en "#define BUFFERSIZE 128" och använda samma i din "char buffer[BUFFERSIZE];" och i din "for(i=0;i<BUFFERSIZE;i++);" Behöver du då en större / mindre buffer sköter det sig själv (oftast, tills i inte räcker till i storlek längre...)

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 14:49:44
av anders_w
Det är roligt att skriva kompakt och oläsbar kod. Vad tror du om
while(*((unsigned short *)filename)++ = *((unsigned char)string)++);
allt på en rad (om string är null-terminerad och big/little endian stämmer).

Re: Fråga kring pekare, C.

Postat: 30 mars 2012, 14:58:45
av AndLi
Förutom det idiotisk i att skriva kod på det viset gör den inte heller rätt :D
Sannolikt kommer kompilatorn genererar mer asm kod också, enkel tydlig och ren kod ger 999 av 1000 bättre slutresultat... Storleken på C filen är ointressant.. Men visst det impar på C-nybörjare :)

/TråkAndli :D

Re: Fråga kring pekare, C.

Postat: 31 mars 2012, 19:10:48
av Zajber
Det är lite "dirty" just nu. Jag ska givetvis lösa det lite smidigare och mer "korrekt" när det gäller storlekarna på måndag när jag är tillbaka på jobbet. :D

Re: Fråga kring pekare, C.

Postat: 21 april 2012, 21:19:17
av zebran
Kompilatorn kommer sannolikt INTE att generera mer kod.

Re: Fråga kring pekare, C.

Postat: 21 april 2012, 21:36:37
av Micke_s
Du bör skicka in hur långt resultatet max kan bli.
Ser ut som du håller på med utf16 little endian.

edit: Du måste ha null-terminering på source
char string[] = "Hello";

Kod: Markera allt

bool ascii2utf16le(char *source,char *destination, int maxlen){
    int len;
    int i;
    bool state=false;

    /* tar reda på hur många tecken det finns i string)
    len = strnlen(source, maxlen+1);
   
   /* konvertera bara om destination har plats */
    if(len <= maxlen){
        for(i=0;i<len;i++)[
              *destination++ = *source++;
              *destination++ = 0x00;
        }
        state = true;
    }

    return state; /* en enda exit path... */
}

Re: Fråga kring pekare, C.

Postat: 21 april 2012, 22:13:59
av zebran
Om det är ascii man konverterar kan det vara på sin plats att ge fel för tecken 0x80 - 0xff.