Just nu i M3-nätverket
Jump to content

Siffersträng->Char


Johan Augustsson

Recommended Posts

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!

 

Link to comment
Share on other sites

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.

 

 

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...