![]() |
Re: PChar: Zeichen rechts abschneiden?
Moin Marabu,
das ist mir (noch?) ein bisschen zu hoch, aber nochmal einfach gestellt ;) : Könnte ein Zugriff auf ein Zeichen VOR dem String je einen Fehler verursachen oder kann ich da immer problemlos drauf zugreifen? Es geht mir nur darum das di Funkktion natürlich keine AVs erzeugt ;) |
Re: PChar: Zeichen rechts abschneiden?
|
Re: PChar: Zeichen rechts abschneiden?
Ja, kann. Bzw. wird irgendwann garantiert.
|
Re: PChar: Zeichen rechts abschneiden?
Zitat:
marabu |
Re: PChar: Zeichen rechts abschneiden?
@bigg: Guck ich mir an, danke ;)
@Dax: Danke für die Info. @marabu: auf irgendeinzeichen davor ;) Ich denke ja das wir nichtmehr im string sind wenn wir unter dem ersten zeichen sind oder? So sah meine Funktion aus, die alle Zeichen links gelöscht hat:
Delphi-Quellcode:
Die wollte ich nun nochmal (selbst) so schreiben, das rechts gelöscht wird statt links, aber da wir ja am Anfang des Strings kein #0 Zeichen haben, bin ich daran bis jetzt gescheitert :\
function StripCharsLeft(const S: string; CharSet: TCharSet): string;
var PResIdx: PChar; PSIdx: PChar; Idx: Integer; SLen: Integer; begin SetLength(Result, Length(S)); if S <> '' then begin PResIdx := @Result[1]; PSIdx := @S[1]; Idx := 0; SLen := Length(S); while (PSIdx^ <> #0) and (PSIdx^ in CharSet) do begin Inc(PSIdx); Inc(Idx); end; if PSIdx^ <> #0 then begin CopyMemory(@Result[1], PSIdx, SLen-Idx); SetLength(Result, SLen-Idx); end; end; end; Zitat:
Zitat:
Danke auch Dir ;) |
Re: PChar: Zeichen rechts abschneiden?
Den scheinbaren Widerspruch in den beiden von mir zitierten Aussagen möchte ich dann doch noch erklären:
Mit "klar doch" wollte ich zum Ausdruck bringen, dass dich der Compiler bei der Programmerstellung nicht daran hindert Zugriffe außerhalb deines strings zu machen. Das ist gewissermaßen die "innere" Sicht. Ich habe ja auch geschrieben, wo du da eventuell landest. Zur Verdeutlichung ein Stück Code aus vergangenen Zeiten:
Delphi-Quellcode:
In meinem späteren Beitrag habe ich die "äußere" Sichtweise eingenommen. Die Funktionen zum Umgang mit sz-strings und big strings basieren auf Konventionen - nach dem terminierenden #0 ist der string zu Ende und vor dem string liegender Speicher ist tabu. Man hält sich daran oder man weiß ganz genau was man da tut. Klar, dass systemnahes Programmieren mitunter auch zu implementationsabhängigem Code führen kann. Du solltest sowas aber weitgehend vermeiden.
function AllocString(size: cardinal): PChar;
var pCard: ^Cardinal; begin pCard := AllocMem(size + 2 * SizeOf(Cardinal)); pCard^ := size; Inc(pCard); pCard^ := 0; // length Inc(pCard); Result := Pointer(pCard); end; Viel Spaß noch beim Arbeiten mit Zeigern. marabu PS: hast du der Schildkröte ein i geklaut oder ist das ein falscher Verdacht von mir? |
Re: PChar: Zeichen rechts abschneiden?
Zitat:
Im PM sagt man zu cs, ds, es, fs usw. ja nicht umsonst "Segment-Deskriptoren", obwohl es doch keine Segmente mehr gibt :zwinker: Zitat:
Hinweis: manche Stacks sind so implementiert, daß sie wachsen wenn eine Exception ausgelöst wurde. In diesem Fall wird die Exception vor dem Programm versteckt und intern genutzt um den Stack dynamisch zu vergrößern. Ich persönlich benutze das gerade für ein speichersparendes Modell von Molekülen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz