Fråga kring pekare, C.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Fråga kring pekare, C.

Inlägg 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.
Användarvisningsbild
AndLi
Inlägg: 18285
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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....
Senast redigerad av AndLi 30 mars 2012, 13:56:10, redigerad totalt 2 gånger.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: Fråga kring pekare, C.

Inlägg av Zajber »

Ehm. Ser nu att jag kör 512 itterationer på arrayen fast den endast är 255. :doh:
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Fråga kring pekare, C.

Inlägg av blueint »

Hur ser hexdumpen av slubbagojjan ut?

Din funktion borde fungera förutsatt att den får adekvata pekare.
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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å. :)
Zeela
Inlägg: 176
Blev medlem: 28 augusti 2008, 11:23:49
Ort: Åtvidaberg
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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...)
anders_w
Inlägg: 112
Blev medlem: 6 september 2011, 17:02:03

Re: Fråga kring pekare, C.

Inlägg 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.
Användarvisningsbild
AndLi
Inlägg: 18285
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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...)
anders_w
Inlägg: 112
Blev medlem: 6 september 2011, 17:02:03

Re: Fråga kring pekare, C.

Inlägg 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).
Användarvisningsbild
AndLi
Inlägg: 18285
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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
Användarvisningsbild
Zajber
Inlägg: 451
Blev medlem: 19 oktober 2009, 22:07:16
Skype: Andreas.fridh85
Ort: Rödön
Kontakt:

Re: Fråga kring pekare, C.

Inlägg 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
zebran
Inlägg: 2
Blev medlem: 21 april 2012, 18:23:52

Re: Fråga kring pekare, C.

Inlägg av zebran »

Kompilatorn kommer sannolikt INTE att generera mer kod.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Fråga kring pekare, C.

Inlägg 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... */
}
zebran
Inlägg: 2
Blev medlem: 21 april 2012, 18:23:52

Re: Fråga kring pekare, C.

Inlägg av zebran »

Om det är ascii man konverterar kan det vara på sin plats att ge fel för tecken 0x80 - 0xff.
Skriv svar