| Member 
				 
				Iscritto dal: Apr 2010 
					Messaggi: 53
				      | 
				
				[assembly] esercizio vettori
			 
 
		salve a tutti. Ho un esercizietto da sottomettervi. Dato un vettore di interi devo creare un vettore compresso di char dove compaia il numero di volte che il numero compare, e il numero stesso. ESEMPIO: 
vettore: 1 1 1 1 1 3 4 4 5
 
compresso: 5 1 1 3 2 4 1 5
 
5 volte l'uno 1 volta il 2.......
 
il mio codice funziona tranno che nel caso in qui ci siano cifre ripetute più di 255 volte, e dato che char non può essere > il caso fallisce
 
ecco il codice:
 
	Codice: #include <stdio.h>
#include <stdlib.h>
void main(){
   #define MaxLen 1024
   int Len = 30;
   unsigned char Buffer[MaxLen] = {97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,255}
;
   #define MaxLenComp (MaxLen*2+1)
   unsigned char BufComp[MaxLenComp];
   __asm{
            XOR EAX,EAX
            XOR EDX,EDX
            XOR ESI,ESI
            XOR EBX,EBX
      
            MOV EAX,0                  // i = 0
            MOV EDX,1                  // j = 1
            MOV ESI,0                  // indice vettore compresso
            MOV EBX,1                  // conta = 1
   inizio:      CMP EAX,30
            JE   fine                  // salta a fine se j > 30
            XOR ECX,ECX
              MOV CL,Buffer[EDX]
            CMP Buffer[EAX],CL
            JE  incrementa               // vai a incrementa se i numeri coincidono
             //altrimenti3
   spezza:      MOV BufComp[ESI],BL         // compresso[indice] = conta
            INC ESI
            XOR ECX,ECX
            MOV CL,Buffer[EAX]      
            MOV BufComp[ESI],CL      // compresso[indice] = vettore[i]
            INC EAX                     // i++
            INC EDX                     // j++
            INC ESI
            MOV EBX,1
            JMP inizio                  
incrementa:     INC EBX
            CMP EBX,255
            JE  spezza            // vai a spezza se il contatore = 255
            // altrimenti
            INC EAX
            INC EDX
            JMP inizio
      fine:   MOV BufComp[ESI],0
   }
   int i;
   for(i=0;i<Len;i++){  printf("%d ", Buffer[i]);  }
   printf("\n\n");
   for(i=0;BufComp[i];){ 
                  printf("%d ", BufComp[i++]); 
                  printf("%d ", BufComp[i++]); 
   }
   
   
   system("pause");
} 
avete idee?? ho anche un foglio con l'algoritmo scritto, ma non capisco dove sbaglio
		 |