Página 1 de 1

Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 06 Ago 2019 00:19
por Guri
Onde NumCaracter, representa o tamanho do buffer de textos que esta numa array.
Sg0, 1, 2 e 3, são arrays contendo os textos (no caso são 5 caracteres).
TempBuffRx, é o Buffer de comparação, onde há um texto também de 5 caracteres.
Sgf0, são flags de sinalização, para saber se a comparação é IGUAL(1) ou DIFERNTE (0).
SgCounter, é uma variavel char que serve como identificador externo.

Eu fiz a rotina individualmente para cada caso (nesse exemplo são 4 rotinas checando TEMPBUFFRX que é uma string com 5 caracteres), como eu estou "mexendo" com textos, não consegui desenvolver o raciocínio para fazer isso tudo em uma única chamada, coisa do tipo FOR. É possível integrar essas 4 rotinas em uma única, assim economizo memória.
Eu citei 4 rotinas de exemplo, porém vou utilizar 200 rotinas iguais a esta... :oops:

Agradeço todas as dicas...

cpp code
//------------------------------------------------------      
// ETAPA 0:
//------------------------------------------------------
for(z=0;z<NumCaracter;z++)
{if(TempBuffRx[z]==Sg0[z])
{Sgf0=1;}else{Sgf0=0;z=NumCaracter;}
}
if(Sgf0==1){SgCounter=0;}
//------------------------------------------------------
// ETAPA 1:
//------------------------------------------------------
for(z=0;z<NumCaracter;z++)
{if(TempBuffRx[z]==Sg1[z])
{Sgf1=1;}else{Sgf1=0;z=NumCaracter;}
}
if(Sgf1==1){SgCounter=1;}
//------------------------------------------------------
// ETAPA 2:
//------------------------------------------------------
for(z=0;z<NumCaracter;z++)
{if(TempBuffRx[z]==Sg2[z])
{Sgf2=1;}else{Sgf2=0;z=NumCaracter;}
}
if(Sgf2==1){SgCounter=2;}
//------------------------------------------------------
// ETAPA 3:
//------------------------------------------------------
for(z=0;z<NumCaracter;z++)
{if(TempBuffRx[z]==Sg3[z])
{Sgf3=1;}else{Sgf3=0;z=NumCaracter;}
}
if(Sgf3==1){SgCounter=3;}

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 06 Ago 2019 07:41
por denis
Guri,

Não olhei com calma, mas acho que se você trocar Sg0,1,2,3 e Sgf0,1,2,3 por um ponteiro você consegue criar uma única função onde os parâmetros de entrada e saída são dinâmicos.

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 06 Ago 2019 08:14
por Red Neck Guy
cpp code
unsigned char MalaDeGarupaEBombacha(unsigned short int *pBufA,unsigned short int *pBufB,unsigned short int lenght){
unsigned char result = 1;

for(unsigned short int i=0;i<lenght;i++)
if(pBufA[i] != pBufB[i]){
result = 0;
break;
}

return result;
}


//nas tuas chamadas de função (Na teoria da computação ou são funções ou são procedimentos, hoje em dia rotina é coisa de logistica ou coisas que tu faz todo dia e deixam a tua vida um tédio)
unsigned short int *pBufs[4] = {Sg0,Sg1,Sg2,Sg3};

for(unsigned char i=0;i<4;i++){
if(MalaDeGarupaEBombacha(TempBuffRx,pBufs[i])){
SgCounter = i;
}
}


obs.: Havia um erro no meu código, mas já está ok agora

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 06 Ago 2019 08:42
por tcpipchip
Gaucho = MalaDeGarupaEBombacha

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 06 Ago 2019 11:39
por Guri
Agradeço a atenção de vocês.

Vou tentar implementar as dicas! :shock:
Antes preciso entender o funcionamento da "bonbacha"... :mrgreen:

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 09 Ago 2019 22:54
por Guri
Consegui resolver de outra forma,

Eu aproveito para corrigir um erro de digitação na minha postagem, na verdade eu queria MINIMIZAR o programa e não MAXIMIZAR :roll: Peço desculpas!

Então, eu estava querendo pegar um TEXTO com 5 caracteres e fazer a comparação dele com o BUFFER circular que recebia pela serial.

E tinha feito uma rotina de comparação para cada TEXTO...isso ficava na RAM como palavra fixa. Aí estava meu ERRRO.

Ao invés de fazer isso, acabei por colocar todos os TEXTOS para comparação em uma tabela na FLASH, ai criei um PONTEIRO x e y, sendo o x = posição do TEXTO e o y a quantidade de caracteres contidos nessa linha.

Aí fiz uma rotina FOR para endereçar a POSIÇÂO (x) e dentro desse FOR, fiz outro FOR que pegava os TEXTO da tabela, lendo os 5 caracteres e armazenando-os em um BUFFER temporário e assim fazia a compraração com o buffer vindo de RX...e usei só um FLAG para definir se eram iguais ou não...Funcionou beleza e bem rápidinha a rotina...e o melhor de tudo reduziu de 6kbytes para menos de 50bytes... :mrgreen:

As dicas foram muito úteis, pois abriram minha imaginação...Muito obrigado a todos os amigos.

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 10 Ago 2019 00:02
por Guri
Segue a rotina, se alguém também tiver esse problema, pode usar a rotina... :mrgreen:

cpp code
void   ScanRx()
{unsigned char TxtMidi[6];
for(MidiScroll=0;MidiScroll<512;MidiScroll++)
{
sprinti(TxtMidi,"Sg%d ",MidiScroll); // SCANEIA Sg0 ATÉ Sg 511.
for(z=0;z<NumCaracter;z++) // DETECTA O TEXTO DE CHAMADA
{if(TempBuffRx[z]==TxtMidi[z])
{CompareSg=1;}else{CompareSg=0;z=NumCaracter;} // Flag de Sinalização "igual ou diferente".
}
if(CompareSg==1){SgCounter=MidiScroll;MidiScroll=512;}// SAI DA ROTINA DE COMPARAÇÃO.

}
}

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 10 Ago 2019 18:25
por ze
Guri escreveu: MINIMIZAR o programa e não MAXIMIZAR

Agora que vc explicou... que tal se saísse da função ao achar primeiro caracter diferente? Não perde tempo comparando os d+ entende? Algo como
Código: Selecionar todos
bool void ScanRx(){ // bool, bit static bit, etc... verifique a sintaxe do seu compilador
//...
if(TempBuffRx[z]!=TxtMidi[z]) return 0;
}
return 1
}


Apesar que penso que já existe função de comparação de strings... Só não sei se eficiente quando a sua...

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 11 Ago 2019 01:40
por Guri
Obrigado ze.

Mas se observar, essa rotina faz justamente isso,

Temos uma tabela de comparação contendo strings com 5 caracteres cada, no total são 512 palavras com 5 caracteres cada... :roll:

A rotina começa, fazendo a comparação com o BUFFER, após achar a palavra na tabela que é igual a que esta no BUFFER, a rotina "ESCAPA" do loop, através do FLAG de sinalização...

Obrigado pela dica. :mrgreen:

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 11 Ago 2019 09:40
por Red Neck Guy
A função strstr da lib string.h faz essas comparações.
Dificilmente você fará algo mais otimizado do que ela.... Imagina que quem escreveu esse código já chegou no estado da arte da implementação.

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 12 Ago 2019 07:24
por ze
Observei que sim. Se observar a minha (nossa) é mais simplista não necessitando de flag e saindo rapidamente da função. Penso que atende no que tange o [errado] título do tópico.
Eu (eu) iria de Aquino.

Re: Alguem tem uma sugestão para maximizar isso?

MensagemEnviado: 12 Ago 2019 18:47
por Guri
Fico muito grato pelas dicas à todos os amigos.. :)