PONTEIRO C.

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PONTEIRO C.

Mensagempor fabim » 16 Out 2008 13:47

Psoall, estou portando um codigo pascal para C, e a sintaxi de ponteiro de Pascal é bem diferente de C.

Será que alguém poderia me dar uma ajuda de como funciona e como tratar ponteiros em C ?

Brigaduuuu.

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!!!?

Re: PONTEIRO C.

Mensagempor amboni » 16 Out 2008 13:52

fabim escreveu:Psoall, estou portando um codigo pascal para C, e a sintaxi de ponteiro de Pascal é bem diferente de C.

Será que alguém poderia me dar uma ajuda de como funciona e como tratar ponteiros em C ?

Brigaduuuu.

Fabim



Fabim...

to me f&%*$# com isso... to começando agora...
me indicaram isso aqui óhh...

http://www.mtm.ufsc.br/~azeredo/cursoC/c.html


valeu
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor Sergio38br » 16 Out 2008 14:13

dem uma olhada neste link, uma explicação sobre ponteiros


http://br.geocities.com/cesarakg/pointers.html


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

Mensagempor ze » 16 Out 2008 14:31

sabe qual a dif de ponteiro e vetor? NEM EU...quando aprender vê se me explica pois até hoje num inteindo direito esta bossssstaaaaaa!! porveita e aprende os fiodumap**ta struct e union. só de falar o tico quase tem um tréco. uhhhhhhhhhggh!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor xultz » 16 Out 2008 15:29

Ponteiro é aquele treco usado em computador. Vetor é aquela coisa que só existe na física, no mundo real ninguém nunca viu um vetor.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor Jorge_Francisco » 16 Out 2008 16:13

Editado
Editado pela última vez por Jorge_Francisco em 17 Out 2008 16:29, em um total de 1 vez.
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor joao » 16 Out 2008 17:29

Fabim,

A algumas eras atrás, eu escrevi um pouco sobre ponteiros nesse link aqui:
http://asm51.eng.br/phpBB/viewtopic.php ... o&start=15

Quem sabe te ajude a entender um pouco mais as diferenças do BASIC para o C em relaçào a ponteiros. :)

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Jorge_Francisco » 16 Out 2008 18:12

Escrevi aqui:

http://asm51.eng.br/phpBB/viewtopic.php?t=6077

Dá uma olhada no site que está no post.

Vlw
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor styg » 16 Out 2008 21:16

bota a tua duvida mais especificamente, como um exemplo, dai é facil dar uma ajuda
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 » 16 Out 2008 21:24

Ponteiro é o endereço da memória.

Ele aponta para um endereço.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 16 Out 2008 22:59

styg escreveu:bota a tua duvida mais especificamente, como um exemplo, dai é facil dar uma ajuda


Try..

Código: Selecionar todos
function USB_HID_Read(DstPtr: ^byte; MaxLen: byte): boolean;
// returns true if data has arrived
var ByteCount, I: byte
    SrcPtr : ^Byte; <<<<<<<<<<<<<< pointer
begin
  Result := BDEP1OUTStat.UOWN = 0;
 
  if Result then  // PIC owns the buffer
  begin

    ByteCount := BDEP1OUTCnt;   // get bytecount of EP1 out buffer
    if ByteCount > MaxLen then ByteCount := MaxLen;
   
    if ByteCount > 0 then       // non empty
    begin
      SrcPtr := BDEP1OUTAdr;    // Source data pointer
     
      for I := 0 to (ByteCount - 1) do
      begin
        DstPtr^ := SrcPtr^;      // copy EP1 buffer to destination
        inc(SrcPtr); << forma de tratar em pascal o valor
        inc(DstPtr);
      end;
    end;


fomo ficaria isto aí em C ?

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 01:29

sempre que me perguntam a diferenca entre ponteiro e vetor eu respondo que quem usa vetor eh indio! eh obvio, aquelas letrinhas com flexinhas em cima parecem pequenos seres sob ataque de apaches! hehehe :)

enfim, se vc olhar a documentacao oficial de macho da linguagem C (o K&R, claro) vc encontra *duas* miseras referencias a palavra vector, contra centenas ou talvez milhares de referencias a palavra array. eu francamente nunca achei uma boa traducao para array, mas certamente vetor nao eh! de fato, vetor eh outra coisa completamente diferente e mais adiante posso comentar algo.

voltando aos ponteiros e arrays, existe um capitulo inteiro sobre isso no K&R, onde vc descobre que eles sao notacoes complementares para a mesma coisa!

uma forma simples de entender a diferenca entre eles e como eles podem funcionar juntos eh imaginar que a memoria sram e flash de um processador sao arrays de bytes e os registros internos do processador como o stack pointer e o program counter sao ponteiros que apontam para areas dentro dos arrays de bytes. algo que poderia ser escrito em C como:

char flash[1024];
char sram[1024];
char *pc;
char *sp;

obviamente, o program counter deveria apontar para instrucoes na flash e o sp para o topo da sram, algo que poderia ser escrito como:

pc = &flash[0];
sp = &sram[1023];

onde o & eh para pegar o endereco de determinado elemento de dados na memoria... ou simplesmente podia escrever:

pc = flash;
sp = sram+1023;

que tambem funciona. pela primeira igualdade vc conclui facil: se pc = flash e pc eh um ponteiro, entao flash tambem eh um ponteiro! de fato flash e sram sao ponteiros constantes, que sempre apontam para o inicio dos respectivos arrays de bytes. entao sim, labels de arrays sao ponteiros e vc pode usar eles como tal, por exemplo:

*flash = 0;

coloca o valor zero no primeiro elemento do array, usando notacao de ponteiro, de forma identica a:

*pc = 0;

a diferenca eh que vc pode incrementar pc para ir para o proximo endereco, mas nao flash, portanto:

*pc = 0;
pc++;
*pc = 0;

coloca zero nas duas primeiras posicoes do array. os ponteiros constantes flash e sram nao permitem aquele incremento, pq na verdade eles sao virtuais! como eles sao constantes, sao resolvidos apenas em tempo de compilacao, nunca em tempo de execucao, assim:

*flash = 0;
flash++;
*flash = 0;

nao eh uma notacao valida para um ponteiro base de array. vc teria que usar ele como se usa um array, ou seja:

int i=0;

flash[i] = 0;
i++;
flash[i] = 0;

sendo o subscritor do array resolvivel em tempo de execucao. agora a coisa bacana: se um array possui um ponteiro base cuja unica limitacao eh ser constante, sera possivel criar arrays com ponteiro base nao constante ? perfeitamente:

int i=0;

pc[i]=0;
i++;
pc[i]=0;

ou

int i=0;

pc[i]=0;
pc++;
pc[i]=0;

em ambos os casos vc grava 0 nos dois primeiros bytes do array. o interessante eh que o ponteiro base do array nesse caso nao eh constante! em tempo as duas seguintes notacoes sao intercambiaveis:

pc[i] = 0

eh o mesmo que:

*(pc+i) = 0;

que eh o mesmo que:

*(i+pc) = 0;

e que resulta na seguinte expressao perfeitamente identica e valida:

i[pc]=0;

onde i eh um inteiro que chamamos de indice. enfim, ponteiros e arrays sao quase a mesma coisa, com a diferenca fundamental que arrays alocam espacos na memoria e seus ponteiros base sao constantes resolviveis apenas em tempo de compilacao. ponteiros sao variaveis que podem apontar para qq lugar em tempo de execucao e podem operar tanto como ponteiros quanto arrays.

com o tempo vc acostuma com isso e comeca a fazer doideiras tipo:

strcpy(char *d,char *s)
{
int i;
for(i=0;d[i]=s[i];i++);
return i;
}

neste caso, pegamos dois ponteiros e simplesmente usamos notacao de array em cima deles. muita gente questiona que arrays e ponteiros nao sao a mesma coisa pq o codigo gerado eh diferente. isso eh obvio se pensar que o enderecamento de arrays pode ser resolvido em parte em tempo de compilacao e otimizado, enquanto que enderecamento de ponteiros soh pode ser integralmente resolvido em tempo de execucao.

mas o exemplo ilustra bem que possuem notacao perfeitamente intercambiavel... bom, espero que o exemplo inicial seja bem claro sobre a diferenca que realmente existe... e em C eh aquele lance: se nao tem regra falando que nao pode, eh pq pode tudo! :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor fabim » 17 Out 2008 07:47

unsigned char valor;
unsigned char *ponteiro;
unsigned char dados[10] = {0,1,2,3,4,5,6,7,8,9};

ponteiro = &dados;
//Aqui o ponteiro indica o valor 0 da array, ou seja o endereço do valor 0 da var dados, que foi inicializado com valores de 0...9;

valor = *ponteiro;
//aqui a variavel valor assumiu o valor 0, que o ponteiro estava apontando para o endereço 0 do array dados;

ponteiro++;
//agora o ponteiro esta apontando para o edereço 0+1 do array dados.

valor = *ponteiro;
// aqui a variavel valor assumiu o valor 1, que o ponteiro estava apontando para o endereço 0+1 do array dados;

É isso mesmo ????
SE for é a mesma coisa do pascal, só mudou o "*" por "^"
*************************************************************
hahahaha, testei aqui.
Vou explicar melhor...

o ponteiro deve ser criado de tal forma que o valor maximo do tipo de variavel possa caber o endereço de outra.

EX. você tem 1024 bytes de ram.
este valor cabe numa variavel maior que char.. no caso uma int..
isso é so pra entender...

agora vamos a pratica.

unsigned char dados[10] = {0,1,2,3,4,5,6,7,8,9};
unsigned char *ponteiro; // disse para o compilador, que esta variavel, vai ter endereço e valor variaveis.
unsigned char resu;

ponteiro = &dados;
//ponteiro diz para compila!
// aê compila, saca só!! meu endereço para acesso a dados, agóra é o byte 0 daquela variavel dados, sacô mano!!

resu = *ponteiro;
// aê compila, pega o valor que esta no byte 0 da var dados, e joga dentro desse zé mané chamado resu;

ponteiro++;
// saca só compila, agóra meu endereço é byte 1 da var dados

resu = *ponteiro;
// zé *u, pega o valor que esta no byte 1 da var dados, e joga dentro do zé ruela chamado resú..


É a mesmissima porcaria do PASCAL, só muda * por ^... rs




fabim
Editado pela última vez por fabim em 17 Out 2008 08:11, 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 joao » 17 Out 2008 08:09

Eu acho que vc fez certo sim...

A única coisa é que vc está usando char e está passando 0,1,2,3,4,5,6,7,8,9
Acho que vc quis dizer: '0','1','2','3'...

Sobre o código que vc passou de exemplo, o que quer dizer:
BDEP1OUTStat
?

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor fabim » 17 Out 2008 08:14

intão dião,,,
como no C não existe var tipo : byte,,,,
o char pode ser qualquer valor de 0 a 255...

rs

PASCAL.
dados : array [0..9] of byte
dados1 : array[0..9] of char

dados[0] := 'a';
dados[0] := 123;

dados1[0] := 'a';
dados1[0] := 123;

mesma coisa. :)
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!!!?

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x