Página 1 de 2

LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 16:13
por Guri
Me ajudem! :roll:

Eu preciso fazer isso:

unsigned int BUFFER
unsigned int TEMP

if(BUFFER>=100) {TEMP=BUFFER-100}

A minha dúvida é: COMO EU FAÇO ISSO UTILIZANDO "SWITCH". É que na rotina que estou trabalhando, eu não posso utilizar IFs...

Como eu sou novato, ainda não consegui desdobrar o raciocinio sobre como fazer isso 8)

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 19:07
por eliveltonpsantos
Pesquise por "c switch case greater than" que você encontrará umas ideias.

Vi algumas interessantes, mas não testei.

Código: Selecionar todos
#include <limits.h>
...

switch(a)
{
case 1000 ... INT_MAX: // note: cannot omit the space between 1000 and ...
    printf("hugely positive");
   break;
case 100 ... 999:
    printf("very positive");
   break;
...
}


Código: Selecionar todos
#include <iostream>
 
using namespace std; //introduces namespace std
 
int main ( void )
{
   int x=5, y=8;
     
   switch(x > y ? true : false) // or 1 : 0
   {
      case true:  cout << x
                       << " is greater than "
                       << y;
           
                       break;
         
      case false: cout << y
                       << " is greater than "
                       << x;
           
                       break;
   };   
     
   return 0;
}

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 19:34
por Guri
Obrigado pela dica.

Vou testar, e aviso os resultados...

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 20:23
por pamv
Eu temo em perguntar, mas por que você não pode usar if() e apenas switch? A switch é uma cadeia de if then else if, você está editando algum fonte pronto pra enfiar essa condição?

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 20:40
por Guri
Então palm,


O caso é o seguinte, eu estou avançando nos trabalhos com nosso synth e agora estarei utilizando a captação de sinais wavetable de uma memória externa, isso por causa do tamanho, não tendo nada a ver, apenas como fonte de informação.

Eu preciso identificar o ponto de looping da amostragem e para isso teria que fazer a comparação, para saber se houve a chegada do endereço desejado, isso poderia ser feito com o "if and else", porém existe um problema em utilizar IF.

Quando uso IF, aparece um "chiado" no audio, isso ocorre com a introdução do IF, e veio a confirmar a dica do meu amigo PROEX que já tinha me alertado sobre o fato.

Por isso estou querendo usar o switch, :roll:

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 20:41
por Guri
Se bem que o chiado só aparece em frequencias mais altas, acima de 5khz...mas como não quero deixar o projeto com arestas, é melhor resolver o incoveniente... :D

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 13 Jul 2019 21:55
por pamv
Mudando a otimização não muda esse comportamento?

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 14 Jul 2019 00:38
por andre_luis
Código: Selecionar todos
if(BUFFER>=100) {TEMP=BUFFER-100}

A minha dúvida é: COMO EU FAÇO ISSO UTILIZANDO "SWITCH".


Se voce considerar aceitavel escrever noventa e nove linhas com case, pode implementar dessa maneira:

cpp code
switch(BUFFER)
{
case 0:
case 1:
...
case 99:
// nao faz nada ate aqui (voce nao mencionou o 'else')
break;

case default:
TEMP=BUFFER-100; // os casos onde BUFFER ≥ 100
break;
}

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 14 Jul 2019 20:03
por pamv
Eu peguei um exemplo de código usando switch (3 níveis mais default) e converti para if else.

Em seguida eu compilei ambos em um ARM rodando armbian com

Código: Selecionar todos
gcc -S -O3


e comparei os tamanhos dos dois códigos

Código: Selecionar todos
$ ls -l *.s
-rw-rw-r-- 1 pamv pamv 570 Jul 14 20:02 if.s
-rw-rw-r-- 1 pamv pamv 574 Jul 14 20:02 switch.s


os 4 bytes de diferença correspondem à diferença de nome dos arquivos em C:

Código: Selecionar todos
$ diff if.s switch.s
2c2
<       .file   "if.c"
---
>       .file   "switch.c"


o resto do código compilado é idêntico como eu esperava:

Código: Selecionar todos
$ cat switch.s
        .arch armv8-a
        .file   "switch.c"
        .text
        .section        .text.startup,"ax",@progbits
        .align  2
        .p2align 3,,7
        .global main
        .type   main, %function
main:
        stp     x29, x30, [sp, -16]!
        adrp    x0, .LC3
        add     x0, x0, :lo12:.LC3
        add     x29, sp, 0
        bl      puts
        mov     w0, 0
        ldp     x29, x30, [sp], 16
        ret
        .size   main, .-main
        .section        .rodata.str1.8,"aMS",@progbits,1
        .align  3
.LC0:
        .string "Case1:"
        .zero   1
.LC1:
        .string "Case2:"
        .zero   1
.LC2:
        .string "Case3:"
        .zero   1
.LC3:
        .string "Default:"
        .ident  "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0"
        .section        .note.GNU-stack,"",@progbits


a minha dúvida é: Por que o compilador do Guri gera códigos diferentes entre if e switch ?

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 14 Jul 2019 20:12
por andre_luis
a minha dúvida é: Por que o compilador do Guri gera códigos diferentes entre if e switch ?


Li nao sei aonde que certos compiladores dependendo do tamanho da lista de If-then-else e da otimizacao, pode implementar o switch-case com uma tabela look-up, o que faria bastante sentido já que os valores do case tem de ser constantes.

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 14 Jul 2019 21:16
por Guri
:cry:
Vixxi, agora que a cabeça do veio vonnilmam ficou bagunçada.

Eu uso "ainda" o mikroc, ele é bom, apesar de eu não utilizar as libs nativas dele, pois prefiro criar a libs para cada aplicação, pois já peguei erros quando essas libs de exemplos, rodam em conjunto com rotinas mais complexas.
De qualquer forma nada melhor que criar as suas próprias libs.

Realmente, o amigo PROEX, mencionou sobre esse detalhe e até confesso que não dei muita bola. Até eu precisar usar a comparação para identificar a posição do ponteiro na tabela de onda. Se eu boar if o fica com chiado, derrepente estou cometendo alguma gafe!...

Vou estudar mais o fenômeno e ver se eu não estou errando em algum ponto.

Obrigado pelas dicas,

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 14 Jul 2019 22:02
por pamv
aluis-rcastro escreveu:
Li nao sei aonde que certos compiladores dependendo do tamanho da lista de If-then-else e da otimizacao, pode implementar o switch-case com uma tabela look-up, o que faria bastante sentido já que os valores do case tem de ser constantes.


A tabela seria mais rápida mas parece que o problema dele é um if de uma linha apenas sendo substituído por um switch, então parece que o que ele precisa é enfiar um delay entre o if e a ação, mudar, por exemplo de

Código: Selecionar todos
if(BUFFER>=100)
  TEMP=BUFFER-100;


para

Código: Selecionar todos
if(BUFFER>=100) {
  TEMP=BUFFER-100;
  delay(10);            // ou alguma outra forma de atrasar a execução do if
  }

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 15 Jul 2019 17:15
por Budweiser
Guri escreveu::cry:
Vixxi, agora que a cabeça do veio vonnilmam ficou bagunçada.

Eu uso "ainda" o mikroc, ele é bom, apesar de eu não utilizar as libs nativas dele, pois prefiro criar a libs para cada aplicação, pois já peguei erros quando essas libs de exemplos, rodam em conjunto com rotinas mais complexas.
De qualquer forma nada melhor que criar as suas próprias libs.

Realmente, o amigo PROEX, mencionou sobre esse detalhe e até confesso que não dei muita bola. Até eu precisar usar a comparação para identificar a posição do ponteiro na tabela de onda. Se eu boar if o fica com chiado, derrepente estou cometendo alguma gafe!...

Vou estudar mais o fenômeno e ver se eu não estou errando em algum ponto.

Obrigado pelas dicas,


Eu preciso perguntar... Se você usa o MikroC sem as suas libs... Já cogitou usar o MPLAB?
Teve coisas que eu só consegui resolver depois que voltei ao MPLAB ...

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 15 Jul 2019 19:34
por Red Neck Guy
Guri, pra analisar e poder opinar é preciso ter o código todo e algumas formas de onda.
Senão é chute.
Manipulando diretamente os registradores deve funcionar se o problema for overhead de biblioteca.
Mas chuto que o problema deve ser muito além do IF, talvez um tempo crítico entre as interrupções ou algo assim.

Re: LOGICA com IFs e SWITCH

MensagemEnviado: 15 Jul 2019 19:58
por pamv
Aquino

Eu acho que é tão complexo quanto usar um osciloscópio para caracterizar de forma definitiva o "defeito" que o IF produz e tão simples quanto o Guri comparar o código gerado pelo mikroC para o IF e para o switch e como isso impacta o reset do buffer. Eu começaria pelo mais simples, olharia o código gerado pelo compilador para ver se tem alguma diferença de fato entre o código produzido pelo if o produzido pelo switch.