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
String falsch verstanden?
07.07.2015, 10:39 (Dieser Beitrag wurde zuletzt bearbeitet: 07.07.2015 10:57 von HaWe.)
Beitrag #9
RE: String falsch verstanden?
danke für den Tipp!
Da erkennt man den Fachmann! 8-)

ich dachten man müsste für die Zwischen-Teil-Strings Speicherplatz allozieren und setze dann bufptr auf den Anfang dieses Speicherbereichs. Aber wenn das mit va_arg automatisch passiert - um so besser! Smile

dann also so:

Code:
char * stradd(char * s, int n, ...) // s=Gesamtstring , n=Anzahl in Liste, ... = string Liste
{
   va_list vlst;
   int i;

   char * bufptr;
   char * retptr = s;

   va_start(vlst, n);
   for (i=1; i<=n; ++i) {
      bufptr = va_arg(vlst, char *);
      strcat(s, bufptr);
   }
   va_end(vlst);
   return retptr;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 10:45
Beitrag #10
RE: String falsch verstanden?
(07.07.2015 10:39)HaWe schrieb:  ich dachten man müsste für die Zischen-Teil-Strings Speicherplatz allozieren und setze dann bufptr auf den Anfang dieses Speicherbereichs. Aber wenn das mit va_arg automatisch passiert - um so besser! Smile
Der Speicher für die Teil-Strings wird ja schon da reserviert, wo die String-Konstanten im Aufruf stehen. D.h. die Teil-Strings stehen auf dem Heap. Dann wird jeweils ein Zeiger darauf als Aktualparameter auf den Stack gelegt. Diese Zeiger werden von va_arg zurückgeliefert. Die Teil-Strings werden nie kopiert.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 10:52
Beitrag #11
RE: String falsch verstanden?
ja, ok - aber Speicherplatz auf dem Heap muss nicht reserviert werden, alternativ mit malloc()?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 11:04
Beitrag #12
RE: String falsch verstanden?
(07.07.2015 10:52)HaWe schrieb:  ja, ok - aber Speicherplatz auf dem Heap muss nicht reserviert werden, alternativ mit malloc()?
Hä?
Wenn Du sowas hinschreibst:
Code:
char blabla[] = "HalloHallo";
...dann wird das "HalloHallo" soweit ich weiß auf den Heap geschmissen, es wird also sozusagen implizit ein malloc gemacht. Die Variable blabla enthält nur einen Pointer darauf.
So etwas ähnliches passiert, wenn Du eine Funktion mit einem char*-Parameter aufrufst:
Code:
myFunction("HalloHallo");
Dadurch liegt die String-Konstante "HalloHallo" auf dem Heap und auf dem Stack innerhalb von myFunction liegt nur ein Zeiger darauf.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 11:14 (Dieser Beitrag wurde zuletzt bearbeitet: 07.07.2015 11:20 von HaWe.)
Beitrag #13
RE: String falsch verstanden?
ja, das mit
char blabla[] = "HalloHallo";
myFunction("HalloHallo");

ist natürlich klar, da gebe ich die Konstante ja gleich mit an und ea ist dann ja die Größe bekannt.

dass das für
bufptr = va_arg(vlst, char *);
wo doch die Übergabe-Variable char* noch eine unbekannte Größe hat und also auch die Rückgabevariable bufptr noch undefiniert lang ist, dies aber von va_arg automatisch beim Lesen aus der Liste gehändelt wird, das war mir nicht klar.
Idea
Jetzt aber schon, denn in der Liste wird dieses char * ja ebenfalls samt Speicher mit übergeben!
Idea
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 11:18
Beitrag #14
RE: String falsch verstanden?
(07.07.2015 11:14)HaWe schrieb:  dass das für
bufptr = va_arg(vlst, char *);
wo doch die Übergabe-Variable char* noch eine unbekannte Größe hat
Nein, die Größe ist schon zur Compile-Zeit bekannt. Auf 16-Bit-Maschinen sind es zwei Byte und auf 32-Bit-Maschinen 4 Byte. Du verwechselst einen Zeiger mit dem, worauf er zeigt. Eine char*-Variable ist nur ein Zeiger. Die Länge davon ist fix.

Zitat:und also auch die Rückgabevariable bufptr noch undefiniert lang ist, dies aber von va_arg automatisch beim Lesen aus der Liste gehändelt wird, das war mir nicht klar.
va_arg kopiert nur dumm, was auf dem Stack steht mit sizeof(char*). Das sind dann eben 2 oder 4 Byte.

Zitat:Idea
Jetzt aber schon, denn in der Liste wird dieses char * ja ebenfalls samt Speicher mit übergeben!
Idea
Nein, einfach nur der char*, sonst nichts.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 11:21 (Dieser Beitrag wurde zuletzt bearbeitet: 07.07.2015 11:22 von HaWe.)
Beitrag #15
RE: String falsch verstanden?
nein, ich meinte:
das, worauf char * zeigt, wird in der Parameterliste mit übergeben, und da hat es ja seinen Speicherplatz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.07.2015, 11:45
Beitrag #16
RE: String falsch verstanden?
(07.07.2015 11:21)HaWe schrieb:  das, worauf char * zeigt, wird in der Parameterliste mit übergeben,
Nein, wird es nicht. Es wird nur der char* übergeben.

Zitat:und da hat es ja seinen Speicherplatz
Du meinst in der Parameterliste? Nein, da ist nur der Zeiger (also die 2 oder 4 Byte).

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  String / HTTP Request Marc2014 2 66 Gestern 09:05
Letzter Beitrag: amithlon
  String zusammensetzen Mathias 13 554 01.09.2016 21:15
Letzter Beitrag: Mathias
  String-Array füllen? torsten_156 9 452 08.07.2016 20:07
Letzter Beitrag: amithlon
  String in EEPROM Speichern BennIY 2 416 27.06.2016 10:23
Letzter Beitrag: BennIY
  String - Buchstabenposition auswerten scritch 5 666 01.04.2016 16:25
Letzter Beitrag: rkuehle
  String nach UTF16 konvertieren (UTF-16) ThoEngel 0 301 20.02.2016 19:22
Letzter Beitrag: ThoEngel
  OLED Display anzeige von Logo falsch ! b3ta 0 339 23.01.2016 15:12
Letzter Beitrag: b3ta
Exclamation String Zerlegen in drei Variablen Wampo 4 852 28.12.2015 01:07
Letzter Beitrag: Wampo
  Integer nach Ascii-String ? itoa arduinofan 2 594 22.12.2015 15:34
Letzter Beitrag: arduinofan
  Umwandlung von Array in String Wampo 2 530 09.12.2015 21:58
Letzter Beitrag: Wampo

Gehe zu:


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