PONTEIRO C.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor styg » 17 Out 2008 08:42

nota 10 a explicacao do samsoniuk.
:D
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor Djalma Toledo Rodrigues » 17 Out 2008 08:42

Cminerês e Pascminerês :D

E vem porque vem. Ô trem bom !
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 17 Out 2008 11:25

1° ponteiros risorvidos..

2° definições de tipos..
PASCAL.

type TBufferDescriptor =
record
Status: byte;
ByteCount: byte;
Address: word;
end;

var BufferDescriptor : TBufferDescriptor;

Ele esta dizendo o seguinte.
cria variavel BufferDescriptor
Byte 0 = Status
byte 1 = ByteCount
byte 2 = Address // aqui é uma word..INT. então é byte 2e3

Quero modificar o valor do byte 1"Bytecount".
BufferDescriptor.Bytecount := 22;

quero ler o valor de bytecount.

Meu_Byte := BufferDescriptor.Bytecount;

Como fica este tipo de estrutura no C.?

Especificamente utilizando as nomenclaturas que eu coloquei á cima ?

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 17 Out 2008 13:04

struct
{
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
}
TBufferDestriptor;

TBufferDescriptor.Bytecount = 22;
valor = TBufferDescriptor.Bytecount;

ok ? ;D

fabim escreveu:1° ponteiros risorvidos..

2° definições de tipos..
PASCAL.

type TBufferDescriptor =
record
Status: byte;
ByteCount: byte;
Address: word;
end;

var BufferDescriptor : TBufferDescriptor;

Ele esta dizendo o seguinte.
cria variavel BufferDescriptor
Byte 0 = Status
byte 1 = ByteCount
byte 2 = Address // aqui é uma word..INT. então é byte 2e3

Quero modificar o valor do byte 1"Bytecount".
BufferDescriptor.Bytecount := 22;

quero ler o valor de bytecount.

Meu_Byte := BufferDescriptor.Bytecount;

Como fica este tipo de estrutura no C.?

Especificamente utilizando as nomenclaturas que eu coloquei á cima ?

Fabim
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Sergio38br » 17 Out 2008 13:56

No mikroC short é o mesmo que char, troque na struct o tipo para unsigned int ou apenas int

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor fabim » 17 Out 2008 17:53

tchelo.
Observe que em pascal, é feita a definição depois de criar o tipo de varitavel.

1° eu crio a Tmeu_tipo_de_var..

Defino uma variavel como tipo Tmeu

Minha_var : Tmeu_tipo_de_var. <<

nesta criação de tipo de var em C.

struct {
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
} TBufferDestriptor;

Eu ja estou criando a variavel propriamente dito né ?
Ou seja não preciso fazer mensão de um nome para um tipo..

ficaria simplesmente assim.

struct {
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
} BufferDestriptor;

?

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 17 Out 2008 19:04

sim, jah criei direto...

mas em C vc pode criar uma definicao e entao alocar:

struct TBufferDestriptor_t {
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
};

struct TBufferDestriptor_t TBufferDestriptor;

a definicao eh aquele cara com _t a mais (podia ser qq nome tb) e o cara propriamente dito q aloca espaco eh o cara sem o _t :)

fabim escreveu:tchelo.
Observe que em pascal, é feita a definição depois de criar o tipo de varitavel.

1° eu crio a Tmeu_tipo_de_var..

Defino uma variavel como tipo Tmeu

Minha_var : Tmeu_tipo_de_var. <<

nesta criação de tipo de var em C.

struct {
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
} TBufferDestriptor;

Eu ja estou criando a variavel propriamente dito né ?
Ou seja não preciso fazer mensão de um nome para um tipo..

ficaria simplesmente assim.

struct {
unsigned char Status;
unsigned char Bytecount;
unsigned short Address;
} BufferDestriptor;

?

Fabim
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 18 Out 2008 17:36

1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch.

Se eu bem entendi no C.

switch (salario){
case minimo { a = "coitado"};
case menos_minimo{a = "putz_fudeu"};
case menos_menio_minimo{a = "so no brasil mesmo"};
}

Bem, a estrutura é simples,
"VAI PARA VALOR = A REFERIDO EM SALARIO"

pascal é

CASE salario OF
begin
minimo: a := "coitado";
menos_minimo: a := "putz f****";
menos_menio_minimo: a := "so no brasil mesmo";
end;

Mesmissima coisa, mudou só a forma da sintaxi..

agóra to com um pau aqui..

Código: Selecionar todos
   
    0x82: //Endpoint para Host
    begin

      Ep = SetUpPacket.wIndex and 0x8F;  // endpoint number <-- changed 11-10-2008

      case SetUpPacket.bRequest of
        USB_GET_STATUS:         //GetEndpointStatus; <-- contents changed 11-10-2008
        begin
          case Ep of
            USB_EP00_OUT : BuffEP0IN[0] = bit(BDEP0OUTStat and USB_BSTALL);
            USB_EP00_IN  : BuffEP0IN[0] = bit(BDEP0INStat  and USB_BSTALL);
            USB_EP01_OUT : BuffEP0IN[0] = bit(BDEP1OUTStat and USB_BSTALL);
            USB_EP01_IN  : BuffEP0IN[0] = bit(BDEP1INStat  and USB_BSTALL);
          end;
          BuffEP0IN[1] = 0;
          BDEP0INCnt   = 2;
          BDEP0INStat  = 0xC8; // data 1 packet, sets UOWN bit: go
      end;

        USB_SYNCH_FRAME:        begin end;
      end
    end

    else
    begin
      case (SetUpPacket.bmRequestType and 0x60) >> 5 of
        0:                            // Standard request
        1: ClassSpecificRequest;      // Class specific request
        2: begin  // no action end;   // CheckforVendorRequest;
      end;
    end;


Este fragmento, faz mensão da seguinte forma.

switch (X)
{
// se x estiver aqui dentro executa valor de X
}
else // se não
{
// executa o que estiver aqui dentro.
}

Pois bem, o que eu coloquei À cima é aceito pelo C ?

e esta certa a forma que eu raciocinei.?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 18 Out 2008 18:13

fabim escreveu:1° ponteiros, risorvidos..

2° definições de tipos, risorvidos..

3° função switch.

Se eu bem entendi no C.

switch (salario){
case minimo { a = "coitado"};
case menos_minimo{a = "putz_fudeu"};
case menos_menio_minimo{a = "so no brasil mesmo"};
}

Bem, a estrutura é simples,
"VAI PARA VALOR = A REFERIDO EM SALARIO"

pascal é

CASE salario OF
begin
minimo: a := "coitado";
menos_minimo: a := "putz f****";
menos_menio_minimo: a := "so no brasil mesmo";
end;

Mesmissima coisa, mudou só a forma da sintaxi..


opa! o switch do C nao eh bem assim nao... primeira coisa, switch tem a seguinte estrutura, para um valor v inteiro (int, char ou short):

switch(v)
{
case 0:
printf("v tem valor nulo\n");
break;
case 1:
printf("v tem valor um\n");
break;
default:
printf("v tem algum outro valor qq que nao interessa!\n");
break;
}

primeira observacao: como eu disse, v deve ser um inteiro (char, short ou int), pois nao eh possivel fazer um switch com estruturas de dados compostas, como strings, structs ou arrays, portanto:

switch(comando)
{
case "dir":
printf("isto nao funciona em linguagem C pq comando eh um array de bytes e o case nao avalia estruturas compostas de dados :)\n");
}

segunda observacao: o valor no case eh uma constante, portanto nao pode fazer condicoes, a nao ser que sejam condicoes constantes:

switch(salario)
{
case 100:
case 200:
case 300:
case 400:
printf("vc ganha merreca\n");
break;
case 500:
case 600:
case 700:
case 800:
printf("vc ganha merreca plus\n");
break;
default:
printf("nao sei realmente avaliar quanto vc ganha\n");
break;
}

ou seja, vc conseguiria deliminar valores de 100 a 400 reais em um case e de 500 a 800 em outro... mas e se o cara ganha 101 ? ele cai no default. entao se vc tem que fazer algo tipo salario > 800, tem q usar um if mesmo.

ou seja, switch eh bem restrito. de fato eh um dos blocos condicionais mais restritos. porem, switch eh muito bom para maquinas de estado:

int state = 0;

while(1)
{
switch(state)
{
case 0: // startup state
state = 1;
break;
case 1: // idle state
if(flag) // vai para o proximo estado apenas se flag = 1
state = 2;
break;
case 2:
blablabla
break
... // outros estados
default:
erro(); // estado nao previsto, deve ser algum erro!
break;
}
}

e se for usar, nunca esqueca q cada case termina com um break e sempre coloque o default, para cobrir cases nao previstos! :)

agóra to com um pau aqui..

Código: Selecionar todos
   
    0x82: //Endpoint para Host
    begin

      Ep = SetUpPacket.wIndex and 0x8F;  // endpoint number <-- changed 11-10-2008

      case SetUpPacket.bRequest of
        USB_GET_STATUS:         //GetEndpointStatus; <-- contents changed 11-10-2008
        begin
          case Ep of
            USB_EP00_OUT : BuffEP0IN[0] = bit(BDEP0OUTStat and USB_BSTALL);
            USB_EP00_IN  : BuffEP0IN[0] = bit(BDEP0INStat  and USB_BSTALL);
            USB_EP01_OUT : BuffEP0IN[0] = bit(BDEP1OUTStat and USB_BSTALL);
            USB_EP01_IN  : BuffEP0IN[0] = bit(BDEP1INStat  and USB_BSTALL);
          end;
          BuffEP0IN[1] = 0;
          BDEP0INCnt   = 2;
          BDEP0INStat  = 0xC8; // data 1 packet, sets UOWN bit: go
      end;

        USB_SYNCH_FRAME:        begin end;
      end
    end

    else
    begin
      case (SetUpPacket.bmRequestType and 0x60) >> 5 of
        0:                            // Standard request
        1: ClassSpecificRequest;      // Class specific request
        2: begin  // no action end;   // CheckforVendorRequest;
      end;
    end;


Este fragmento, faz mensão da seguinte forma.

switch (X)
{
// se x estiver aqui dentro executa valor de X
}
else // se não
{
// executa o que estiver aqui dentro.
}

Pois bem, o que eu coloquei À cima é aceito pelo C ?

e esta certa a forma que eu raciocinei.?


isso que vc escreveu do switch(X) eh um if... eu francamente nao lembro dessa notacao em pascal nao! mas faz uns anos q nao mexo com isso e posso ter esquecido, enfim 9 entre 10 linguagens usam else como complemento de um if... switch/case eh outro bicho diferente! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor styg » 18 Out 2008 18:17

fui dar um post repply, pra te ajudar..
mas na janela onde mostram os topicos recentes apareceu a resposta gigante do marcelo...
nem tem necessidade entao hehehe
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor fabim » 18 Out 2008 19:19

hum entendo...
Porque, tipo assim...

CASE VALOR PARA
begin

end;

Se valor esta dentro de begin.end; executa, se não passa batido..

agora na notação do pascal, que é um pouco mais maleavel em algumas coisa que C.

CASE VALOR PARA
begin
// se valor esta aqui dentro executa
end // observe que aqui não tem " ; "
else
begin
// independende do valor de valor executa o que tem aqui dentro
// pois não foi encontrado àcima.
end; /// ó agora tem " ; " eu fechei a estrutura de decisão...

então basicamente ...

switch (phase) {
case 0: Lo(); break;
case 1: Mid(); break;
case 2: Hi(); break;
default: Message("Invalid state!");
}
defalt é o else do pascal, ao invés de simplesmente passar batido, como não encontrou o valor de comparação, ele executa o que esta no defalt:

é isso mesmo ?

Bom, eu tenho amizade com um americano que desenvolveu uma liby universal USB hid e CDC em pascal.
Eu estou convertendo para C ANSI, sem utilização de liby dos compiladores, vai ter tudo que é necessario em apenas um fonte, e naa mais.

Por isto esse monte de pergunta.

FAbim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor msamsoniuk » 18 Out 2008 19:44

eh isso ae fabim :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 18 Out 2008 20:28

Vem que em C é..

Código: Selecionar todos

case   0x82: //é um case complementar de uma estrutura
     Ep = (SetUpPacket.wIndex & 0x8F);

      switch  (SetUpPacket.bRequest){

      case  USB_GET_STATUS: // com Ep1
      switch (Ep){
      case USB_EP00_OUT : BuffEP0IN[0] = bit(...._BSTALL);break;
      case USB_EP00_IN  : BuffEP0IN[0] = bit(..._BSTALL);break;
      case USB_EP01_OUT : BuffEP0IN[0] = bit(..._BSTALL);break;
      case USB_EP01_IN  : BuffEP0IN[0] = bit(..._BSTALL);break;
      }
      BuffEP0IN[1] = 0;
      BDEP0INCnt   = 2;
      BDEP0INStat  = 0xC8; // data 1 packet, sets UOWN bit: go
      break;

     case   USB_SYNCH_FRAME:       ; // comp Ep 2
     break;

    defalt: // não bateu com nada à cima então...
      switch  ((SetUpPacket.bmRequestType & 0x60) >> 5){
        0:                     ; break;         
        1: ClassSpecificRequest; break;       
        2:                     ; break;       
      }

    }
break;


ta certo isto ?

Fabim..

To preocupado, pois não sei se C ansi aceita um switch dentro da estrutura de outro..
Editado pela última vez por fabim em 18 Out 2008 20:44, em um total de 1 vez.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor chipselect » 18 Out 2008 20:31

se quiser enfeitar o código (alguns dizem que é pra deixar mais legível), dá pra fazer assim:

no arquivo header:
#define LOW 0
#define MEDIUM 1
#define HIGH 2

no código ficaria assim

switch (phase) {
case LOW: Lo(); break;
case MEDIUM: Mid(); break;
case HIGH: Hi(); break;
default: Message("Invalid state!");
}


também dá pra fazer assim:

typedef enum {LOW = 0, MEDIUM = 1, HIGH = 2} TPhase;


e no código ficaria praticamente igual, só que a flag phase seria declarada assim:

TPhase phase;

phase = LOW; //ou MEDIUM ou HIGH.

switch(phase)
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor msamsoniuk » 18 Out 2008 20:52

sim, dentro de um case de um switch vc pode colocar outro switch. mas cuidado, o break sai apenas do switch mais interno! :)

uma coisa que facilita eh vc usar a indentacao correta! usei o seguinte comando no seu codigo:

indent -kr teste.c

e ele gerou uma indentacao mais legivel, na minha opiniao:

Código: Selecionar todos
case 0x82:                      //é um case complementar de uma estrutura
Ep = (SetUpPacket.wIndex & 0x8F);

switch (SetUpPacket.bRequest) {

case USB_GET_STATUS:
    switch (Ep) {
    case USB_EP00_OUT:
        BuffEP0IN[0] = bit(BDEP0OUTStat & USB_BSTALL);
        break;
    case USB_EP00_IN:
        BuffEP0IN[0] = bit(BDEP0INStat & USB_BSTALL);
        break;
    case USB_EP01_OUT:
        BuffEP0IN[0] = bit(BDEP1OUTStat & USB_BSTALL);
        break;
    case USB_EP01_IN:
        BuffEP0IN[0] = bit(BDEP1INStat & USB_BSTALL);
        break;
    }
    BuffEP0IN[1] = 0;
    BDEP0INCnt = 2;
    BDEP0INStat = 0xC8;         // data 1 packet, sets UOWN bit: go
    break;

case USB_SYNCH_FRAME:;
    break;

  defalt:
    switch ((SetUpPacket.bmRequestType & 0x60) >> 5) {
    case 0:
        ClassSpecificRequest0();
        break;
    case 1:
        ClassSpecificRequest1();
        break;
    case 2:
        ClassSpecificRequest2();
        break;
    }

}

break;


no ultimo switch vc esqueceu o case antes das constantes :)

e sempre coloque um default no switch! se seu sistema de estados gerar um estado erroneo, o default facilita na hora de detectar o erro ;D
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x