INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Frage der Optimierung String - char[n]
08.03.2020, 12:30 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2020 12:59 von bytecook.)
Beitrag #1
Question Frage der Optimierung String - char[n]
Hi Leute,
ich möchte so sparsam wie möglich mit dem verfügbaren Speicher umgehen. Ich bin noch nicht wirklich so in C++ versiert, vielleicht könnt ihr mir hier weiterhelfen.

Code:
String encodeSerCmd(int8_t iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
  char retStr[40];
  sprintf(retStr, "%d;%d;%d;%d;%d;%d;%d\0", 255, iCmd, iP1, iP2, iP3, iP4, 254);
  return retStr;
}

Meine Beispielsfunktion castet retStr auf String, der vermutlich mehr Speicher verbrauchen wird als ein Array of Char. Die Routine an sich funktioniert, das geht aber sicher eleganter und sparsamer, vermutlich kann man die Daten auch als Pointer zurückgeben. Da hakt es bei mir noch ein wenig. Kann mir wer die Richtung weisen?

Update --

hätte jetzt mal als den Rückgabetyp char* probiert, und diesen dann wie folgt verwendet - leider ohne Erfolg...

Code:
void loop() {
  char arrChars[40];
  *arrChars = encodeSerCmd(1, vP1, 0, 0, 0);
  vP1++;
  Serial.println(arrChars);
  ..
}

Vermutlich mache ich beim Dereferenzieren nur was falsch ...

Update --

Danke vorab,

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 17:29
Beitrag #2
RE: Frage der Optimierung String - char[n]
Wenn Du Speicher sparen willst, vergiss String.

Den Puffer (Anzahl Nutzzeichen +1) entweder static oder global anlegen, sonst funktioniert das mit der Rückgabe nicht.

Beispiel:

Code:
char arrChars[40];

char *encodeSerCmd(char * buf, iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
  sprintf(buf, "%d;%d;%d;%d;%d;%d;%d", 255, iCmd, iP1, iP2, iP3, iP4, 254);
  return buf;
}

// Aufruf:
char * cmd = encodeSerCmd(arrChars,1, vP1, 0, 0, 0);

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 19:21
Beitrag #3
RE: Frage der Optimierung String - char[n]
(08.03.2020 17:29)Tommy56 schrieb:  Wenn Du Speicher sparen willst, vergiss String.

Den Puffer (Anzahl Nutzzeichen +1) entweder static oder global anlegen, sonst funktioniert das mit der Rückgabe nicht.

Beispiel:

Code:
char arrChars[40];

char *encodeSerCmd(char * buf, iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
  sprintf(buf, "%d;%d;%d;%d;%d;%d;%d", 255, iCmd, iP1, iP2, iP3, iP4, 254);
  return buf;
}

// Aufruf:
char * cmd = encodeSerCmd(arrChars,1, vP1, 0, 0, 0);

Gruß Tommy

Ha,das wusste ich nicht, danke Tommy. Wenn der Buffer ohnehin global wäre,
reicht ja eine Void, also

Code:
void encodeSerCmd(uint8_t iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
  sprintf(bufferSerCmd, "%d;%d;%d;%d;%d;%d;%d\0", 255, iCmd, iP1, iP2, iP3, iP4, 254);
}

Die Nullterminierung ist bereits mitberücksichtigt, hatte nur vergessen, die erste Variable auf unsigned umzustellen, sind ohnehin nur ca. 150 Befehle, man spart wo man kann Smile

Naja, muss mich mehr in das Thema einlesen, aber der Ansatz passt schon mal...

Gruß,

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 19:23
Beitrag #4
RE: Frage der Optimierung String - char[n]
Ja, Rückgabetyp void geht auch, aber mit char * kannst Du das schnell mal in Serial Print werfen oder verketten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 20:02
Beitrag #5
RE: Frage der Optimierung String - char[n]
(08.03.2020 19:23)Tommy56 schrieb:  Ja, Rückgabetyp void geht auch, aber mit char * kannst Du das schnell mal in Serial Print werfen oder verketten.

Gruß Tommy

Hmm, die Rückantwort war bei mir immer leer. Irgendwie hatte ich da was falsch gemacht, vermutlich beim Dereferenzieren.

Mittlerweile gelesen, dass ich unter C++ mit der Rückgabe eines lokalen Char Arrays doch recht fesch die eine oder andere Designregel verletze. Ich glaube, ich muss mir einfach damit behelfen, Arrays in Structs zu legen oder mir damit Records anlegen...

Ich bin ja im Beruf von Delphi her echt verwöhnt Smile

Gruß,

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 20:15
Beitrag #6
RE: Frage der Optimierung String - char[n]
Wird Delphi noch aktiv für Neuentwicklungen eingesetzt? Früher ™ habe ich damit auch gearbeitet.

Ansonsten kannst Du auch die static-Variante benutzen:

Code:
char *encodeSerCmd(iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
static char buf[40];
  sprintf(buf, "255;%d;%d;%d;%d;%d;%d", iCmd, iP1, iP2, iP3, iP4, 254);
  return buf;
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 20:53
Beitrag #7
RE: Frage der Optimierung String - char[n]
(08.03.2020 20:15)Tommy56 schrieb:  Wird Delphi noch aktiv für Neuentwicklungen eingesetzt? Früher ™ habe ich damit auch gearbeitet.

Ansonsten kannst Du auch die static-Variante benutzen:

Code:
char *encodeSerCmd(iCmd, int16_t iP1, int16_t iP2, int16_t iP3, int16_t iP4) {
static char buf[40];
  sprintf(buf, "255;%d;%d;%d;%d;%d;%d", iCmd, iP1, iP2, iP3, iP4, 254);
  return buf;
}

Gruß Tommy

Hehe, ja, warum auch nicht, sogar im technischen Bereich. Vorausgesetzt, man verwendet bei echt kritischen Routinen den Inline Asm Smile

Baue in meinem Bereich recht viele wiederverwendbare Softwarekomponenten inkl. eigenes Guiframework, ursprünglich basierend auf GR32.

Gruß an einen "alten" Delphianer,

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.03.2020, 20:58
Beitrag #8
RE: Frage der Optimierung String - char[n]
Grüße zurück, ich bin da mittlerweile raus.
Ich hatte Delphi hauptsächlich als Frontend für ORACLE-PL/SQL im Einsatz. Das könnte man problemlos durch ein Webfrontend ersetzen, der Kunde wollte eine Applikation. Da hat er halt diese bekommen.

Privat habe ich noch ein paar kleinere Delphi 5 Sachen am Laufen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Anfänger Frage zu code Beispiel peter_schmieg 4 213 03.03.2021 12:24
Letzter Beitrag: Tommy56
  char return Werte sind komplett falsch flowmotion 8 527 12.02.2021 22:27
Letzter Beitrag: Tommy56
  Template Datentype mit decltype prüfen - error: cannot convert 'bool' to 'char*' flowmotion 2 264 09.02.2021 18:57
Letzter Beitrag: flowmotion
  const char zu int Konvertierung Problem Lumplux 1 208 02.02.2021 10:26
Letzter Beitrag: Lumplux
  grundelegende Frage: int vs const int mhoeting 4 290 27.01.2021 14:37
Letzter Beitrag: mhoeting
  Frage zu Delay-Alternative Holzwurm56 13 765 24.01.2021 21:55
Letzter Beitrag: Franz54
  Füllstand mit RGB visualisieren [FRAGE] Dukopfo 3 364 27.12.2020 13:53
Letzter Beitrag: Tommy56
  Frage zur <Adafruit_PWMServoDriver.h> Christian_Moba-Arduino 7 647 16.10.2020 12:32
Letzter Beitrag: Tommy56
  Benötige dringende Hilfe bei CHAR DO3GE 4 565 07.10.2020 10:41
Letzter Beitrag: Tommy56
  Problem mit AnotherIFTTTWebhook | cannot convert 'const char*' to 'char*' dani 3 481 02.10.2020 11:21
Letzter Beitrag: dani

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste