Limite do case no Switch

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Limite do case no Switch

Mensagempor buiz » 21 Nov 2008 14:28

Olá,

Alguem saberia me informar se existe algun limite de condições CASE na função Switch?

Fiz um Switch com 250 cases, o que esta acontecendo é que quando chega no 128 ao inves de passar para o 129 ele retorna para o primeiro Case.

É muito estranho,

Ja usei até uma variavel Int16 mas não adianta, chega no 128 retorna para a 1, o engraçado é que a variavel esta certa, exemplo 129 só que busca informação do CASE 1, 130 do CASE 2 e assim por diante.

Até 128 tudo joia, 129 volta para o primeiro.

Se alguem tiver alguma explicação lógica, ja procurei algum material sobre isso mas não encontrei nada que diga que tem limite no CASE.

Um abraço, aguardo alguma ajuda.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor chrdcv » 21 Nov 2008 15:51

verifique se sua variável é unsigned char, no label que está no case, defina-o como sendo um unsigned:
#define PASSO_130 (130U)

Se não tiver jeito, consulte manual do compilador...
Sugiro que para casos assim seja utilizado um array com ponteiro para funções. Fica mai elegante e mais fácil a manutenção e acréscimos.

christian
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor Djalma Toledo Rodrigues » 21 Nov 2008 16:50

129 = 81 H = 1000 0001 bin.
o sistema vê o 1 mais significativo como sinal negativo.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor buiz » 22 Nov 2008 08:48

Ok!

Vou verificar as dicas dadas, fiz um gambiarra para solucionar no momento e funcionou:

Código: Selecionar todos
if (a<=128){ //testa se (a) é menor ou igual a 128

switch(a)
{
case 1:
break;
.
.
case 128:
break;
}}

if (a>128){//se (a) for maior que 128 executa aqui
switch(a)
{
case 129:
break;
.
.
case 250:
break;
}}


Mas não vou desistir aqui, vou testar as sugetões dadas e ver o que acontece.

Um abraço a todos e um bom final de semana.
Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor helton » 22 Nov 2008 18:59

nao seria interessante fazer um enum

typedef enum{
foo,
bar,
....
}MyCases;

daí, cria uma variável

MyCases ActualCases;

switch(ActualCases)
{
case foo:
break;
case bar:
break;
}

Porque daí vc deixa o compilar dar conta dos valores e do intervalo das variáveis...
Isto é...caso esse seja esse seu problema...
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC

Mensagempor msamsoniuk » 22 Nov 2008 20:20

para tantos casos possiveis nao seria mais interessante usar uma lookup table ? para tantos casos assim acho que fica mais eficiente.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor barboza » 23 Nov 2008 01:51

Não conheço a arquitetura do PIC nem sei qual compilador usa, mas normalmente os compiladores organizam os switch com jump relativos



Código: Selecionar todos
ld acc, variavel_switch
jr  $,@acc

jmp   case1
jmp   case2
jmp   case3
...
jmp   case129
....


* meramente ilustrativo.....



Neste caso, as instruções do PIC podem ser limitadas a 7 bits.

É uma suposição......
De uma olhada no asm gerado pelo compilador e veja o instruct set do PIC.

Mas com certeza, trocar seu código para uma tabela, acho mais recomendável.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Re: Limite do case no Switch

Mensagempor Djalma Toledo Rodrigues » 23 Nov 2008 11:58

buiz escreveu:Fiz um Switch com 250 cases...


A idéia que passa, assim a prióri, é que há muito Switch, Case ou Jump aí
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor guest2003 » 24 Nov 2008 11:26

Isso é limitação do compilador, qual você esta usando ?

No caso do compilador da Hitech (Picc) o limite é 511 cases.

"The maximum allowable number of case labels in any one switch statement is 511"

Da uma lida na documentação do seu compilador que certamente você vai encontrar o problema.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor Guilherme_ELT » 17 Dez 2008 09:31

Acho que Barboza passou uma idéia boa do problema...
No assembler do PIC temos as rotinas de desvios e chamadas
Toda vez q ocorre um desvio, no programa e queremos retorna a ele ou a determinado lugar dele, o PIC guarda o endereço do pro cimo ponto do programa na pilha(satck) assim podemos ter outra rotina a ser chamadas dentro da rotina atual gerando outros níveis de stack entretanto q alguns PIC só possui 8 níveis de stack, quando essa quantidade rotinas é ultrapassada ocorre um erro no programa.
Acredito q o erro deva ser por esse motivo, talvez outros compiladores tenha algum tipo de artifício para criar mais cases, assim como vc criou um. Não tenho certeza que seja exatamente isso q esta ocorrendo, seria a minha hipótese.
Guilherme_ELT
Bit
 
Mensagens: 7
Registrado em: 16 Dez 2008 11:45
Localização: Aracruz-ES

Mensagempor andre_luis » 17 Dez 2008 10:22

Compilando a ideia do Guilherme e do Guest, a explicação ficou clara.
Se usasse somente o case, poderia trabalhar com 511, tipo :

Código: Selecionar todos
switch(i)
{
case 0 :
case1  :
...
case254 :
break;
}


Mas ao se incluir o retorno da função, acaba-se consumindo espaço na tabela :

Código: Selecionar todos
switch(i)
{
case 0 :
break;


case1  :
break;

...
case254 :
break;
}


Outro ponto relevante - que já o chrdcv comentou - é o tipo da variável. Talvez usando um unsigned int, resolva.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor jeanfernandes » 18 Dez 2008 21:06

Caramba
250 Cases ?
hummmmmmmmm
:lol:
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor Djalma Toledo Rodrigues » 18 Dez 2008 22:29

jeanfernandes escreveu:Caramba
250 Cases ?
hummmmmmmmm
:lol:

"Quando um programador é bom
Ele é muito, muito bom mas,
Quando ele é ruim
Ele é horrível ."
(Fico devendo o nome do autor )
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor msamsoniuk » 19 Dez 2008 00:14

jeanfernandes escreveu:Caramba
250 Cases ?
hummmmmmmmm
:lol:


uma vez eu fiz um programa que precisava de 65536 cases... vi como o compilador fazia e usei a mesma ideia... como funcionou bem, fiz um com 2^32 cases... meio complexo, na verdade, mas quando preciso de 256 ou 65536 cases nao tem muito erro :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor jeanfernandes » 19 Dez 2008 00:20

Perae

Preciso de um exemplo pra me convencer
com 30 cases ja da
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x