Página 1 de 2
Limite do case no Switch

Enviado:
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.

Enviado:
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

Enviado:
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.

Enviado:
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.

Enviado:
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...

Enviado:
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.

Enviado:
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

Enviado:
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í

Enviado:
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

Enviado:
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.

Enviado:
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.
+++

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


Enviado:
18 Dez 2008 22:29
por Djalma Toledo Rodrigues
jeanfernandes escreveu:Caramba
250 Cases ?
hummmmmmmmm

"Quando um programador é bom
Ele é muito, muito bom mas,
Quando ele é ruim
Ele é horrível ."
(Fico devendo o nome do autor )

Enviado:
19 Dez 2008 00:14
por msamsoniuk
jeanfernandes escreveu:Caramba
250 Cases ?
hummmmmmmmm

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


Enviado:
19 Dez 2008 00:20
por jeanfernandes
Perae
Preciso de um exemplo pra me convencer
com 30 cases ja da