AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Thema durchsuchen
Ansicht
Themen-Optionen

PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

Ein Thema von Glados · begonnen am 4. Nov 2017 · letzter Beitrag vom 5. Nov 2017
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#11

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 21:43
Nicht daß es zu Mißverständnissen kommt. Wenn Du einen Pwidechar übergibst, der auf einen Ansistring zeigt, dann ist das formal durchaus korrekt, aber der Inhalt des Strings wird höchstwahrscheinlich falsch interpretiert.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#12

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 21:58
Ich definiere grundsätzlich string .
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#13

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:04
AnsiString oder UnicodeString?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#14

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:05
Ehrlich gesagt.... weiß ich nicht. Einfach nur string
Aber ich nehme an es ist automatisch Unicode.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#15

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:08
Ab Delphi 2009 schon. Worauf ich hinauswollte: wenn man einen PChar auf einen String zeigen lassen möchte, dann sollte man das auch so schreiben und nicht einerseits den Typalias benutzen und andererseits wieder nicht.
Delphi-Quellcode:
var
  Dings: string;
...
  ApiFunc(PChar(Dings)); //immer richtig
  ApiFunc(PWideChar(Dings)); //erst ab Delphi 2009 richtig
  ApiFunc(PAnsiChar(Dings)); //nur bis Delphi 2007 richtig
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#16

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:14
ApiFunc(PChar(Dings)); //immer richtig .. //erst ab Delphi 2009 richtig Ich benutze ab sofort nur PWideChar denn ich habe keine Absicht zurück zu D2009 oder drunter zu gehen.

Warum sollte man auch.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#17

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:17
Ab Delphi 2009 entspricht PChar PWideChar. Wieso also nicht konsequent die richtigen Typaliase verwenden? Da fehlt mir ehrlich gesagt das Verständnis.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#18

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:24
Meinst du damit jetzt, dass man ab D2009 PChar oder PWideChar nutzen soll?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#19

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:43
Nein, ich meine damit, dass man bei Verwendung von String auch PChar verwenden soll. Erst, wenn man das aus welchen Gründen auch immer nicht kann, sollte man die expliziten Typen nehmen (die Funktion gibt es nur in Ansi? AnsiString und PAnsiChar nehmen).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#20

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:48
Man sollte immer den für die Aufgabe passenden Typen benutzen, egal in welcher Version von Delphi oder FreePascal (bzw. jeder anderen Programmiersprache). Beispiel:
Delphi-Quellcode:
MessageBox(0, PChar(...));
MessageBoxA(0, PAnsiChar(...));
MessageBoxW(0, PWideChar(...));
Das funktioniert auf allen Delphi-Versionen, egal wie alt oder neu, wahrscheinlich auch mit FreePascal.

Warum nicht sowas wie MessageBox(0, PWideChar(...)); , von dem du ja sagst, die IDE meint, der Parameter wäre PWideChar? Nun, bei einem aktuellen Delphi macht das keinen Unterschied, weil PChar nur ein Alias für PWideChar ist (und MessageBox ein Alias für MessageBoxW), d.h. der Compiler liest den Code als MessageBoxW(0, PWideChar(...)); .

Aber sobald man denselben Code auf einem alten Delphi oder FreePascal benutzen will, kommen Warnungen wegen impliziter String-Umwandlung mit potentiellem Datenverlust. Warum? Weil MessageBox ein Alias ist, genau wie PChar. Der Compiler liest den Code daher als MessageBoxA(0, PWideChar(...)); - Type mismatch. PAnsiChar, PWideChar sowie MessageBoxA und MessageBoxW sind keine Aliase sondern konkrete Typen.

Ist eigentlich gar nicht so schwer zu verstehen. Manchmal braucht man konkrete Typen wie PAnsiChar, PWideChar, in allen anderen Fällen sollte man die Aliase (PChar, String usw) benutzen, weil der Code dann ohne Anpassungen wiederverwendbar ist. Manchmal muss man bei Code nicht nur an sich selbst denken sondern auch Code weitergeben; da ist es sehr hilfreich, wenn dieser korrekt funktioniert und keine Warnungen produziert. Warnungen zu bearbeiten, macht nämlich viel Arbeit (ich bearbeite derzeit derartigen fremden Code...).

Grüße
Dalai

Geändert von Dalai ( 4. Nov 2017 um 22:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz