[C] problema richiamo funzione in ciclo for

di il
2 risposte

[C] problema richiamo funzione in ciclo for

Salve a tutti
mi scuso in anticipo per eventuali "castronerie" che posso aver scritto in C...ma purtroppo non sono molto ferrato in merito.

Spiego brevemente cosa devo fare e cosa faccio. Ho una tabella A dove è l'anagrafica di alcuni sensori, e altra tabella B dove scrivo per ogni sensore di A il valore in quel momento. Pertanto ho scritto inizialmente del codice che mi recupera ogni singolo sensore (non è altro che la costruzione di un link http) e poi altro codice che con un link http, recupera il valore del sensore.

Passo successivo è stato unire le due cose. Ovvero, faccio prima la query per recuperare gli http, che poi metto in un ciclo for che passa alla funzione insertDB(strWget,row[0]) la stringa http più etichetta per scrivere nel DB. Quest'ultima cosa non va.

Di seguito il codice:

listaSensori.c (recupera i sensori censiti)
#include <my_global.h>                                                                                                                               
#include <mysql.h>                                                                                                                                   
#include <time.h>                                                                                                                                    
#include <stdio.h>                                                                                                                                   
#include <stdlib.h>                                                                                                                                  
#include <string.h>                                                                                                                                  
                                                                                                                                                     
/*gcc wget_insert.c -o wget_insert $(mysql_config --libs --cflags) */                                                                                
                                                                                                                                                     
char* substring(char*, int, int);                                                                                                                    
void insertDB(char*, char*);                                                                                                                         
                                                                                                                                                     
                                                                                                                                                     
void finish_with_error(MYSQL *con)                                                                                                                   
{                                                                                                                                                    
   fprintf(stderr, "%s\n", mysql_error(con));                                                                                                        
   mysql_close(con);                                                                                                                                 
   exit(1);                                                                                                                                          
}                                                                                                                                                    
                                                                                                                                                     
                                                                                                                                                     
int main(int argc, char **argv)                                                                                                                      
{                                                                                                                                                    
    MYSQL *con = mysql_init(NULL);                                                                                                                   
                                                                                                                                                     
    char strWget[100];      //wget rerupero valori                                                                                                   
    memset(strWget, 0, 100);                                                                                                                         
                                                                                                                                                     
                                                                                                                                                     
    if (con == NULL)                                                                                                                                 
    {                                                                                                                                                
        fprintf(stderr, "mysql_init() failed\n");                                                                                                    
        exit(1);
    }                                                                                                                                                
                                                                                                                                                     
    if (mysql_real_connect(con, "192.168.5.201", "root", "paswd", "DB", 0, NULL, 0) == NULL)                                                 
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
    //query che mi recupera la lista dei sensori                                                                                                     
    if (mysql_query(con, "select z.Label, s.IP, s.Sensore FROM Zone as z, AnagraficaSensori as s WHERE z.Area = s.Area"))                            
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
                                                                                                                                                     
    MYSQL_RES *result = mysql_store_result(con);                                                                                                     
                                                                                                                                                     
    if (result == NULL)                                                                                                                              
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
    MYSQL_ROW row;        // la riga                                                                                                                 
    int i = 0, j = 0, n_rows = 0;                                                                                                                    
                                                                                                                                                     
    n_rows = mysql_num_rows (result);                                                                                                                
    for (j = 0; j < n_rows; j++)                                                                                                                     
    {                                                                                                                                                
       i = 0;                                                                                                                                        
       mysql_field_seek (result, 0);           // sposta a inizio riga                                                                               
       row = mysql_fetch_row (result);      // preleva i dati della riga
       char strWget[100];                                                                                                                            
       strcpy(strWget, "http:/""/");                                                                                                                 
       strcat(strWget, row[1]);                                                                                                                      
       strcat(strWget, "/");                                                                                                                         
       strcat(strWget, row[2]);                                                                                                                      
       strcat(strWget, ".html");                                                                                                                     
       printf("%s\n",strWget);  //stringa della wget                                                                                                 
       printf("numero riga: %i\n", j);                                                                                                               
                                                                                                                                                     
                                                                                                                                                     
//       insertDB(strWget,row[0]); //passo wget e label                                                                                              
       memset(strWget, 0, 200);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
    mysql_free_result (result);                                                                                                                      
    mysql_close(con);                                                                                                                                
    exit(0);                                                                                                                                         
}                                                                                                                                                    
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
void insertDB(char *sWget, char *label)                                                                                                              
{                                                                                                                                                    
                                                                                                                                                     
  FILE *in;                                                                                                                                          
  char stringSS[20];                                                                                                                                 
  memset(stringSS, 0, 20);                                                                                                                           
                                                                                                                                                     
  char *temperatura, *umidita, *errSensore;                                                                                                          
  char *erroreTemp ="NO VALUE";                                                                                                                      
  int ret;                                                                                                                                           


  char command[150];                                                                                                                                 
                                                                                                                                                     
  sprintf(command, "/usr/bin/wget -q -O- %s",sWget);                                                                                                 
  printf("%s\n",command);                                                                                                                            
                                                                                                                                                     
  char StringaSQL[200];                                                                                                                              
  memset(StringaSQL, 0, 200);                                                                                                                        
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
  if (!(in = popen(command, "r")))                                                                                                                   
  //if (!(in = popen("/usr/bin/wget -q -O- http://192.168.5.204/DS18B20_ext.html", "r")))                                                            
  {                                                                                                                                                  
     exit(1);                                                                                                                                        
     printf("exit popen");                                                                                                                           
  }                                                                                                                                                  
  fgets(stringSS, 20, in);                                                                                                                           
  pclose(in);                                                                                                                                        
  printf("%s\n",stringSS);                                                                                                                           
                                                                                                                                                     
  errSensore = substring(stringSS, 1, 8);                                                                                                            
  //printf("%s\n", errSensore);                                                                                                                      
                                                                                                                                                     
  ret=strncmp(erroreTemp, errSensore,8);                                                                                                             
  //printf("%i\n",ret);                                                                                                                              
                                                                                                                                                     
  //verifico se e' presente sia T che U. Se 0 solo T, se 1 T e U                                                                                     
  int count =0,i;                                                                                                                                    
  for(i=0;i<strlen(stringSS);i++)                                                                                                                    
  {                                                                                                                                                  
    if(stringSS[i] == '-')                                                                                                                           
        count++;
  }                                                                                                                                                  
  printf("%i\n",count);                                                                                                                              
                                                                                                                                                     
                                                                                                                                                     
  if (ret == 0)                                                                                                                                      
  {                                                                                                                                                  
    printf("errore lettura sensore\n");                                                                                                              
  }                                                                                                                                                  
  else                                                                                                                                               
  {                                                                                                                                                  
    temperatura = substring(stringSS, 1, 5);                                                                                                         
    printf("%s\n", temperatura);                                                                                                                     
                                                                                                                                                     
    if (count == 1) //lo split comporta due token 0 e 1                                                                                              
    {                                                                                                                                                
      umidita= substring(stringSS, 7, 5);                                                                                                            
      printf("%s\n", umidita);                                                                                                                       
    }                                                                                                                                                
                                                                                                                                                     
    MYSQL *con = mysql_init(NULL);                                                                                                                   
                                                                                                                                                     
    if (con == NULL)                                                                                                                                 
    {                                                                                                                                                
        fprintf(stderr, "mysql_init() failed\n");                                                                                                    
        exit(1);                                                                                                                                     
    }                                                                                                                                                
                                                                                                                                                     
    if (mysql_real_connect(con, "192.168.5.201", "root", "passwd", "DB", 0, NULL, 0) == NULL)                                                 
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                


    if (count == 1)                                                                                                                                  
    {                                                                                                                                                
      sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,%s,%s,%s)", label,  temperatura, umidita);   
      printf("insert1: %s\n",StringaSQL);                                                                                                            
    }                                                                                                                                                
    else                                                                                                                                             
    {                                                                                                                                                
      sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,%s,%s,'0')", label, temperatura);            
      printf("insert2: %s\n",StringaSQL);                                                                                                            
    }                                                                                                                                                
                                                                                                                                                     
    mysql_query(con, StringaSQL);                                                                                                                    
                                                                                                                                                     
/*                                                                                                                                                   
    if (mysql_query(con, "SELECT * FROM TemperatureLOG order by Time DESC, ID ASC LIMIT 5"))                                                         
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
    MYSQL_RES *result = mysql_store_result(con);                                                                                                     
                                                                                                                                                     
    if (result == NULL)                                                                                                                              
    {                                                                                                                                                
        finish_with_error(con);                                                                                                                      
    }                                                                                                                                                
                                                                                                                                                     
    int num_fields = mysql_num_fields(result);                                                                                                       
                                                                                                                                                     
    MYSQL_ROW row;                                                                                                                                   
                                                                                                                                                     
    while ((row = mysql_fetch_row(result)))                                                                                                          
    {                                                                                                                                                
        for(int i = 0; i < num_fields; i++)                                                                                                          
        {                                                                                                                                            
            printf("%s ", row[i] ? row[i] : "NULL");                                                                                                 
        }                                                                                                                                            
            printf("\n");                                                                                                                            
    }                                                                                                                                                
                                                                                                                                                     
    mysql_free_result(result); */                                                                                                                    
    //mysql_close(con);                                                                                                                              
                                                                                                                                                     
   }                                                                                                                                                 
                                                                                                                                                     
  exit(0);                                                                                                                                           
}                                                                                                                                                    
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
                                                                                                                                                     
char *substring(char *string, int position, int length)                                                                                              
{                                                                                                                                                    
   char *pointer;                                                                                                                                    
   int c;                                                                                                                                            
                                                                                                                                                     
   pointer = malloc(length+1);                                                                                                                       
                                                                                                                                                     
   if (pointer == NULL)                                                                                                                              
   {                                                                                                                                                 
      printf("Unable to allocate memory.\n");                                                                                                        
      exit(1);                                                                                                                                       
   }                                                                                                                                                 
                                                                                                                                                     
   for (c = 0 ; c < length ; c++)                                                                                                                    
   {                                                                                                                                                 
      *(pointer+c) = *(string+position-1);                                                                                                           
      string++;                                                                                                                                      
   }                                                                                                                                                 
                                                                                                                                                     
   *(pointer+c) = '\0';                                                                                                                              
                                                                                                                                                     
   return pointer;                                                                                                                                   
}                 
Output
root@raspberry:/var/www/script/script_c# ./listaSensori                                                                                              
http://192.168.5.203/DS18B20.html                                                                                                                    
numero riga: 0                                                                                                                                       
http://192.168.5.203/DHT22.html                                                                                                                      
numero riga: 1                                                                                                                                       
http://192.168.5.203/luce.html                                                                                                                       
numero riga: 2                                                                                                                                       
http://192.168.5.204/DS18B20.html                                                                                                                    
numero riga: 3                                                                                                                                       
http://192.168.5.204/DS18B20_ext.html                                                                                                                
numero riga: 4                                                                                                                                       
http://192.168.5.204/DHT22.html                                                                                                                      
numero riga: 5                                                                                                                                       
http://192.168.5.202/DHT11.html                                                                                                                      
numero riga: 6 

2 Risposte

  • Re: [C] problema richiamo funzione in ciclo for

    File sensoriDB.c (legge il sensore e scrive correttamente sul DB)
    #include <my_global.h>                                                                                                                               
    #include <mysql.h>                                                                                                                                   
    #include <time.h>                                                                                                                                    
    #include <stdio.h>                                                                                                                                   
    #include <stdlib.h>                                                                                                                                  
    #include <string.h>                                                                                                                                  
                                                                                                                                                         
    /*gcc wget_insert.c -o wget_insert $(mysql_config --libs --cflags) */                                                                                
                                                                                                                                                         
    void finish_with_error(MYSQL *con)                                                                                                                   
    {                                                                                                                                                    
       fprintf(stderr, "%s\n", mysql_error(con));                                                                                                        
       mysql_close(con);                                                                                                                                 
       exit(1);                                                                                                                                          
    }                                                                                                                                                    
                                                                                                                                                         
    char* substring(char*, int, int);                                                                                                                    
                                                                                                                                                         
    int main(int argc, char **argv)                                                                                                                      
    {                                                                                                                                                    
                                                                                                                                                         
      FILE *in;                                                                                                                                          
      char stringSS[20], *errSensore;                                                                                                                    
      char *temperatura, *umidita;                                                                                                                       
      char *erroreTemp ="NO VALUE";                                                                                                                      
      int ret;                                                                                                                                           
                                                                                                                                                         
      memset(stringSS, 0, 20);                                                                                                                           
      if (!(in = popen("/usr/bin/wget -q -O- http://192.168.5.204/DHT22.html", "r")))                                                                    
      //if (!(in = popen("/usr/bin/wget -q -O- http://192.168.5.204/DS18B20_ext.html", "r")))                                                            
      {                                                                                                                                                  
         exit(1);                                                                                                                                        
      }                                                                                                                                                  
                                                                                                                                                         
      fgets(stringSS, 20, in);                                                                                                                           
      pclose(in);                                                                                                                                        
      printf("%s\n",stringSS);                                                                                                                           
                                                                                                                                                         
      errSensore = substring(stringSS, 1, 8);                                                                                                            
      //printf("%s\n", errSensore);                                                                                                                      
                                                                                                                                                         
      ret=strncmp(erroreTemp, errSensore,8);                                                                                                             
      //printf("%i\n",ret);                                                                                                                              
                                                                                                                                                         
      //verifico se e' presente sia T che U. Se 0 solo T, se 1 T e U                                                                                     
      int count =0,i;                                                                                                                                    
      for(i=0;i<strlen(stringSS);i++)                                                                                                                    
      {                                                                                                                                                  
        if(stringSS[i] == '-')                                                                                                                           
            count++;                                                                                                                                     
      }                                                                                                                                                  
      printf("%i\n",count);                                                                                                                              
                                                                                                                                                         
                                                                                                                                                         
      if (ret == 0)                                                                                                                                      
      {                                                                                                                                                  
        printf("errore lettura sensore\n");                                                                                                              
      }                                                                                                                                                  
      else                                                                                                                                               
      {                                                                                                                                                  
                                                                                                                                                         
        temperatura = substring(stringSS, 1, 5);                                                                                                         
        printf("%s\n", temperatura);                                                                                                                     
                                                                                                                                                         
        if (count == 1) //lo split comporta due token 0 e 1
        {                                                                                                                                                
          umidita= substring(stringSS, 7, 5);                                                                                                            
          printf("%s\n", umidita);                                                                                                                       
        }                                                                                                                                                
                                                                                                                                                         
        MYSQL *con = mysql_init(NULL);                                                                                                                   
        char StringaSQL[200];                                                                                                                            
        memset(StringaSQL, 0, 200);                                                                                                                      
                                                                                                                                                         
        if (con == NULL)                                                                                                                                 
        {                                                                                                                                                
            fprintf(stderr, "mysql_init() failed\n");                                                                                                    
            exit(1);                                                                                                                                     
        }                                                                                                                                                
                                                                                                                                                         
        if (mysql_real_connect(con, "192.168.5.201", "root", "passwd",                                                                                 
                "DB", 0, NULL, 0) == NULL)                                                                                                          
        {                                                                                                                                                
            finish_with_error(con);                                                                                                                      
        }                                                                                                                                                
                                                                                                                                                         
                                                                                                                                                         
                                                                                                                                                         
        if (count == 1)                                                                                                                                  
        {                                                                                                                                                
          sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,'Esterno',%s,%s)", temperatura, umidita);    
        }                                                                                                                                                
        else                                                                                                                                             
        {                                                                                                                                                
          sprintf(StringaSQL, "INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,'Esterno',%s,'0')", temperatura);            
        }                                                                                                                                                
    
    
                                                                                                                                                         
                                                                                                                                                         
        mysql_query(con, StringaSQL);                                                                                                                    
                                                                                                                                                         
                                                                                                                                                         
        if (mysql_query(con, "SELECT * FROM TemperatureLOG order by Time DESC, ID ASC LIMIT 5"))                                                         
        {                                                                                                                                                
            finish_with_error(con);                                                                                                                      
        }                                                                                                                                                
                                                                                                                                                         
        MYSQL_RES *result = mysql_store_result(con);                                                                                                     
                                                                                                                                                         
        if (result == NULL)                                                                                                                              
        {                                                                                                                                                
            finish_with_error(con);                                                                                                                      
        }                                                                                                                                                
                                                                                                                                                         
        int num_fields = mysql_num_fields(result);                                                                                                       
                                                                                                                                                         
        MYSQL_ROW row;                                                                                                                                   
                                                                                                                                                         
        while ((row = mysql_fetch_row(result)))                                                                                                          
        {                                                                                                                                                
            for(int i = 0; i < num_fields; i++)                                                                                                          
            {                                                                                                                                            
                printf("%s ", row[i] ? row[i] : "NULL");                                                                                                 
            }                                                                                                                                            
                printf("\n");                                                                                                                            
        }                                                                                                                                                
                                                                                                                                                         
        mysql_free_result(result);                                                                                                                       
        mysql_close(con);
                                                                                                                                                         
       }                                                                                                                                                 
                                                                                                                                                         
      exit(0);                                                                                                                                           
    }                                                                                                                                                    
                                                                                                                                                         
                                                                                                                                                         
    char *substring(char *string, int position, int length)                                                                                              
    {                                                                                                                                                    
       char *pointer;                                                                                                                                    
       int c;                                                                                                                                            
                                                                                                                                                         
       pointer = malloc(length+1);                                                                                                                       
                                                                                                                                                         
       if (pointer == NULL)                                                                                                                              
       {                                                                                                                                                 
          printf("Unable to allocate memory.\n");                                                                                                        
          exit(1);                                                                                                                                       
       }                                                                                                                                                 
                                                                                                                                                         
       for (c = 0 ; c < length ; c++)                                                                                                                    
       {                                                                                                                                                 
          *(pointer+c) = *(string+position-1);                                                                                                           
          string++;                                                                                                                                      
       }                                                                                                                                                 
                                                                                                                                                         
       *(pointer+c) = '\0';                                                                                                                              
                                                                                                                                                         
       return pointer;                                                                                                                                   
    }                         
    Output:
    root@raspberry:/var/www/script/script_c#  ./sensoriDB                                                                                                
    28.06                                                                                                                                                
    0                                                                                                                                                    
    28.06                                                                                                                                                
    110 2017-08-09 11:09:33 Esterno 28.06 0                                                                                                              
    109 2017-08-09 11:01:23 Esterno 28.31 0                                                                                                              
    108 2017-08-09 11:01:15 Esterno 28.31 0                                                                                                              
    107 2017-08-05 00:04:42 Esterno 35.56 0                                                                                                              
    106 2017-08-05 00:04:39 Esterno 35.56 0 
    Se al file listaSensori.c (scritta all'inizio) decommento la chiamata alla funzione insertDB(strWget,row[0]), non mi cicla per tutti i sensori e scrive sul DB

    Questo l'output:
                             
    root@raspberry:/var/www/script/script_c# ./listaSensori                                                                                              
    http://192.168.5.203/DS18B20.html                                                                                                                    
    numero riga: 0                                                                                                                                       
    /usr/bin/wget -q -O- http://192.168.5.203/DS18B20.html                                                                                               
    29.00                                                                                                                                                
    0                                                                                                                                                    
    29.00                                                                                                                                                
    insert2: INSERT INTO TemperatureLOG (ID,Time,Zona,T,U) VALUES (NULL,CURRENT_TIMESTAMP,Sala,29.00,'0')  
  • Re: [C] problema richiamo funzione in ciclo for

    Riuscito a risolvere il problema.
    Nella funzione insertDB, avevo commentato la Commit della query, e avevo la exit(0) che ho commentato, motivo per cui non ciclava

    Per me è possibile chiudere il post
Devi accedere o registrarti per scrivere nel forum
2 risposte