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
  Arrays of String in C Diskusguppy 3 89 Gestern 10:12
Letzter Beitrag: Diskusguppy
  String nach Byte Array in ASCII-Codierung nexus1212 7 442 05.11.2017 14:36
Letzter Beitrag: Tommy56
  String vergleichen georg01 15 1.176 18.07.2017 20:35
Letzter Beitrag: Tommy56
  String.charAt() ardun 3 437 02.07.2017 15:28
Letzter Beitrag: Tommy56
  Aus char string machen metzgefa 1 526 06.05.2017 15:15
Letzter Beitrag: Tommy56
  String übergeben oOSpikeOo 9 973 28.03.2017 19:47
Letzter Beitrag: georg01
  String in tinygps++ einlesen hoko 17 1.451 07.03.2017 15:40
Letzter Beitrag: hoko
  String -> Char *gelöst* Binatone 2 642 31.01.2017 11:08
Letzter Beitrag: Binatone
  ascii string to int array konvertieren renid55 3 751 29.12.2016 11:49
Letzter Beitrag: Tommy56
  String / HTTP Request Marc2014 4 831 23.12.2016 15:42
Letzter Beitrag: Tommy56

Gehe zu:


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