matriz de dados

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Maurício » 21 Ago 2008 17:53

dcardoso escreveu:Galera, não entendo teoricamente isso deveria enviar a string lista para serial, mas não recebo nada.
Algum help


void main(void)
{
char *lista;

lista = "i25632";
printf("%s", lista);
}


Salve, parente! E não me chame de "galera" que eu odeio, ehehehehehehe

Experimenta isso daqui:

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

void main(void)
{
char lista[20]; // se vc não inicializa, esse valor é pra conter o seu vetor.

strcpy ( lista, "i25632" );
printf("%s", lista);
}


Funções prontas. Como eu tinha dito antes.

[]'s
Editado pela última vez por Maurício em 21 Ago 2008 18:00, em um total de 1 vez.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Maurício » 21 Ago 2008 17:59

andre_teprom escreveu:Maurício,

Como disse antes, quando se trabalha com ponteiros, voce pode não mudar o valor do vetor, mas o "endereço" desse vetor. E dessa maneira, isso torna possível essa transferencia de dados sim.

Fazendo uma analogia, isso é o que acontece no Windows quando voce MOVE ou COPIA um diretório de 500MB. Se voce COPIA, leva alguns minutos para isso. Se voce MOVE, leva apenas alguns segundos.


Salve, Andre. Belessa?

Quando vc usa ponteiros, no caso de um vetor, vc está INDEXANDO o próximo ELEMENTO do vetor, através do endereço de memória que aquele elemento possui.
Não existe VETOR na memória. O que existe de fato, são endereços de memória.

Quando vc faz:

Código: Selecionar todos
ponteiro++;


É a mesma coisa que fazer:

Código: Selecionar todos
matriz [indice + 1];


Quer dizer, elemento por elemento.

E não dá pra comparar PC com MCU, né, dom! Além do clock, PC tem DMA. Esqueceu? ehehehehehe
E outra! Quando vc MOVE um arquivo em um PC, se ele estiver no mesmo disco, a única coisa que o SO faz, é mudar os endereços de entrada e saída na FAT. Na realidade, o arquivo continua no mesmo lugar que estava antes. Experimenta mover um arquivo de um disco pro outro pra ver o que acontece. MOVER. Não COPIAR.

Não tem jeito, cara! Em C, um vetor é igualado elemento por elemento. Mesmo, por ponteiros. Não existe outra maneira.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor joao » 22 Ago 2008 06:58

Olha,

Eu to relendo toda as respostas pelo menos umas 3 vezes e ainda não consegui entender qual é o real problema.

O que vc tem e para aonde vc precisa jogar tal valor?

Vc tem 8 variaveis separadas e quer junta-las em apenas 1 variavel?
é isso?

O meu exemplo anterior só estava mostrando que se vc tem uma 1 variavel e precisa jogar TOODOS os valores dessa variavel para outra variavel, é possível através de ponteiros. Mas elas terão a mesma posição de memória.

Quanto ao problema de envio da serial:
Código: Selecionar todos
void main(void)
{
char *lista;

lista = "i25632";
printf("%s", lista);
}


O seu problema é que vc está tentando endereçar o primeiro endereço de "i25632" para lista, mas esse ponteiro é temporário. Por isso que se usa o que o andre falou:
strcpy(lista,"i25632");

Que dai ele vai copiar cada um dos elementos para outra área de memória que nao seja temporária e fazer com que a variavel lista aponte para a primeira posicao dessa string.

Caso vc faça isso:
Código: Selecionar todos
void main(void)
{
char *lista;
char * lista2;

strcpy(lista,"i25632");
lista2 = lista;
printf("%s", lista2);
}


Vai funcionar porque a posicao de memoria de lista nao é temporária, dai lista2 vai receber a posicao de memoria de lista e vai ter os mesmos elementos e vai conseguir imprimir;


Mas resumindo, explica o que vc tem, para o que vc precisa escrever que fica mais claro o que é necessário a se fazer. Existe a possibilidade de se fazer uma macro que receba esses valores e faça o que vc quer, mas tenho que ver bem certinho o que vc precisa fazer. OBS: Essa macro vai criar uma variavel temporaria da maneira que ele quer e dai retornar a posicao dessa variavel que foi criada. Nao me venham jogar pedras! :)

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

Mensagempor andre_luis » 22 Ago 2008 07:56

Maurício escreveu:...Quando vc MOVE um arquivo em um PC, se ele estiver no mesmo disco, a única coisa que o SO faz, é mudar os endereços de entrada e saída na FAT...


Então Maurício !!!!

Voce captou exatamente o que eu quiz dizer.
Como mencionado antes, foi uma analogia, mas nesse caso, o ponteiro para o arquivo - analogicamente - é representado pela tabela da FAT.

Ao fazer isso, voce não precisou mover elemento-por-elemento.

A mesma coisa acontece com ponteiros. Voce pode mudar todo o conteúdo de uma variável, só que desta vez estaremos trabalhando não com o conteúdo da variável, mas sim com o endereço dela.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor dcardoso » 22 Ago 2008 08:47

Obrigado a todos pelas respostas acredito que agora tenho boas informações para fazer o programação do que preciso.

Bom, o que relamente quero e preparar um pacote de dados e transmitir via rede CAN.

O que eu queria no caso, é enviar um pacote de dados.
O campo de dados deste protocolo é de 64 bits, então imaginei que.
se eu declarar uma variável com 8 posições, eu irei atribuir valores para ela e irei enviar.
Por isso das minhas perguntas de como repassar valores direto para essa variável.

void main(void)
{
char *lista;
char * lista2;

strcpy(lista,"i25632");
lista2 = lista;
printf("%s", lista2);
}

acredito que este código irá me ajudar.

outro detalhe é que a recepção é feita por


can_getd(int32 & id, int * data, int & len, struct rx_stat & stat);

mais especificamente pela instrução "* data", tratada no segundo elemento da função.

a transmissão utiliza-se da instrução

can_putd(int32 id, int * data, int len, int priority, int1 ext, int1 rtr);

por isso que queria a passagem de parametros para função
dcardoso
Bit
 
Mensagens: 21
Registrado em: 28 Jul 2008 15:08

Mensagempor dcardoso » 22 Ago 2008 08:48

opa, corrigindo passagem de parametro para a variável
[]ços
dcardoso
Bit
 
Mensagens: 21
Registrado em: 28 Jul 2008 15:08

Mensagempor Maurício » 22 Ago 2008 11:11

Salve, Andre!

andre_teprom escreveu:...Ao fazer isso, voce não precisou mover elemento-por-elemento....

A mesma coisa acontece com ponteiros. Voce pode mudar todo o conteúdo de uma variável, só que desta vez estaremos trabalhando não com o conteúdo da variável, mas sim com o endereço dela.


Não dá pra comparar MCUs com sistemas que possuem SO.
Na realidade, na operação acima, o arquivo não saiu do lugar. O SO não fez, absolutamente, nenhuma operação em cima desse arquivo.
Nesse caso, a única coisa que o SO faz, é trocar o dono do arquivo.
Se os ponteiros de início/final desse arquivo, na FAT, antes pertenciam ao DONO X, mover o arquivo de um lugar pro outro, significa dizer que agora, quem é dono dos ponteiros desse arquivo, é o DONO Y.

Todos os dados do arquivo ficaram no mesmo lugar exatamente.

O que a gente tá discutindo aqui, é atribuição e cópia de uma variável VETOR, pra outra variável VETOR.

Nesse caso, não é possível, em C, fazer atribuição automática. A não ser que vc use structs.

Dá uma olhada nos exemplos, e compila aí, pra vc ver o resultado.

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

void main(void)
{
   char lista [ ] = "DADO STRING";
   char * lista2;

   lista2 = lista;
   printf("%s\n", lista2);

   while ( 1 );
}

CÓDIGO 1


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

void main(void)
{
   char lista [ ] = "DADO STRING";
   char lista2 [ 32 ];

   lista2 = lista;
   printf("%s\n", lista2);

   while ( 1 );
}

CÓDIGO 2


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

void main(void)
{
   struct estrutura
   {
      char lista [ 20 ];
   }dado1, dado2;

   strcpy ( dado1.lista, "DADO STRING" );   
   dado2 = dado1;
   printf("%s\n", dado2.lista);

   while ( 1 );
}

CÓDIGO 3


Os exemplos de CODIGO 1 e 3 funcionam. CÓDIGO 2 não funciona.

Veja aí.

[]'s
Editado pela última vez por Maurício em 22 Ago 2008 11:53, em um total de 3 vezes.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Maurício » 22 Ago 2008 11:15

dcardoso escreveu:void main(void)
{
char *lista;
char * lista2;

strcpy(lista,"i25632");
lista2 = lista;
printf("%s", lista2);
}

acredito que este código irá me ajudar...


Salve, dcardoso!

Não! Ele não irá te ajudar porque ele não irá funcionar!
Vc está criando ponteiros para um tipo de dado CHAR, e não para uma STRING. Ou seja, seu ponteiro vai apontar para um BYTE na memória, e não para uma string, uma vez que vc não alocou espaço para uma string.

Rode o seu código e vc irá entender o que eu estou falando.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor joao » 22 Ago 2008 12:08

Mauricio,

Concordo com vc que não irá funcionar porque eu esqueci desta linha aqui:

Código: Selecionar todos
void main(void)
{
char *lista;
char * lista2;

linha = (char *) malloc(7*(char)); //Criando memória para ser gravada.
strcpy(lista,"i25632");
lista2 = lista;
printf("%s", lista2);
}


Mas até onde eu me lembro, em C não existe STRING. STRING em C é um char* que tem como ultima dado um '\0', que significa fim da string.
Por sinal, todos os exemplos que vc usou são char * e não STRING.
Apenas em C++, com o uso de STL é que temos STRING e isso não vem ao caso já que nós estamos falando de microprocessadores que não usam STL.

por sinal, o printf, até onde eu sei, vai ver que vc passou um parametro do tipo %s, logo, ele vai ler de BYTE em BYTE e enviar, até achar um '\0'.

Se quiser ver como isso pode dar problema, ainda mais em microcontrolador que não tem controle de memória, simplesmente faça isso:

Código: Selecionar todos
void main(void)
{
char *lista;
char * lista2;

linha = (char *) malloc(7*(char)); //Criando memória para ser gravada.
strcpy(lista,"i25632");
lista2 = lista;
lista2[7] = 'X';  //posi 7 porque temos 7 elementos, eu tirei o '\0'.
printf("%s", lista2); //Vai ficar imprimindo até achar um '\0'ou estorar a memória, como não tem '\0', vai estourar a memória.
}


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

Mensagempor Maurício » 22 Ago 2008 12:39

joao escreveu:Mauricio,

Concordo com vc que não irá funcionar porque eu esqueci desta linha aqui:

Código: Selecionar todos
void main(void)
{
char *lista;
char * lista2;

linha = (char *) malloc(7*(char)); //Criando memória para ser gravada.
strcpy(lista,"i25632");
lista2 = lista;
printf("%s", lista2);
}


Salve, João.

Alocação dinâmica é diferente de declarar a dimensão de um vetor...
Na alocação dinâmica, o compilador aloca espaço dinamicamente, baseado nas informações que vc passa pra ele. Em tempo de execução. SE houver memória disponível.

Mas até onde eu me lembro, em C não existe STRING. STRING em C é um char* que tem como ultima dado um '\0', que significa fim da string.


Aqui é que está o problema. De definição.
Exato. Não existe o tipo de dados STRING, em C.
E uma string, não é um ponteiro de um char. Uma string, é um VETOR de BYTES (uma matriz de caracteres - do tipo CHAR - BYTE).

Por sinal, todos os exemplos que vc usou são char * e não STRING.


Não. São todas STRING.
Quando a dimensão não é declarada, o compilador aloca o espaço, calculando pelo tamanho da string na inicialização. E o tamanho desse vetor, vai ser em função dessa atribuição e não vai poder mudar de tamanho mais, durante o programa.
Veja. O que eu criei não foi uma string, foi um vetor de bytes sem dimensão, que faz o compilador reservar 12 bytes, pra poder conter a frase quando eu inicializei a variável. Durante o programa, o vetor LISTA, é um vetor de bytes com comprimento 12. Atribuir uma string maior que o tamanho do vetor, durante o programa, vai causar problemas.

Só é uma string, pelo fato do texto da inicialização estar entre aspas.
Nesse caso, o compilador SABE que esse texto se refere à uma string. Por causa das aspas!
E só assim!

Código: Selecionar todos
char lista [ ] = "DADO STRING";


[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor andre_luis » 22 Ago 2008 14:36

Então pessoALL,

Pelo visto, todos concordamos com a solução do problema.
Estamos discordando agora, não da solução, mas do enunciado !!!
:D

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Anterior

Voltar para PIC

Quem está online

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

x