collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Dividir String em variaveis  (Lida 13375 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Dividir String em variaveis
« em: 21 de Abril de 2015, 10:30 »
Bom dia,

Damos o caso que tenho uma string :   

char str= "var1=01&var2=02&var3=03";

e quero dividir em:

int var1=01;
int var2=02;
int var3=03;

mas queria que a variavel fosse criada consoante o nome que viesse na string. Se por acaso viesse: variavel1=01 em vez de var1=01, criava a variavel variavel1 em vez de var1.

para ja tenho um exemplo que arrnajei na net. mas nao cria as variaveis a partir da string

Código: [Seleccione]
#include <string.h>

char sz[] = "Here; is some; sample;100;data;1.414;1020";
void setup()
{
 char *p = sz;
 char *str;
 Serial.begin(9600);
 while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon
   Serial.println(str);
}

void loop(){}

generates this output:

Here
is some
sample
100
data
1.414
1020

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 2.189
Re: Dividir String em variaveis
« Responder #1 em: 21 de Abril de 2015, 10:49 »
Não podes ir criando variáveis ao longo do processo, elas são criadas no inicio, seja de um procedimento ou função.
Se queres retirar um valor de uma string para uma variável inteira, 1º tens de escolher a zona da string onde estão os valores, depois converter para numérico, só depois é que podes colocar na variável.

Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: Dividir String em variaveis
« Responder #2 em: 21 de Abril de 2015, 10:57 »
Em C/C++ não podes criar variáveis dinamicamente (dessa maneira pelo menos). Uma solução seria criar um array ou lista de conjuntos nome/valor, ou algo pelo género.

Mas mais importante, porque é que quererias fazer algo assim? Explica para o que queres pode ser que te arranjem uma solução mais viável.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Dividir String em variaveis
« Responder #3 em: 21 de Abril de 2015, 12:42 »
O nome da variavel é psicológico, é simplesmente açucar sintático para uma posição(ou várias) de memória..
Avr fanboy

Offline dropes

  • Mini Robot
  • *
  • Mensagens: 2.189
Re: Dividir String em variaveis
« Responder #4 em: 21 de Abril de 2015, 14:01 »
Nada impede que a saída da informação via série contenha o nome que consta na string, é uma questão de jogar com array de strings ter a mesma posição do array de variáveis inteiras, assim na string principal, retira-se o seu nome + o valor (em caracteres também), coloca-se o nome no str[0] (var. tipo string) e o valor no int[0] (var. tipo integer depois de convertido).

Isto foi só um exemplo para vários nomes e valores, que depende imenso do objectivo assim como o @jm_araujo referiu.

Offline Tiobel

  • Mini Robot
  • *
  • Mensagens: 27
Re: Dividir String em variaveis
« Responder #5 em: 21 de Abril de 2015, 14:22 »
Podes utilizar este pseudo-código:

Código: [Seleccione]
char* string_var[5] = {
        "", "", "", "", "", ""  , ""
      };//cuts the received string into 6 pieces

      int i = 0;
      char * to_cut;

      to_cut = strtok (string_received, ",");
      while (to_cut != NULL)
      {
        string_var[i] = to_cut;
        i++;
        to_cut = strtok (NULL, " ,");
      }
     
      depois:
      int var_0 = atoi(string_var[0]);

Neste caso o separador da "string_received" é a virgula, mas podes utilizar outra coisa.
Depois convertes o valor do array num inteiro.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Dividir String em variaveis
« Responder #6 em: 21 de Abril de 2015, 15:17 »
Depois de ter pesado mehor, o que interessa nao é criar as variaveis consoante o nome que vem na string, mas sim a ordem delas.

Eu estou a ler uma string de um servidor Web com um conjunto de variaves para o arduino recolher os valores.

Não perco nada em talvez enviar as variaveis sempre pela mesma ordem na string, e apenas igualo uma variavel a cada numero dentro de "&"

em vez de enviar
char str= "var1=01&var2=02&var3=03";

vou enviar

char str= "01&02&03";

depois
faço qualquer coisa do genero:

int var1 = leitura do primeiro bloco
int var2 = leitura do 2º bloco
ect..

A vantagem é ter menos cadigo a escolher qual a variavel para onde vai.
e a desvantagem é que tem que seguir aquele protocolo e os dados terem que ser enviados pela mesma rdem



Offline jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: Dividir String em variaveis
« Responder #7 em: 21 de Abril de 2015, 16:14 »
Se é para um serviço Web, os "nomes" das variáveis não são arbitrários. Podes comparar o nome com o que queres e atribuir o valor associado à variável apropriada.

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Dividir String em variaveis
« Responder #8 em: 21 de Abril de 2015, 16:24 »
O servidor vai actualizar os dados varias vezes, mas desde que no primeiro espaço (entre virgulas) seja a var1 e no segundo a var 2, nao precisa de ir la escrito que é a var1, porque naquea posição so pode ser aquela (segundo o protocolo).

basta entao igualar  arduinov1 ao primeiro valor e assi sucessivamente.

correto?

Fazer como disse o @tiobel em "x" no  string_var
  • é o umero da variavel , que por sua vez é a posição do "bloco" (entre virgulas) da string_received

StarRider

  • Visitante
Re: Dividir String em variaveis
« Responder #9 em: 21 de Abril de 2015, 16:31 »
Podes utilizar este pseudo-código:

Código: [Seleccione]
char* string_var[5] = {
        "", "", "", "", "", ""  , ""
      };//cuts the received string into 6 pieces

      int i = 0;
      char * to_cut;

      to_cut = strtok (string_received, ",");
      while (to_cut != NULL)
      {
        string_var[i] = to_cut;
        i++;
        to_cut = strtok (NULL, " ,");
      }
     
      depois:
      int var_0 = atoi(string_var[0]);

Neste caso o separador da "string_received" é a virgula, mas podes utilizar outra coisa.
Depois convertes o valor do array num inteiro.

Boas,

Isso tem muito código desnecessário, se a ideia é fazer o parse de uma string para
converter os termos em numérico basta isto:

Código: [Seleccione]
      char * token;
      token = strtok (string_received, ",");
      while (token != NULL)
      {
        var_xpto_?? = atoi(token);
        token = strtok (NULL, " ,");
      }


StarRider

  • Visitante
Re: Dividir String em variaveis
« Responder #10 em: 21 de Abril de 2015, 16:50 »
Depois de ter pesado mehor, o que interessa nao é criar as variaveis consoante o nome que vem na string, mas sim a ordem delas.

Eu estou a ler uma string de um servidor Web com um conjunto de variaves para o arduino recolher os valores.

Não perco nada em talvez enviar as variaveis sempre pela mesma ordem na string, e apenas igualo uma variavel a cada numero dentro de "&"

em vez de enviar
char str= "var1=01&var2=02&var3=03";

vou enviar

char str= "01&02&03";

depois
faço qualquer coisa do genero:

int var1 = leitura do primeiro bloco
int var2 = leitura do 2º bloco
ect..

A vantagem é ter menos cadigo a escolher qual a variavel para onde vai.
e a desvantagem é que tem que seguir aquele protocolo e os dados terem que ser enviados pela mesma rdem

Suponho que isso seja para fazer o parser de um GET HTTP ou coisa parecida, mas em
qualquer dos casos os "pares" devem ser respeitados por uma questão de manutenção
do código e evolução do mesmo. Usar pares na forma "field_x=value_y" garante que
se no futuro for necessário alterar/adicionar/remover/etc qualquer dos parâmetros isso
não vai requerer grande alteração no parser em si, alem de que deixa de existir o
constrangimento de ter que se respeitar a ordem com que os parâmetros são enviados.

Uma coisa bem implementada começa por separar os pares e à medida que estes vão
sendo lidos é tratar logo dos mesmos, ou seja,  algo no género:

Código: [Seleccione]
void processar_received(char *buf)
{
    char *token;
    token = strtok (buf, "&");
    while (token != NULL)   {
        processar_par(token);
        token = strtok (NULL, "&");
    }
}

void processar_par(char *par)
{
   char varname[20];
   int x=0;
 
   while (char[x] && (char[x]!='='))
       varname[x] = char[x++];
   varname[x] = 0;

  if (!strcmp(varname, "Xpto"))
     xpto = atoi(&par[x]);
  else if (!strcmp(varname, "Outra"))
     outra = atoi(&par[x]);
   ...
}

Abraços,
PA
« Última modificação: 21 de Abril de 2015, 16:53 por StarRider »

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Dividir String em variaveis
« Responder #11 em: 21 de Abril de 2015, 17:08 »
Obrigado,

quando chegar a casa ja vou passar isso para a pratica a ver o que sai ;)

Offline joaopedrocmp

  • Mini Robot
  • *
  • Mensagens: 246
Re: Dividir String em variaveis
« Responder #12 em: 21 de Abril de 2015, 23:25 »
Boas starrider,
consegues ajudar mais com um exemplo? nao wstou a conseguir por em pratica.

obrigado

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: Dividir String em variaveis
« Responder #13 em: 22 de Abril de 2015, 00:22 »
Qual é o problema? (Além do Star se ter enganado e ter metido "char" onde devias estar "par")

StarRider

  • Visitante
Re: Dividir String em variaveis
« Responder #14 em: 22 de Abril de 2015, 19:00 »
Qual é o problema? (Além do Star se ter enganado e ter metido "char" onde devias estar "par")

Yap ... conta a intenção ;)