![]() |
Eigener String-Typ
Hi, heute hab ich mal eine Frage, auf die es wahrscheinlich keine brauchbare Antwort für mich gibt.
Ich versuch es aber trotzdem einmal (vielleicht hab ich ja Glück). Ist es möglich, meinen eigenen String-/Text-Typ zu erstellen OHNE einen Pascal-Array zu verwenden? Ich stelle die Frage deshalb, weil ich einen Typ benötige, der als Array angesprochen werden kann, der aber nicht das erste Byte für die Länge verbraucht. Also wie in C/C++, einfach einen String, der mit einem #0 endet. Ich weiß, das diese Frage komisch ist, aber vielleicht kann mir jemand helfen, dem ich sehr dankbar wäre. |
Re: Eigener String-Typ
Einen eigenen Typ wirst du sicher nicht in den Compiler integrieren können, aber was spricht gegen
![]() |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Ist doch eine Frage zu Delphi.. oder? |
Re: Eigener String-Typ
Aber da kommt das Problem auf, dass ich das nicht kann:
Delphi-Quellcode:
procedure XYZ(c: PChar);
Delphi-Quellcode:
...
XYZ(PChar('MeinText')); |
Re: Eigener String-Typ
Achso, wenn ich 'MeinText' übergebe, wird da ja auch das LängenByte angefügt (denk ich), oder?
Wenn, dann läuft das doch nicht so, wie ich das gern hätte |
Re: Eigener String-Typ
Delphi-Quellcode:
:gruebel:
Var
MyString: String[25]; Zitat:
|
Re: Eigener String-Typ
Der enthält doch auch das LängenByte.
|
Re: Eigener String-Typ
Naja, dann geht es halt nur noch mit PChar's array [0..] of PChar. Da lässt sich doch auch mit arbeiten. ;)
//Edit: Die Beiträge lassen sich auch editieren. ;) |
Re: Eigener String-Typ
Zitat:
|
Re: Eigener String-Typ
Und wie ist es bei der Konstante 'MyText'?
Hat die ein LängenByte? Wenn ihr Links zum Thema habt, könnt ihr die mir geben -> würde mich sehr freuen //Edit: Auch Konstanten haben ein LängenByte -> Getestet mit 'MeinText'[1], bei [0] gibt es einen Fehler. |
Re: Eigener String-Typ
Jupp, ein Literal hat auch das Längenbyte. Aber was stört dich eigentlich daran :wink: ? Wenn es unbedingt ohne Längenbyte sein soll, kannst du solch eine Konstante deklarieren:
Delphi-Quellcode:
const Digits: array[0..9] of Char = '0123456789';
![]() |
Re: Eigener String-Typ
Arrays besitzen, soweit ich weiß, doch ebenfalls dieses Byte.
Delphi-Quellcode:
--> das bringt mir da ja nix
const Digits: array[0..9] of Char = '0123456789';
|
Re: Eigener String-Typ
Bei dynamischen Arrays mag das vielleicht stimmen, aber wozu sollten statische ein Längenbyte benötigen?
Das funktioniert jedenfalls:
Delphi-Quellcode:
const Digits: array[0..9] of Char = '0123456789';
begin if @Digits = @(Digits[0]) then ShowMessage('wuppdi'); end; |
Re: Eigener String-Typ
ich hab mir eine eigene Length-Funktion geschrieben, die mir wirklich das erste Byte (eigentlich sind es 4 aber egal) ausgibt.
Beim Testen von:
Delphi-Quellcode:
erschien die Länge 10.
const a: array[1..10] of Char = 'Hallo Welt';
|
Re: Eigener String-Typ
Zitat:
Zitat:
Am besten wäre es tatsächlich, wenn du das tun würdest, wozu du schon oft aufgefordert wurdest: zu sagen, was du überhaupt damit willst. Compiler Magic tut leider viele Dinge für dich. PChar dürfte für die Meisten Anwendungen das Mittel deiner Wahl sein, wenn du einfach nur 'n Haufen Zeichen mit Nullterminator im Speicher halten willst. |
Re: Eigener String-Typ
Sagen wir so, ich möchte mein Programm nicht unter Windows laufen lassen.
Soll im RealMode laufen und da möchte ich einfach nur, dass das erste Byte einer Zeichenkette nicht für die Länge veschwendet wird, da das sonst mit den Größen nicht mehr passt. Das ist halt der Vorteil von C. naja, ich danke euch trotzdem für eure Hilf |
Re: Eigener String-Typ
Zitat:
Zitat:
Ansonsten: PChar ist genau das, was du willst. |
Re: Eigener String-Typ
Zitat:
Dass hab ich nie gesagt. natürlich verwende ich FreePascal :roll: Ich hatte diese Frage anfangs auch einmal im "Programmieren allgemein"-Forum. Ich wollte eine Art Liste mit konkreten ZeilenLängen für eine Art Screen-Objekt basteln, welches den Inhalt des Video-Rams managen soll. Die Liste hat den Sinn, um beim Scrollen immer den aktuellen Inhalt nachzuladen. Es ist für mich daher einfacher, wenn es eine Möglichkeit gäbe, einen neuen Zeichenkettentyp zu erstellen. |
Re: Eigener String-Typ
Zitat:
Zitat:
Pseudocode:
Code:
Beschafft dir ein Array mit Zeilen, bei dem jeder Array-Eintrag eine Zeile repräsentiert. Musst nur aufpassen, daß du nicht über das Ende einer Zeile hinwegschreibst, dann landest du nämlich in der nächsten. Für die Architektur wird vorrausgesetzt, daß das erste Byte eines Backbuffers/Videospeichers auch das linke, obere Zeichen ist und anschließend Zeilenweise von links nach rechts und von oben nach unten gelaufen wird.
var
lines: array[0..numlines - 1] of PChar; backbuffer = getmem(linelength * numlines); for i := 0 to numlines - 1 do begin lines[i] := backbuffer + (i * linelength); end; Zitat:
Du kannst auch nach wie vor ein array[0..linelength-1] of char nehmen, dann ist die gesamte Zeile eine Entität und nicht nur der Zeiger auf das erste Zeichen. Macht allerdings nur wenig Unterschied im Handling. Zitat:
Zitat:
|
Re: Eigener String-Typ
@tommie-lie:
Danke für deine Bemühungen mit der Liste, doch die steht bereits (fast), außerdem hab ich diese ganz anders aufgebaut (VRAM + Virtueller VRAM). Ich such(t)e eigentlich nur eine Möglichkeit das erste "String-Byte" auszunutzen", da ich immer versuche jedes Byte zu sparen, wo es geht. Klingt doof, aber so bin ich eben. Es hätte mir auch bei bestimmten Dingen geholfen: wenn man mit Pointern arbeitet und dann ist immer dieses eine Byte im Weg. Warum ich nicht C/C++ nutze -> weil ich dem nicht mächtig bin, außerdem find ich die Sprache Pascal besser (meine Meinung). |
Re: Eigener String-Typ
Zitat:
Zitat:
Zitat:
|
Re: Eigener String-Typ
Zitat:
|
Re: Eigener String-Typ
ja C/C++ lernen lohnt sich schon (mach ich vllt auch mal intensiver).
Vielleicht werde ich es so machen, dass ich alle funktionen, bei denen Zeichenketten übergeben werden, in C und den Rest in Pascal uns ASM schreibe. Das mit den Statischen Arrays hatten wir hier doch schon öfters. Hätte nicht gedacht, dass das so ein Ausmaß nimmt. Aber ohne PChar komm ich sowieso nicht aus. Ich werd's schon hinbekommen. @Flocke: Auch bei Pascal kommt ein #0 hinten ran. Und bei meinem Problem muss das System nicht wissen, wie lang der String ist, da ich das mit Funktionen selbst festlege, was ich wo und wieweit auslese. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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