Página 1 de 2

Limite do case no Switch

MensagemEnviado: 21 Nov 2008 14:28
por buiz
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.

MensagemEnviado: 21 Nov 2008 15:51
por chrdcv
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

MensagemEnviado: 21 Nov 2008 16:50
por Djalma Toledo Rodrigues
129 = 81 H = 1000 0001 bin.
o sistema vê o 1 mais significativo como sinal negativo.

MensagemEnviado: 22 Nov 2008 08:48
por buiz
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.

MensagemEnviado: 22 Nov 2008 18:59
por helton
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...

MensagemEnviado: 22 Nov 2008 20:20
por msamsoniuk
para tantos casos possiveis nao seria mais interessante usar uma lookup table ? para tantos casos assim acho que fica mais eficiente.

MensagemEnviado: 23 Nov 2008 01:51
por barboza
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.

Re: Limite do case no Switch

MensagemEnviado: 23 Nov 2008 11:58
por Djalma Toledo Rodrigues
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í

MensagemEnviado: 24 Nov 2008 11:26
por guest2003
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

MensagemEnviado: 17 Dez 2008 09:31
por Guilherme_ELT
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.

MensagemEnviado: 17 Dez 2008 10:22
por andre_luis
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.

+++

MensagemEnviado: 18 Dez 2008 21:06
por jeanfernandes
Caramba
250 Cases ?
hummmmmmmmm
:lol:

MensagemEnviado: 18 Dez 2008 22:29
por Djalma Toledo Rodrigues
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 )

MensagemEnviado: 19 Dez 2008 00:14
por msamsoniuk
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 :)

MensagemEnviado: 19 Dez 2008 00:20
por jeanfernandes
Perae

Preciso de um exemplo pra me convencer
com 30 cases ja da