Just nu i M3-nätverket
Gå till innehåll

Siffersträng->Char


Johan Augustsson

Rekommendera Poster

Johan Augustsson

Hej!!

 

Jag har tre siffror lagrade i en indexerad char

char[0]=2;

char[1]=5;

char[2]=3;

Självklart variera värdena.

 

Jag vill få de lagrade i en annan char i decimal form

counter=253;

 

Idag gör jag följande vilket funkar bra:

char counter;

counter=char[0]*100+char[1]*10+char[2];

 

Frågan är hur ska jag kontrollera så att det inmatade värdet inte överstiger 255 (max för char)? Min högsta prioritet är att det inte får ta någon programplats pga att det används till en microprocessor. Jag ville inte använda några "include"-filer.

 

En lösning är att ställa en massa if satser där jag kontrollerar så att char[0]<=2 && char[1]<=5 && char[2]<=5 OSV (blir många fler IF satser). Jag undrar om någon har en effektivare kod.

 

Tacksam för svar!

 

Länk till kommentar
Dela på andra webbplatser

jerker olofsson

typedef char Type;

const int MaxType = 1<<(8*sizeof( Type ));

 

Type GetAsDecimal( char* ptr, int len )

{

Type res = 0;

int p;

int s = 1;

for( p=0; p<len; ++p )

{

// Ta fram talet bakifrån i arrayen

int v = ptr[len-p-1]*s;

 

// Räkna fram ny multipliceringsfaktor för nästa iteration

s = s*10;

 

// Kolla om nuvarande array + nästa är större än

// vad typen Type klarar av.

if( ((int)(res)+v) < TypeMax )

{

res += v;

}

else

{

// Om du vill "clamp:a" talet vid max

res = TypeMax-1;

break;

}

}

 

return res;

}

 

char Buffer[3];

Buffer[0] = 2;

Buffer[1] = 5;

Buffer[2] = 3;

 

Type result = GetAsDecimal( Buffer, sizeof( Buffer ) );

 

Fungererar (o-testat) med x typer och y längder på buffrar.

 

Med reservation för felaktigheter. Vet inte om du stöder int's över huvudtaget, annars får du nog lösa det på något annat sätt. Men en loop är ju att rekomendera.

Men annars så finns det en x86 instruktion som adderar 2, 8 bitars tal och om det går över 255, så wrappar inte talet.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...