Página 1 de 1

AJUDA ANSI C. POINTER KEIL

MensagemEnviado: 30 Abr 2010 20:40
por fabim
Pessoal.

Sempre usei "void *" quando não sabia se iria utilizar const ou variavel de ram, para jogar para a função.
Só que eu estou mexendo com uma bomba, que eu encontrei.

"char **dado"
Isto mesmo, doi "*". Ou seja, ponteiro do ponteiro.

Como se comporta isso ?

Re: AJUDA ANSI C. POINTER KEIL

MensagemEnviado: 30 Abr 2010 22:07
por tcpipchip
fabim escreveu:Pessoal.

Sempre usei "void *" quando não sabia se iria utilizar const ou variavel de ram, para jogar para a função.
Só que eu estou mexendo com uma bomba, que eu encontrei.

"char **dado"
Isto mesmo, doi "*". Ou seja, ponteiro do ponteiro.

Como se comporta isso ?


Imagine os vetores de INTERRUPÇÃO do x86, toda vez que um dispositivo requisita uma interrupção, manda para o processador do PC o seu código, este codigo multiplicado por 4* forma um endereço e o conteúdo deste endereço é um endereço para uma posição de memória para o tratador da interrupção.

Re: AJUDA ANSI C. POINTER KEIL

MensagemEnviado: 30 Abr 2010 22:22
por msamsoniuk
isso ae vc trata como um array de ponteiros...

tipo, onde vc le char **p, vc pode ler tb char *p[], daih jah sacou neh? para todo i, fazendo p[i] vc tem um ponteiro char *... eh um tipo de acesso muito mais veloz q listas encadeadas, pq no lugar de varrer a lista para achar o i-esimo elemento, vc simplesmente faz um lookup direto para p[i].

sei lah, pega um exemplo ae, quer receber 1000 strings e ir guardando meio que dinamicamente, mas nao sabe o tamanho de cada uma:

Código: Selecionar todos
char **p;
char buffer[1000]; // maximo de cada string

p = malloc(1000*sizeof(char *));

for(i=0;i!=1000;i++)
{
  gets(buffer);
  p[i] = malloc(strlen(buffer));
  strcpy(p[i],buffer);
}


a vantagem eh que vc tem na verdade dois arrays de 1000 elementos, um para o buffer e outro para a lista de ponteiros... cada string recebida, porem pode ter comprimento diferente. assim no lugar de armazenar 1000x1000 bytes, na verdade vc tem 2000 bytes + 1000*n, onde n eh o comprimento medio das strings recebidas.

ou entao, pensa num ring buffer com 32 entradas:

Código: Selecionar todos
char *p[32];

// init
for(i=0;i!=32;i++)
{
  p[i]=NULL;
}
...
// procura entrada livre e coloca pacote
for(i=0;i!=32;i++) if(p[i]==NULL)
{
  p[i]=frame;
}
...
// procura entrada e transmite
for(i=0;i!=32;i++)
  if(p[i])
  {
    send(p[i]);
    free(p[i]);
    p[i]=NULL;
  }
}


tem um outro lance sinistro que eh tries... vc usa algo como:

while(p[i]) p = p[i];

e vai varrendo uma arvore de lookups! eh algo como procurar o ponteiro do ponteiro do ponteiro ... do ponteiro.

fabim escreveu:Pessoal.

Sempre usei "void *" quando não sabia se iria utilizar const ou variavel de ram, para jogar para a função.
Só que eu estou mexendo com uma bomba, que eu encontrei.

"char **dado"
Isto mesmo, doi "*". Ou seja, ponteiro do ponteiro.

Como se comporta isso ?

MensagemEnviado: 30 Abr 2010 22:51
por styg
Realmente, ponteiro é uma coisa fascinante... adoro essas aulas do samsoniuk.

MensagemEnviado: 30 Abr 2010 23:45
por fabim
agora eu entendi o porque do (char **).
E agora as 23:41 do dia 30-04-2010.

depois de quase 1 mes, eu consegui fazer o LPC1768 controlar super perfeito o penisdrive!!!!!! yahoooooooooooooooooooooooo...

Fazem 15 dias que to fissurado nessa m****, e agora que eu entendi o jeitão das bagaças!!!!!!!!!

Ai putex, probrema risorvidiu !!!!

Adorei a biblioteca do: http://elm-chan.org/fsw/ff/00index_e.html
Muito muito bom!!!!!!! super legal!!!!!!!

Pena que o penisdrive no LPC, só funciona em 12Mbit e bulk de no maximo 4096 bytes.......
To imaginando porque no PC o negocio é absurdamente mais alto..

MensagemEnviado: 30 Abr 2010 23:52
por tcpipchip
fabim escreveu:
yahoooooooooooooooooooooooo...



googleeeeeeeeeeeeeeeeeeeeee...