tag:forum.selfhtml.org,2005:/self Zeichenketten, Arrays mit Zeichen in c dynamisch füllen – SELFHTML-Forum 2019-01-01T16:25:15Z https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739595#m1739595 pl 2018-12-29T18:24:06Z 2018-12-29T18:24:06Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Sozusagen ein push. Problem: Die Anzahl der Zeichen die da kommen ist zum Zeitpukt der Deklaration des Datentyps nicht bekannt.</p> <p>Lösung: Einen Pointer deklarieren, später für die Zeichenkette Stück für Stück neuen Speicher anfordern und die anzufügenden Zeichen da reinkopieren.</p> <p>Nun, ich komme da einfach nicht weiter, kann mir da mal jemand auf die Sprünge helfen?</p> <p>MfG</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739597#m1739597 encoder 2018-12-29T19:03:11Z 2018-12-29T19:06:52Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Den entscheidenden Schritt sehe ich so.</p> <ul> <li>Bisherigen Pointer merken.</li> <li>Neuen größeren Speicherbereich anfordern.</li> <li>Daten vom alten in den neuen Speicher kopieren.</li> <li>alten Speicher freigeben.</li> </ul> <p>Beim durchdenken stellt man beim kopieren fest dass man den bisherigen Pointer noch braucht, nachdem man den neuen Speicherbereich angelegt hat.</p> <p>Damit du weißt wie viele Zeichen schon belegt sind und wo du weiter anfügen kannst, musst du natürlich die Länge des Strings merken. Und die verfügbare Maximalgröße.</p> <p>Manche Sprachen die Strings kennen reservieren sich beim vergrößern gleich mehr Speicher als aktuell nötig. Damit kannst du dir ständiges umkopieren sparen.<br> Was sagt deine Suchmaschine zu "c string implementation"? Ich sehe die Chance etwas fertiges zu finden das du entweder direkt einsetzen kannst, oder du kannst dir relevante Teile abschauen.</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739600#m1739600 JürgenB https://www.j-berkemeier.de 2018-12-29T21:27:36Z 2018-12-29T21:27:36Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Hallo,</p> <p>kann es sein, das du <a href="https://en.cppreference.com/w/c/memory/realloc" rel="nofollow noopener noreferrer">realloc</a> suchst?</p> <p>Gruß<br> Jürgen</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739604#m1739604 Robert B. 2018-12-30T00:03:17Z 2018-12-30T00:03:17Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Moin pl,</p> <p>mit C++ lässt sich aus deinem Problem …</p> <blockquote> <p>Die Anzahl der Zeichen die da kommen ist zum Zeitpukt der Deklaration des Datentyps nicht bekannt.</p> </blockquote> <p>… eines der Standardbibliothek machen:</p> <pre><code class="block language-c++"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sstream></span></span> std<span class="token double-colon punctuation">::</span>ostringstream puffer<span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token comment">/* immer wieder neue Daten */</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> puffer <span class="token operator"><<</span> daten<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Abschließend:</span> std<span class="token double-colon punctuation">::</span>string <span class="token function">pufferInhalt</span><span class="token punctuation">(</span>puffer<span class="token punctuation">.</span><span class="token function">str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Viele Grüße<br> Robert</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739616#m1739616 pl 2018-12-30T08:00:39Z 2018-12-30T08:00:39Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Hi Jürgen,</p> <blockquote> <p>kann es sein, das du <a href="https://en.cppreference.com/w/c/memory/realloc" rel="nofollow noopener noreferrer">realloc</a> suchst?</p> </blockquote> <p>Des isses!!! Danke Dir!</p> <p>Und natürlich auch Danke an die Anderen hier!</p> <p><a href="http://rolfrost.de/fwinc.html" rel="nofollow noopener noreferrer">Worums geht</a> is klar ne </p> <p>Konkret gehts um den Parser, Enctype vorerst <code>application/x-www-form-urlencoded</code> und da die Parameter prozentkodiert sind, gibts Verschnitt. Dh. wenn für <code>%E2%82%AC</code> (Eurozeichen) Speicher allociert wird, werden für die Verarbeitung letztendlich nur 3 Bytes benötigt.</p> <p>Mein Perl Framework in c, echt der Hammer, läuft auf meiner alten Kiste 10x schneller als in Perl.</p> <p>Schönen Sonntag!</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739611#m1739611 Tabellenkalk 2018-12-30T06:16:25Z 2018-12-30T06:16:25Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Hallo,</p> <blockquote> <p>mit C++ lässt sich aus deinem Problem …</p> </blockquote> <p>Du darfst doch auf eine c-Frage nicht mit cpp antworten!</p> <p>Das wäre ja so ungefähr, als ob jemand auf ne perl-Frage mit PHP antwortete…</p> <p>Scnr</p> <p>Gruß<br> Kalk</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739621#m1739621 pl 2018-12-30T10:03:46Z 2018-12-30T10:03:46Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>hi <a href="/users/6916" class="mention registered-user" rel="noopener noreferrer">@Robert B.</a></p> <p>c++ kommt auch noch dran. Das eigentlich Interessante ist, beim Bau meines FW in veschiedenen PLs sehe ich immer wieder mal Fehler die ich in den anderen PLs gemacht habe.</p> <p>Schönen Sonntag!</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739622#m1739622 Robert B. 2018-12-30T10:21:10Z 2018-12-30T10:21:10Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Moin,</p> <p>ein standardkonformer C++-Compiler kann auch C fehlerfrei und ordnungsgemäß kompilieren.</p> <p>Viele Grüße<br> Robert</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739625#m1739625 Robert B. 2018-12-30T10:24:50Z 2018-12-30T10:24:50Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Moin pl,</p> <p>für den Anwendungsfall,</p> <blockquote> <p>Konkret gehts um den Parser, Enctype vorerst <code>application/x-www-form-urlencoded</code> und da die Parameter prozentkodiert sind, gibts Verschnitt. Dh. wenn für <code>%E2%82%AC</code> (Eurozeichen) Speicher allociert wird, werden für die Verarbeitung letztendlich nur 3 Bytes benötigt.</p> </blockquote> <p>könntest du theoretisch ganz konservativ auch einfach genau so viel Speicher belegen, wie der Prozent-kodierte String hat, da dessen Länge ja größer bzw. gleich der Länge des Zielstrings ist. Wie viele NULL-Bytes am Ende eines Strings stehen, wenn der Zielstring kürzer ist, macht dem späteren <code>free</code> nichts aus.</p> <p>Viele Grüße<br> Robert</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739677#m1739677 Rolf B 2018-12-30T19:26:09Z 2018-12-30T19:26:09Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Hallo pl,</p> <p>Vorsicht. realloc kann den Speicherbereich an eine andere Stelle verlegen. Gespeicherte Pointer darauf werden dadurch ungültig.</p> <p>Es wäre sinnvoll, relozierbare Strings durch ein Handle zu repräsentieren, hinter dem eine struct mit Länge und Zeiger auf den eigentlichen String steckt. Dein Code operiert nur mit dem Handle, und Manipulationen sind nur von dafür gemachten Funktionen zulässig. Kannst du in C nicht gut forcieren, aber beim Programmieren drauf achten.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739626#m1739626 Robert B. 2018-12-30T10:25:59Z 2018-12-30T10:25:59Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Moin pl,</p> <blockquote> <p>c++ kommt auch noch dran. Das eigentlich Interessante ist, beim Bau meines FW in veschiedenen PLs sehe ich immer wieder mal Fehler die ich in den anderen PLs gemacht habe.</p> </blockquote> <p>na dann weiterhin viel Spaß daran und wenn Fragen sind, immer gerne her damit!</p> <p>Auch dir einen schönen Sonntag<br> Robert</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739633#m1739633 pl 2018-12-30T12:46:26Z 2018-12-30T12:46:26Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>hii <a href="/users/6916" class="mention registered-user" rel="noopener noreferrer">@Robert B.</a></p> <blockquote> <p>für den Anwendungsfall,</p> <blockquote> <p>Konkret gehts um den Parser, Enctype vorerst <code>application/x-www-form-urlencoded</code> und da die Parameter prozentkodiert sind, gibts Verschnitt. Dh. wenn für <code>%E2%82%AC</code> (Eurozeichen) Speicher allociert wird, werden für die Verarbeitung letztendlich nur 3 Bytes benötigt.</p> </blockquote> <p>könntest du theoretisch ganz konservativ auch einfach genau so viel Speicher belegen, wie der Prozent-kodierte String hat, da dessen Länge ja größer bzw. gleich der Länge des Zielstrings ist.</p> </blockquote> <p>Genau das macht mein <a href="http://rolfrost.de/fwinc.html" rel="nofollow noopener noreferrer">Parser</a>. Genauer gesagt, wird zum Reservieren die Länge des ganzen Paar <code>name=value</code> genommen. Was auch nicht weiter tragisch ist, weil <code>name</code> i.d.R. kurz gehalten wird. Da kommt es auf ein paar Bytes mehr oder weniger auch nicht an. Von daher kann für <code>name</code> eine feste Länge vorgegeben werden, z.B. [32] und für <code>value</code> eben alles zusammen.</p> <blockquote> <p>Wie viele NULL-Bytes am Ende eines Strings stehen, wenn der Zielstring kürzer ist, macht dem späteren <code>free</code> nichts aus.</p> </blockquote> <p>Ja, das <code>free</code> muß ich noch einbauen. Zumindest kann der Speicher für den prozentkodierten String nach dem <code>decode</code> wieder freigegeben werden.</p> <p>MfG</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739634#m1739634 pl 2018-12-30T13:12:54Z 2018-12-30T13:12:54Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>wow danke Dir <a href="/users/6916" class="mention registered-user" rel="noopener noreferrer">@Robert B.</a></p> <p>Im Grunde genommen ist mein FW ja objektorientiert: Routingtable und Konfiguration sind als Objekte in einer Binary eingefroren. EAV ist das Muster der Struktur, Entity ist z.B. <code>/index.html</code>, <code>class</code> wäre ein Attribut und <code>Public::Class::Name</code> der Value dazu. In c spielt zwar das Attribut <code>class</code> keine Rolle, aber es gibt ja weitere Eigenschaften wie <code>title</code> und <code>descr</code>. Und ggf. ein Dateiname fürs Template.</p> <p>Natürlich können diese Eigenschaften auch !OOP verarbeitet werden, denn für den wahlfreien Zugriff (Random Access) liegt ja alles griffbereit im Hauptspeicher.</p> <p>So hat die main in c nur ganze 20 Zeilen, das ist das eigentliche FW, also der Kern. In Perl ist das nicht viel anders, nur daß mit OOP der ganze Code besser organisiert werden kann.</p> <p>Mal sehen, was sich in c++ da machen lässt. Ismir auf jeden Fall 1000x lieber als Java, aber in Java ist mein FW sicher auch machbar, davon bin ich überzeugt.</p> <p>Jetzt vollende ich erstmal den Parser, das Array für mehrere gleichnamige Parameter ist noch offen. Ansonsten funktioniert der Parser einwandfrei für den Default Enctype in POST und GET </p> <p>omit ich mich ganz bestimmt nicht mehr befassen werde ist der Enctype multipart/form-data, für den habe ich längst einen bessere Ersatz und die clientseitigen JS Libraries dazu. Dieser neue Enctype heißt <code>multipart/slice-data</code> <a href="http://rolfrost.de/multipart_slice_data.html" rel="nofollow noopener noreferrer">hier beschrieben</a>. Und der ist auch in c total einfach zu parsen.</p> <p>MfG</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739686#m1739686 pl 2018-12-31T08:30:35Z 2018-12-31T08:30:35Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>ich werd mal damit spielen. c ist bekanntlich sehr pragmatisch was den Umgang mit Speicher betrifft. Die erste gute Übung beim Umsetzen meines FW von Perl nach c war das Einlesen der Binary auf eine verkettete Liste. Gute Übung deswegen weil ich dabei wieder lerne wie c tickt und warum es überhaupt numerische Datentypen gibt: Wegen der exakten Anzahl der Bytes!</p> <p>Und so liegt in c eine Binary genauso im Hauptspeicher wie sie in einer Datei eingefroren ist, nur daß da eben noch die Symboltabelle dazu ins Spiel kommt was den random Access ermöglicht.</p> <p>Aus diesem Grund eignet sich c ausgzeichnet zum Verarbeiten von Binärsequenzen. Beim Entwickeln meines CGI Parsers musste ich mal wieder feststellen wie grottig+schrottig der Enctype application/x-www-form-urlencoded ist und für die Anderen wie JSON, XML, multipart/form-data trifft dasselbe zu.</p> <p>Formulardaten als proprietären Enctype <code>binary/name+value</code> zu verarbeiten ist da viel effizienter, der wird ganz einfach sequentiell aus <code>stdin</code> gelesen und einen solchen Enctype mit modernen JS zu erzeugen ist auch seit Jahren möglich. Fileuploads inbegriffen, serverseitig steht der Dateiinhalt in <code>value</code> und zwar ohne vorher den Server zu vergewaltigen oder mit temporären Dateien vollzumüllen.</p> <p>Plan für heute, danach das Array (realloc oder memcpy)</p> <p>MfG</p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739728#m1739728 pl 2019-01-01T16:25:15Z 2019-01-01T16:27:36Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <p>danke für Deine Hinweise. Hier mal ein typischer Fehler:</p> <pre><code class="block language-c"> <span class="token comment">// betrifft: Templatedatei</span> filecontent <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">malloc</span><span class="token punctuation">(</span>filesize<span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Das Übliche: Terminierung vergessen. Das Tückische: Der Fehler wird nicht gleich bemerkt! Hat mich 3 Tage gekostet, der Fehler trat sporadisch auf, das P ist einfach abgeschmiert, rein zufällig bei bestimmten GET oder POST Parametern.</p> <p>Als ich das Formular um AJAX erweitert habe, wunderte ich mich, daß bei denselben Parametern kein Absturz erfolgte. Das hat mich dann dahin geführt wo es passiert, Lösung: mit <code>malloc(filesize +1)</code> den Platz für die Nullterminierung anfordern und den String terminieren.</p> <p>Läuft wie geschmiert jetzt </p> <p>Was ich am FW in c anders mache als im Perl-FW: Ausgaben gehen gleich raus auf stdout. In Perl hingehen hab ich das alles erst gepuffert.. nun Beides hat seine Vor und Nachteile. Die Arbeitsweise der Templatemachine <code>ctemplate</code> läßt jedoch gar keine andere Arbeitsweise zu, letztendlich führt es grundsätzlich zu einem Transfer-Encoding: chunked.</p> <p>Der Vorteil in c: Ich kann mit fwrite() arbeiten und Binärdaten ausgeben. Interessant für AJAX, einen JSON direkt auf stdout auszugeben geht natürlisch auch.</p> <p>Schluß für Heute </p> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739691#m1739691 Rolf B 2018-12-31T10:39:31Z 2018-12-31T10:39:31Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>Hallo pl,</p> <blockquote> <p>grottig+schrottig der Enctype application/x-www-form-urlencoded</p> </blockquote> <p>Du musst bedenken, wann und wofür das gemacht wurde. ASCII Zeichen 0x20 bis 0x7f sind so ziemlich die einzige Codierung, die auf jeder Maschine verstanden wird und die sich halbwegs sicher in andere Codierungen übersetzen lässt. Diese Dinge stammen aus den 70ern, teilweise vermutlich sogar aus den 60ern.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2018/dec/29/zeichenketten-arrays-mit-zeichen-in-c-dynamisch-fuellen/1739694#m1739694 pl 2018-12-31T11:58:34Z 2018-12-31T11:58:34Z Zeichenketten, Arrays mit Zeichen in c dynamisch füllen <p>hi <a href="/users/6547" class="mention registered-user" rel="noopener noreferrer">@Rolf B</a></p> <blockquote> <blockquote> <p>grottig+schrottig der Enctype application/x-www-form-urlencoded</p> </blockquote> <p>Du musst bedenken, wann und wofür das gemacht wurde. ASCII Zeichen 0x20 bis 0x7f sind so ziemlich die einzige Codierung, die auf jeder Maschine verstanden wird und die sich halbwegs sicher in andere Codierungen übersetzen lässt. Diese Dinge stammen aus den 70ern, teilweise vermutlich sogar aus den 60ern.</p> </blockquote> <p>Das kann ich nicht nachvollziehen. Die Prozentkodierung für obenstehenden Enctype hat nämlich mit der Zeichenkodierung gar nichts zu tun weil nicht die Zeichen sondern die Bytes prozentkodiert werden. Beispiel Eurozeichen <code>%E2%82%AC</code> in UTF-8</p> <p>Decode stellt daraus die Bytes wieder her und denen ist es egal was sie darstellen. Genauso wie einem jeden Parser die Zeichenkodierung völlig Wurst ist, weil Parser bytesemantisch arbeiten. Und eine Bytesequenz aus STDIN lesen geht seit Kerninghan+Richie c entwickelt haben.</p> <p><a href="http://rolfrost.de/fwinc.html#parser" rel="nofollow noopener noreferrer">Mein neuer Enctype</a> funktioniert auf Byteebene und das einwandfrei und weit weniger umständlich als ein Parser für obenstehenden Enctype. Einzig die Bowser sind es die mal wieder der Zeit völlig hinterherhinken.</p> <p>MfG</p>