Skocz do zawartości

Żebym wiedział o co zapytać, deserializeJSON prosto do zmiennej...(?)


SOYER

Pomocna odpowiedź

Cześć, długie wieczory to się uczę...

Przerabiam mój szkic od pobierania danych z serwera supli i wysyłania tego dalej...

mam funkcję for:

String jsonBuffer;
for(int i = 0; i < 6; i++){    
      jsonBuffer = httpGET(serverPath[i].c_str());
      Serial.println(jsonBuffer);
}

 

a to funkcja którą wywołuję w for:

int suplaGet[6];

String httpGET(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  int httpResponseCode = http1.GET();
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    if(i==3){
     suplaGet[i] = doc["temperature"]; 
    }
    else if(i==5){
      suplaGet[i] = doc["humidity"];
    }
    else{
      suplaGet[i] = doc["value"];
    }
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}

pod tą pętlą for muszę(?) zrobić coś takiego:

 WCpm1 = suplaGet[0];
 WCpm10 = suplaGet[1];
 WCpm25 = suplaGet[2];
 WCgruntTemp = suplaGet[3];
 WCpressure = suplaGet[4];
 WChumidity = suplaGet[5];

żeby potem wysłać to w świat:

 String serverPathWC = String(server) + "/v01/set/wid/" + String(IDKryry) + "/key/" + String(KeyKryry) 
  + "/temp/" + String(WCgruntTemp) + "/hum/" + String(WChumidity) 
  + "/bar/" + String(WCpressure) + "/wspdavg/" + String(WCaverage_kmh) + "/wspdhi/" + String(WCporyw_kmh) 
  + "/wspd/" + String(WCmoment_kmh) + "/heat/" + String(heatIndex)
  + "/rainrate/" + String(WCmm1h) + "/dew/" + "/rain/" + String(WCmm24h) + "/dew/" 
  + String(punkt_rosy) + "/chill/" + String(t_odczuwal);
  // + "/pm25/" + String(WCpm25) + "/pm10/" + String(WCpm10);  

Pytanie

jak uniknąć przypisywania do zmiennej wartości z tablicy, pewnie wpisać w ścieżce wysyłającej zamiast np WChumidity, suplaGet[cośtam], ale to będzie mega nieczytelne(?). Teraz widzę co wysyłam, bo mam jasno opisaną zmienną, ale jak wpiszę suplaGet[2], to mi to nic nie mówi...

Coś mi świtają wskaźniki ale czy słusznie? bo na tym to się już całkiem nie znam... Póki co;)

Zresztą te if w httpGet() też niespecjalnie mi się podobają, ale za cienki jestem.

Temat wątku też zły, ale już nie zmieniam;)

Edytowano przez SOYER
Link do komentarza
Share on other sites

1 godzinę temu, SOYER napisał:

Pytanie

jak uniknąć przypisywania do zmiennej wartości z tablicy, pewnie wpisać w ścieżce wysyłającej zamiast np WChumidity, suplaGet[cośtam], ale to będzie mega nieczytelne(?). Teraz widzę co wysyłam, bo mam jasno opisaną zmienną, ale jak wpiszę suplaGet[2], to mi to nic nie mówi...

Jedno z najprostszych rozwiązań: dodać do kodu komentarze i opisać w nich znaczenie poszczególnych elementów tablicy suplaGet[] 

  • Lubię! 1
Link do komentarza
Share on other sites

int *  WCpm1 = &suplaGet[0];

A wywołujesz *WCpm1 jeżeli chcesz zawartość spod adresu, bez * to sam adres.
 

Drugim działającym (brzydko) sposobem jest poniższe, kompilator zastąpi sobie później co tam trzeba w kodzie. Tyle, że tu możesz się walnąć, zdublować nazwę i nawet nie zauważysz (chociaż chyba jakieś ostrzeżenie kompilator wysypie).

#define WCpm1 suplaGet[0]

 

Edytowano przez orb777
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki, komentarze to w takim wypadku obowiązkowe, inaczej się nie połapiesz.

@orb777możesz coś więcej o tej pierwszej metodzie. Bo tak jak wielokrotnie próbowałem zrozumieć po co komu wskaźniki, tak dalej nie łapię. Może tu jak znalazł.

Co do drugiej metody z #define, to proste i oczywiste, dlaczego brzydkie?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Chyba najprościej powiedzieć, że wskaźniki wskazują na dany adres w pamięci, nie kopiują zawartości jak np. przypisanie, są szybsze i możesz modyfikować pamięć w miejscu. W "Symfonii C++" Jerzego Grębosza wskaźniki (i referencje) są dobrze opisane, z przykładami, .pdf znajdziesz na docer (linka na pm też mogę podesłać).

Przykładowo zmienna "b" ma najpierw wartość 5, później "teoretycznie" powinna mieć 10, przypisanie tego nie uwzględnia, wskaźnik tak.

// przypisanie
int a = 5;
int b = a;
a = 10;
// wynik => a: 10, b: 5

// wskaźnik
int a = 5;
int * b = &a;
a = 10;
// wynik => a: 10, b: 10


Z #define chodziło mi głównie o to, że można się machnąć, chociaż kompilator powinien rzucić jakimś ostrzeżeniem.

#define WCpm1 suplaGet[0]
int suplaGet[2] = { 10, 20 };
	
// ogólnie trochę od czapy miejsce na define, bo zazwyczaj umieszcza się gdzieś na górze kodu źródłowego, 
// ale WCpm1 jest równe wtedy 20 (kod kompiluje się, jednak kompilator daje ostrzeżenie) 
#define WCpm1 suplaGet[1]

 

supla.cpp:12: warning: "WCpm1" redefined
   12 |         #define WCpm1 suplaGet[1]
      | 
supla.cpp:7: note: this is the location of the previous definition
    7 |         #define WCpm1 suplaGet[0]
      | 
Wynik: 20
Edytowano przez orb777
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Jak już obczaisz wskaźniki, referencje, struktury/unie, a także rzutowania, wtedy możesz zrobić jeszcze prościej (nie mam arduino ide, więc piszę w zwykłym c++).
Tutaj po prostu tworzysz wskaźnik własnej struktury (struktura składa się z 6-ciu intów jak twoja tablica, tylko z przystępnymi nazwami) i mówisz mu "wskazuj w sprytny sposób na suplaGet[6], żebym mógł łatwo odnosić się do pól poprzez znaną nazwę". Tak więc np. "wsk -> WCpm1" jest równoznaczne z "suplaGet[0]".

Oczywiście mogłem coś pokręcić, c++ jako amator "używałem" kilka lat temu.
 

#include<iostream>
using namespace std;

struct dane {
	int WCpm1, WCpm10, WCpm25, WCgruntTemp, WCpressure, WChumidity;
};

int main() {
	int suplaGet[6] = {1, 2, 3, 4, 5, 6};
	dane * wsk = reinterpret_cast<dane *>(suplaGet);
	
	// cout tylko wyświetla, coś jak print
	cout << "Wartość WCpm1: " << wsk -> WCpm1 << endl;
	cout << "Wartość WCpressure: " << wsk -> WCpressure << endl;
	// itd
	
	// zmieniamy pozycję pierwszą
	suplaGet[0] = 999;
	cout << "Wartość WCpm1 po zmianie: " << wsk ->WCpm1 << endl;
	
	// inna metoda zmiany suplaGet[0], odnosimy się do nazwy przez wskaźnik
	wsk ->WCpm1 = 777;
	cout << "Wartość WCpm1 po 2-giej zmianie: " << wsk ->WCpm1 << endl;
	
	// wyświetlamy zawartość suplaGet[0] w "normalny sposób"
	cout << "suplaGet[0]: " << suplaGet[0] << endl;
	
	return 0;
}

 

Wynik:

Wartość WCpm1: 1
Wartość WCpressure: 5
Wartość WCpm1 po zmianie: 999
Wartość WCpm1 po 2-giej zmianie: 777
suplaGet[0]: 777

 

Podobnie możesz użyć unii i struktury:

#include<iostream>
using namespace std;

union dane {
	struct {
		int WCpm1, WCpm10, WCpm25, WCgruntTemp, WCpressure, WChumidity;
	};
	int suplaGet[6];
};

int main() {
	dane d; // tworzysz unię
	
	// to masz w funkcji "httpGET"
	d.suplaGet[0] = 1;
	d.suplaGet[1] = 2;
	d.suplaGet[2] = 3;
	d.suplaGet[3] = 4;
	d.suplaGet[4] = 5;
	d.suplaGet[5] = 6;
	
	// tak mozesz się odwoływać, cout i endl to "print" i znak koniec wiersza
	cout << "Wartość WCpm1: " << d.WCpm1 << endl;
	// itd
	
	// zmieniamy
	d.suplaGet[0] = 999;
	cout << "Wartość WCpm1 po zmianie: " << d.WCpm1 << endl;
	
	return 0;
}


Wynik:

Wartość WCpm1: 1
Wartość WCpm1 po zmianie: 999
Edytowano przez orb777
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki, z moim uczeniem jest ten problem, że bardzo trudno mi odnieść/zastosować nowość którą poznałem do szkiców które chciałbym poprawić. Ostatnio na nowo odpaliłem Mirka Zelenta z obiektowym i o dziwo sporo więcej do mnie trafia niż ostatnio jak to oglądałem, ze 2 lata temu. Po prostu widzę gdzie by można użyć, oczywiście do praktycznego użycia jeszcze daleko. Poza tym moje szkice aż tak skomplikowane nie są, bardziej to pomaga w zrozumieniu np. źródeł supli.

Co to Twoich rad do mojego pytania, to przemawia do mnie #define, bo przecież kod na tyle prosty, z że raczej redefinicji nie zrobię.

Jednak zastosuję chyba strukturę, zdaje się, że to bardziej eleganckie i czytelne.

Dzięki.

Co do pytania o ify z pierwszego postu, da się to zrobić lepiej?

Link do komentarza
Share on other sites

55 minut temu, ethanak napisał:

Strasznie komplikujecie

Niestety przed kmpem bedę dopiero jutro, ale postaram się to jakoś uprościć.

Ja właśnie kompa włączyłem bo chcę sobie poprawić to i tamto, a Ty piszesz, że nie tak...

To może wstawię tu cały fragment który przerabiam, chcę przerobić. On już się pojawił w innym wątku, ale teraz idzie o naukę trochę lepszego pisania, bo ja się zatrzymałem na kursie arduino Forbota, a tam ani nic o wskaźnikach, ani o obiektówce nie było. Oczywiście domyślam się i nawet coś rozumiem co siedzi np. tu, ale żebym umiał tak pisać to nieee...

Co chcę przerobić, mam tak mniej więcej:

zmienne globalne

int WCpressure = 0;
int WChumidity = 0;
int WCgruntTemp = 0;
int WCpm25 = 0;
int WCpm10 = 0;
int WCpm1 = 0;
int WCaverage_kmh = 0;
int WCporyw_kmh = 0;
int WCmoment_kmh = 0;
float punkt_rosy;           // dew point (C)
float heatIndex;
float t_odczuwal; 
itd.....

główna metoda weathercloud() z funkcjami wywoływanymi przez tę metodę:

void weathercloud(){
  int WCmm1h = mm1h *10;
  int WCmm24h = mm24h *10;

  String serverPathPM_pm1 = "https://svrxx/read?format=json";
  String serverPathPM_pm25 = "https://svrxx/read?format=json";
  String serverPathPM_pm10 = "https://svrxxread?format=json";
  String serverPathGRUNT_temp = "https://svrxxxread?format=json";
  String serverPathZEW_press = "https://svrxxxxad?format=json"; 
  String serverPathZEW_hum = "https://svxx?format=json";

punkt_rosy = (dewPoint(gruntTemp, WChumidity))*10;
heatindex();
windchill();

  String serverPathWC = String(server) + "/v01/set/wid/" + String(IDKryry) + "/key/" + String(KeyKryry) 
  + "/temp/" + String(WCgruntTemp) + "/hum/" + String(WChumidity) 
  + "/bar/" + String(WCpressure) + "/wspdavg/" + String(WCaverage_kmh) + "/wspdhi/" + String(WCporyw_kmh) 
  + "/wspd/" + String(WCmoment_kmh) + "/heat/" + String(heatIndex)
  + "/rainrate/" + String(WCmm1h) + "/dew/" + "/rain/" + String(WCmm24h) + "/dew/" 
  + String(punkt_rosy) + "/chill/" + String(t_odczuwal);
  // + "/pm25/" + String(WCpm25) + "/pm10/" + String(WCpm10);
  
  
String serverPath_aqi = "https://api.aqi.eco/update/xxx"; 
      jsonBuffer = httpGET_PM_pm1(serverPathPM_pm1.c_str());
      jsonBuffer = httpGET_PM_pm25(serverPathPM_pm25.c_str());
      jsonBuffer = httpGET_PM_pm10(serverPathPM_pm10.c_str());
      jsonBuffer = httpGET_GRUNT_temp(serverPathGRUNT_temp.c_str());
      jsonBuffer = httpGET_ZEW_hum(serverPathZEW_hum.c_str());
      jsonBuffer = httpGET_ZEW_press(serverPathZEW_press.c_str());
      jsonBuffer = httpGETWC(serverPathWC.c_str());
      jsonBuffer = httpPOSTaqi(serverPath_aqi.c_str());
      
      Serial.println(jsonBuffer);
}
String httpGET_PM_pm1(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    WCpm1 = doc["value"]; 
    Serial.print("pm1:  ");
    Serial.println(WCpm1);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGET_PM_pm25(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    WCpm25 = doc["value"]; 
    Serial.print("pm2,5:  ");
    Serial.println(WCpm25);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGET_PM_pm10(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    WCpm10 = doc["value"]; 
    Serial.print("pm10:  ");
    Serial.println(WCpm10);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGET_GRUNT_temp(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    gruntTemp = doc["temperature"]; 
    if(gruntTemp > -273){
      WCgruntTemp = gruntTemp *10;
    }
    Serial.print("tempGrunt:  ");
    Serial.println(gruntTemp);
    Serial.print("tempGruntWC:  ");
    Serial.println(WCgruntTemp);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGET_ZEW_hum(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    WChumidity = doc["humidity"]; 
    Serial.print("humidityZewWC:  ");
    Serial.println(WChumidity);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGET_ZEW_press(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);  
    pressure = doc["value"]; 
    WCpressure = pressure *10;
    Serial.print("pressureWC:  ");
    Serial.println(WCpressure);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpGETWC(const char* serverName) {
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  // Send HTTP POST request
  int httpResponseCode = http1.GET();
  
  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}
String httpPOSTaqi(const char* serverName) {
  
float AQIpressure = pressure*100;
  WiFiClientSecure client1;
  HTTPClient http1;
  client1.setInsecure();
  http1.begin(client1, serverName);
  http1.addHeader("Content-Type", "application/json");
  int httpResponseCode = http1.POST("{\"esp8266id\": \"123123123\",\"sensordatavalues\":[{\"value_type\":\"PMS_P0\",\"value\":" + String(WCpm1) + "},{\"value_type\":\"PMS_P2\",\"value\":" + String(WCpm25) + "}, {\"value_type\":\"PMS_P1\",\"value\":" + String(WCpm10) + "},{\"value_type\":\"BME280_temperature\",\"value\":" + String(gruntTemp) + "},{\"value_type\":\"BME280_humidity\",\"value\":" + String(WChumidity) + "},{\"value_type\":\"wind_speed\",\"value\":" + String(average_kmh) + "},{\"value_type\":\"rainfall\",\"value\":" + String(mm24h) + "},{\"value_type\":\"BME280_pressure\",\"value\":" + String(AQIpressure) + "}]}");

  String payload = "{}"; 
  
  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http1.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  
  http1.end();
  return payload;
}

Później jeszcze kilka funkcji pobocznych ale używających danych pobranych z serwera.

double dewPoint(double tempc_min, double humidity){    //punkt rosy
  
        double RATIO = 373.15 / (273.15 + tempc_min);  // RATIO was originally named A0, possibly confusing in Arduino context
        double SUM = -7.90298 * (RATIO - 1);
        SUM += 5.02808 * log10(RATIO);
        SUM += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
        SUM += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
        SUM += log10(1013.246);
        double VP = pow(10, SUM - 3) * humidity;
        double T = log(VP/0.61078);   // temp var
        return (241.88 * T) / (17.558 - T);
}
void heatindex(){ // indeks ciepła
  float temp_f = (gruntTemp*1.8)+32;// stopnie C->F
if (temp_f > 80.0)   //The heat index only works for temperatures  above 80°F 
{
  float heat_f = c1+c2*(temp_f)+c3*(WChumidity)+c4*(temp_f)*(WChumidity)+c5*(pow(temp_f,2))+c6*(pow(WChumidity,2))+c7*(pow(temp_f, 2))*(WChumidity)+c8*(temp_f)*(pow(WChumidity, 2))+c9*(pow(temp_f, 2))*(pow(WChumidity, 2));
  heatIndex = ((heat_f - 32)*5/9)*10;  //  converting to C and x10 to WC
  }
  else
{
  heatIndex = gruntTemp*10;
}
}
void windchill(){    //temperatura odczuwalna
float temp_f = (gruntTemp*1.8)+32;    // stopnie C->F

if ((temp_f <50.0) && (average_kmh > 3.6)) //The wind chill only works for temperatures  below 50°F and wind speed above 3 mph. (10°C , 1 m/s)

{
 float chill_f =35.74+0.6215*temp_f-35.75*pow(average_kmh,0.16)+0.4275*temp_f*pow(average_kmh,0.16);
 t_odczuwal = ((chill_f - 32)*5/9)*10;  //  converting to C
}

else
{
  t_odczuwal = gruntTemp*10;
}
}

Teraz mamy ogląd co zmieniamy.

Wstępnie to przerobiłem w bardzo prosty sposób pokazany w pierwszym poście, ubyło sporo linijek kodu...

Co dalej, jak inaczej?

 

Link do komentarza
Share on other sites

12 minut temu, SOYER napisał:
String serverPathPM_pm1 = "https://svrxx/read?format=json";
  String serverPathPM_pm25 = "https://svrxx/read?format=json";
  String serverPathPM_pm10 = "https://svrxxread?format=json";
  String serverPathGRUNT_temp = "https://svrxxxread?format=json";
  String serverPathZEW_press = "https://svrxxxxad?format=json"; 
  String serverPathZEW_hum = "https://svxx?format=json";

Trochę dziwne są te adresy, tak to działa?

Link do komentarza
Share on other sites

Przed chwilą, orb777 napisał:

Trochę dziwne są te adresy, tak to działa?

Dziwne bo wstawiłem "xxx" w newralgicznych miejscach, jeśli o to Ci chodzi

Jak działa? Zapytuje serwer Supli o dane z konkretnego kanału, to wraca w formie jsona, a ja wyciągam z tego co mnie interesuje...

Tu masz opis projektu:

 

Link do komentarza
Share on other sites

Czaję. Było w sumie dosyć jasno napisane, pętla i indeksy ciut komplikuje. HttpGET() mogłaby by mieć więcej argumentów i zwracać inny typ lub przez referencje. Ale siedzę już cicho, ciiiii, hehe.

Link do komentarza
Share on other sites

19 minut temu, orb777 napisał:

Czaję. Było w sumie dosyć jasno napisane, pętla i indeksy ciut komplikuje. HttpGET() mogłaby by mieć więcej argumentów i zwracać inny typ lub przez referencje. Ale siedzę już cicho, ciiiii, hehe.

Nie siedzi cicho, gadaj co i jak

Link do komentarza
Share on other sites

Patrząc na pierwowzór kodu, utworzyłbym tablicę prostych struktur i przekazywał w pętli do httpGet() przez referencję, żeby zaktualizować wymagane pola. Ethanak ma pewnie lepszy pomysł, więc skończy się na tym, że mnie ochrzani, a tobie pomoże, aleee... obaj czegoś się nauczymy, hehe.

W każym razie do "Symfonii C++" możesz zajrzeć, zrozumiesz różne cechy tego języka. Jest też "Pasja C++", też ciekawa, ale niekoniecznie tu potrzebna.

Edytowano przez orb777
  • Lubię! 1
Link do komentarza
Share on other sites

19 godzin temu, orb777 napisał:

skończy się na tym, że mnie ochrzani

Nikogo nie mam zamiaru ochrzaniać. Niestety, trochę mi dzisiaj czasu zabrakło, ale przynajmniej jakiś fragmencik...

@SOYER: Uwaga, nie sprawdzałem kodu, piszę z głowy.

Załóżmy, że pojedyncze zmienne pozostają, czyli:

int WCpm1, WCpm10, WCpm25, WCgruntTemp, WCpressure, WChumidity;

Teraz trzeba się pozbyć tablicy suplaGet która absolutnie nie jest potrzebna, a tylko zaciemnia kod. W tym celu tworzę pomocniczą tablicę która będzie służyć do umieszczania właściwych wartości we właściwym miejscu:

const struct suplaGetter {
    int *value;
    const char *varname;
} suplaGetters[6] = {
    {&WCpm1,"value"},
    {&WCpm10,"value"},
    {&WCpm25,"value"},
    {&WCgruntTemp,"temperature"},
    {&WCpressure,"value"},
    {&WChumidity,"humidity"}};

Jak widać, w tablicy przechowuję wyłącznie stałe wartości: wskaźniki na uprzednio zdefiniowane zmienne i napisy odpowiadające indeksom obiektu json.

W takiej sytuacji jeśli gdzieś w kodzie umieszczę:

    *suplaGetters[i].value = doc[suplaGetters[i].varname];

w efekcie właściwa wartość zostanie podstawiona do właściwej zmiennej. 

To na dzisiaj tyle 🙂

Aha, jedna uwaga. Wspominałem już kiedyś, ale to olałeś rzadkim strumieniem - w efekcie niestety możesz się spodziewać tego, że program nie będzie działać.

Poprawny kod odpowiedzi HTTP to nie jest cokolwiek większego od zera ale konkretna wartość 200. Skąd ta wartość? A choćby stąd.

Jeśli np. serwer Supli dostanie czkawki możesz spodziewać się kodu 5xx, który jest oczywiście większy od zera, ale sygnalizuje błąd serwera (czyli żadnego jsona tam nie będzie). Radosne założenie że serwer zawsze zwraca prawidłowe dane jest niestety błędne.

 

  • Pomogłeś! 2
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.