![]() |
Compiler weiss nicht welcher Typ?
hoi,
ich habe aus meinem buch folgendes:
Delphi-Quellcode:
VAR
Quadrat1: Record obenlinks, untenrechts: TPunkt; end; Quadrat2: Record obenlinks, untenrechts: TPunkt; end; dort steht nun das beide Typen zwar gleich sind, der Compiler das aber nicht weiss da kein typ deklariert ist. aber TPunkt ist doch ein typ oder nicht? |
Re: Compiler weiss nicht welcher Typ?
Die Typen TPunkt sind zwar identisch, aber die Typen der Records nicht, so dass in Deinem Beispiel die Zuweisung
Delphi-Quellcode:
nicht zugelassen werden wird, weil der Compiler sie nicht als identische Typen ansieht.
Quadrat1:= Quadrat2;
Stichworte für die OH: "Kompatibilität und Identität von Typen", "Typenidentität", "Typenkompatibiltät" und "Zuweisungskompatibilität" Zitat:
|
Re: Compiler weiss nicht welcher Typ?
Solche expliziten Typdeklarationen sind immer inkompatibel selbst wenn sie gleich sind.
Das ist auch der Grund warum man sie bei Parametern nicht benutzen kann. Das ist eine alte Definition, die noch vom originalen Pascal kommt. Sie macht auch Sinn. Gleich aussehen heist keinesfalls gleich sein. Ist bei Zwillingen ja auch nicht anders. |
Re: Compiler weiss nicht welcher Typ?
welchen typ haben meine records eigentlich in meinem beispiel? ist ja garkeiner angegeben Oo
danke für die hilfe btw :) |
Re: Compiler weiss nicht welcher Typ?
Natuerlich ist ein Typ angegeben. Der Typ hat nur keinen eigenen Namen.
|
Re: Compiler weiss nicht welcher Typ?
Erzeuge dir einfach einen Typ:
Code:
Type
MyRecord = Record obenlinks, untenrechts: TPunkt; end; var Quadrat1, Quadrat2 : MyRecord; |
Re: Compiler weiss nicht welcher Typ?
hoi sharky,
jo so stehts in meinem buch auch, ich verstehe nur nicht, wieso das beispiel siehe oben nicht klappt Zitat:
welcher denn? |
Re: Compiler weiss nicht welcher Typ?
Hallo Pseudemys Nelsoni,
es ist ein zusammengesetzter Record-Typ, der aus zwei Einträgen des Typs TPunkt besteht. |
Re: Compiler weiss nicht welcher Typ?
Der Delphi-Compiler ordnet bei der Übesetzung jedem Ausdruck einen Typen zu, um überprüfen zu können, ob Zuweisungen zulässig sind, ob übergebene Parameter einem kompatiblen Typen entsprechen, der ggf Konvertiert werden kann, etc.
So hat zB der konstante Ausdruck
Delphi-Quellcode:
den impliziten Typ Byte zugeordnet. Bei einem Ausdruck der Form
189+4
Delphi-Quellcode:
jedoch den Typ 0..127 (nachzulesen in der OH "Echte Konstanten").
4+3
Bei der Deklaration von Variablen wird idR explizit ein Typ angegeben, zB
Delphi-Quellcode:
und der Compiler ist dank dieser Information später in der Lage zu entscheiden, ob eine Zuweisung der Form
var
myInt : Integer;
Delphi-Quellcode:
zulässig ist (nachzulesen in der OH unter "Typkomatiblität"). Darüber hinaus kann er nur durch die Angabe des Typs den Operator (nein, es ist keine Funktion) SizeOf verwenden, also die Größe in Bytes zu einem Datentypen ermitteln, obwohl dieser Information nicht zu jeder Variablen abgelegt wird. Stattdessen greift er zu diesem Zweck auf seine eigene "Buchführung" zurück...
myInt:= 189+4;
Es ist möglich, ohne einen benannten Typen, eine Variable zu deklarieren:
Delphi-Quellcode:
Damit der Compiler später zB in der Lage ist, zu erkennen, dass die Zuweisung
var
myVar: record AField: Integer; end;
Delphi-Quellcode:
ungültig ist, aber auch um Konstrukte der Art
myVar:= '6*9=42';
Delphi-Quellcode:
zu ermöglichen, muss der Compiler der Variablen myVar einen Typen zuordnen.
FillChar(myVar, SizeOf(myVar), 0);
Aus Mangel an Unterstützung seitens des Programmiers ist der Compiler an dieser Stelle gezwungen, selbst einen Typen zu erstellen und zu ihm die notwendigen Informationen ablegen, allerdings verwendet er hierzu keinen für den Programmierer zugänglichen Namen und dieser Typ dient nur dem Compiler zur Übersetzungszeit. Wollte der Programmierer mit dieser Information arbeiten hätte er schließelich einen Typen in der Form
Delphi-Quellcode:
benannt ;)
type
TMyType = record AField: Integer; end; var myVar: TMyType; Wenn Du hingegen zweimal einen anonymen Typen erstellst, zB mit
Delphi-Quellcode:
wird der Compiler zweimal einen eigenen Typen erstellen, der nicht identisch ist mit dem Anderen (siehe hierzu die OH "Typenidentität"). Welche Konsequenzen das für Dein Programm, zB bei Zuweisungen der Art
var
aString: string[10]; anotherString: string[10];
Delphi-Quellcode:
hat, kannst Du in der OH unter "Zuweisungskompatibilität" nachlesen.
aString:= anotherString
BTW: Dies ist auch der Grund warum Signaturen von Methoden, Funktionen und Prozeduren in der Form
Delphi-Quellcode:
unzulässig sind: Es gibt keinen kompatiblen Datentypen...
procedure MyProc(var AValue: record AField: Integer; end;);
Das Prinzip, der anonymen Datentypen ist in anderen Sprachen noch weiter vertreten, bei denen man zB ein Exemplar einer Klasse (Objekt), die von einer anderen Erbt und zu der man ad-hoc eine Methode überschreibt, erzeugen kann ohne die Klasse zu benennen :) Zum Verständnis in Pseudo-PascalCode:
Delphi-Quellcode:
wobei folgende Aussagen wahr wären:
var
myObject: TMyClass; anotherObject: TMyClass; begin myObject:= TMyClass.Create(Self); Showmessage(IntToStr(myObject.GetValue)); // e.g. '5' anotherObject:= (class(TMyClass) function GetValue: Integer; overload; begin Result:= (inherited GetValue) + 23; end; ).Create(Self); Showmessage(IntToStr(anotherObject.GetValue)); // '28'
Delphi-Quellcode:
anotherObject.InheritsFrom(TMyClass);
anotherObject.ClassType<>myObject.ClassType; anotherObject is TMyClass; |
Re: Compiler weiss nicht welcher Typ?
wow, super erklärt, danke =D.
Der letzte Abschnitt ist nur (noch) zu hoch für mich. ;) btw: Zitat:
ist da nicht der typ angegeben? string? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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