strchr localizar virgula e copiar o restante

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

strchr localizar virgula e copiar o restante

Mensagempor cristian » 12 Fev 2010 13:48

simplesmente nao consigo fazer isso no mikroc sao 3horas perdidas

no ccs ...simples assim como a OI
Código: Selecionar todos
   arg1 = strchr( gpsread, ',' ) ; //Acha a vírgula.
   *(arg1)='\0' ; // Separa as strings.
   arg1++; // Aponta para o primeiro caractere.


PRONTO JA TENHO NO ARG1 TUDO Q TEM DEPOIS DA VIRGULA ATE O FINAL DA STRING

ni mikroc ele me retorna o ponteiro do endereço da string ...pra Q eu quero saber o endereço da string na RAM do pic ..isso é trabalho pro compilador ...



tentei varias formas a ultima foi essa no desespero mas nao funciona

Código: Selecionar todos
// strcpy(buffer,Buffer_gps); //copia a string
// res = strchr(buffer,',');//procura virgula
 
 //arg1 = Buffer[];
tipo=0;
for(x=0;x<=10;x++)
{
ch=buffer_gps[x];//copia o caractere
if(ch==',')tipo++;
switch(tipo)
{
case 1:
text[x]=ch;
break;
case 2:
Buffer_gsm[x]=ch;
break;
default:
tipo=0;
break;
}
}
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor RobL » 12 Fev 2010 14:28

Se voce tem o ponteiro para a string tem tudo.
Faça um
while (*ponteiro) // vai procurando até o final da string (\0)
if (encontrar ',')
{
faça o que quer ;
... ;
}
ponteiro++;

pode sair com
break;
ou o looping vai até encontrar \0 da string.
-------------
Sem usar função pronta para retornar ponteiro.
ponteiro *char ;
ponteiro = MinhaString ;// ponteiro aponta para inicio da string
e aplique o código acima
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor msamsoniuk » 12 Fev 2010 15:36

isso aqui nao resolve?

Código: Selecionar todos
strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
  return p;
}


soh que o codigo que vc postou para o CCS tem um bug, o certo seria:

Código: Selecionar todos
arg1 = strchr(gpsread,','); // procura a virgula

if(arg1) // cuidado: arg1 == null indica q foi ateh o fim da string e nao achou
{
  *arg1++ = '\0'; // colocar zero e incrementa para apontar p/ o prox. caractere
  ...
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor cristian » 12 Fev 2010 16:21

nao deu muito certo nao Marcelo

fiz assim para em parte dar certo

Código: Selecionar todos
char  copia(char *p, char c)
{
  while(*p && *p!=c) p++;

  strcpy(buffer_gsm,p); //copia a string
  return *p;
}


com isso tenho tudo q esta depois da virgula ...mas o q estava antes como salvar
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor cristian » 12 Fev 2010 16:56

groseiramente este codigo fuincionou
Código: Selecionar todos
//---------------------------------- comando gps
if( flag.chegou_gps)
{
 flag.chegou_gps=0;

tipo=0;
ind=0;
 for(x=0;x<=2;x++)
{
ind2=0;
do
{

ch=buffer_gps[ind];//copia o caractere
Buffer_gsm[ind2]=ch;
ind++;
ind2++;
}while(ch!=',');
ind2--;
Buffer_gsm[ind2]='\0';
 // strcpy(text,Buffer_gps); //copia a string
switch(tipo)
{
case 0:

strcpy(text,Buffer_gsm); //copia a string
tipo=1;
break;
case 1:
tipo=2;
 strcpy(text2,Buffer_gsm); //copia a string
break;
case 2:
tipo=3;
 strcpy(text3,Buffer_gsm); //copia a string
break;
}
  }
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Sergio38br » 12 Fev 2010 19:44

Cristian, vc quer pegar as infosda string GPRMC???, olha o mais facil é vc criar uma union , depois de salvar as info na array vc pode acessar mais facilmente, afinal o numero de virgulas naum mudam na sentença.

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

Mensagempor msamsoniuk » 13 Fev 2010 01:36

faltaram dois detalhes no meu strchr... um q eu esqueci de indicar q ele retorna um char *, outro q ele deve retornar NULL quando nao encontra o caractere, daih a implementacao correta e testada ficaria:

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

char *strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
  return *p?p:NULL;
}

int main()
{
  char test[]="1,2,3,4";
  char *p,*q;

  for(p=q=test;q=strchr(q,',');p=q)
  {
    *q++=0;
    if(*p) printf("parametro: %s\n",p);
  } 
  if(*p) printf("parametro: %s\n",p);

  return 0;
}


no teste, ele imprime corretamente:

Código: Selecionar todos
parametro: 1
parametro: 2
parametro: 3
parametro: 4


testei variar tambem a entrada posicionando virgulas meio aleatoriamente e nao deu problemas.

como eu esqueci de indicar o char *, o seu compilador provavelmente colocou como int (o default) e entao vc tentou colocar apenas char e mudar para um return *p, o que na verdade nao funciona (tem q ser return p para retornar a string inteira). dae vc contornou com um strcpy, porem fica com uma copia para um buffer fixo, o q gera alguns problemas.

bom, dah uma analisada nessa versao com as correcoes.

cristian escreveu:nao deu muito certo nao Marcelo

fiz assim para em parte dar certo

Código: Selecionar todos
char  copia(char *p, char c)
{
  while(*p && *p!=c) p++;

  strcpy(buffer_gsm,p); //copia a string
  return *p;
}


com isso tenho tudo q esta depois da virgula ...mas o q estava antes como salvar
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor RobL » 13 Fev 2010 15:16

Solução mui elegante e funciona.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor cristian » 13 Fev 2010 22:02

funcionou em parte tb agora ele separa todos os argumentos mas nao sai da rotina tipo assim

estou usando mikroc pro , falta algum detalhe

--gps--

par : 25 separou corretamente
par : 20
par : 30
par : 40
par : 1 //fica repetindo
par : 1
par : 1
par : 1
par : 1






Código: Selecionar todos
if( flag.chegou_gps)
{
 flag.chegou_gps=0;
 
    for(p=q=test;q=copia(q,',');p=q)
  {
    *q++=0;
    if(*p)
    {
      UART1_Write_text("par : ");
       UART1_Write_text(p);
        UART1_Write(13);
        UART1_Write(10);
     }

  }
  if(*p) UART1_Write_text("parametro: ");
          UART1_Write_text(p);
          UART1_Write(13);
          UART1_Write(10);

 }



Código: Selecionar todos
char *copia(char *p, char c)
{
  while(*p && *p!=c) p++;
 return *p?p:"";
}
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor msamsoniuk » 13 Fev 2010 22:44

eh que vc mudou algo essencial: trocou NULL por "", o que nao eh equivalente. se vc nao tem uma definicao para NULL, simplesmente coloque 0 no lugar de "":

return *p?p:0;

nao parece, mas faz toda a diferenca!
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor cristian » 14 Fev 2010 08:31

NULL nao foi reconhecido pelo mikroc e "" representa o NULL , coloquei 0 e deu erro "inconsistent type"

coloquei "\0" parou de repetir mas nao sai do laço for


return *p?p:0; erro "inconsistent type"

return *p?p:'\0'; erro "inconsistent type"

return *p?p:""; fica repetindo UART1_Write_text("par : ");

return *p?p:"\0"; o que melhor deu certo ate agora mas nao sai do laço for
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Sergio38br » 14 Fev 2010 12:02

Cristian , me tira uma duvida, qdo vc recebe o sinal do gps ele ja vem como string, todos os caracteres são ASCII separados por virgulas entre os campos, tudo que estiver entre o "$" e o "*" são dados conforme o tipo de string, GPRMC, GPGGA, e as outras do NMEA. Qdo um campo é vazio . Ex. ainda não esta com o almanaque utilizavel alguns campos vem "vazios"duas virgulas em sequencia. então por que vc quer transformar uma string em string???

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

Mensagempor msamsoniuk » 14 Fev 2010 12:03

colocar "" ou "\0" dah na mesma e nao satisfaz o teste do for(), por isso ele nao consegue sair. tem q ser um ponteiro nulo mesmo. se o micro-c nao aceita NULL nem 0 diretamente, vc pode tentar colocar um cast:

Código: Selecionar todos
char *strchr(char *p, char c)
{
  while(*p && *p!=c) p++;
 return *p?p:(char *)0;
}


se nao funcionar, vc vai ter q ver com os especialistas em micro-c ae no forum como fabricar um ponteiro NULL no micro-c.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor cristian » 14 Fev 2010 17:49

Marcelo agradeço muito sua ajuda, mas mesmo assim nao funcionou....


Sergio , nao quero transformar string em string , so quero separar o que é latitude longetude etc....como toda sentença é separada por virgula nao importa o tamanho , e quando nao exixte vem vazio ( ,, )emtao se emtre uma virgula e outra nao tiver nada sei q esta vazia

esta é uma senteça q estou usando

$GPGGA,123956.983,1139.2903,S,03900.0478,W,1,10,0.9,388.7,M,-11.6,M,,0000*7F tenho q separar

$GPGGA, //tipo de mensagem
123956.983,//hora utc
1139.2903,S,// lat
03900.0478,W,//long
1,10,0.9,388.7,M,-11.6,
nao lenbro agora o restante

vou fazer um teste agora mais apurado , se mesmo q nao existam os valores for recebidos zeros ou seja a string ter o mesmo tamanho sempre vou simplesmente usar indices para buscar o q quero

mais tarde posto a msg
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor ivan » 14 Fev 2010 20:47

Cristian,

Se vc ainda estiver usando este fragmento de código abaixo:
Código: Selecionar todos
for(p=q=test;q=copia(q,',');p=q)
{
   ...
}


Falta o termo de comparação na 2a expressão do for. Neste exemplo q vc colocou só tem atribuição "=", comparação seria:
==
<=
>=
>
<
...
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Próximo

Voltar para PIC

Quem está online

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

cron

x