varias superponer studio lineas histogramas graficos graficas c delphi pointers types record

superponer - ¿Cómo definir un Tipo A en Tipo B y Tipo B en Tipo A?



superponer graficas en r (3)

La traducción de Delphi del código C que mostró se vería así:

type DLPDFDOC = record; // forward declaration { DLPDFPAGE } DLPDFPAGE = record Page: CosObj; PrintSelect: CosObj; PageBBox: ASFixedRect; ContentBBox: ASFixedRect; Next: ^DLPDFPAGE; Angle: PDRotate; Doc: ^DLPDFDOC; Content: ^DLPDFSTREAM; PageNumber: Longint; Complete: AnsiChar; FontSubstituted: AnsiChar; FontMM: AnsiChar; FontBad: AnsiChar; end; { DLPDFDOC } DLPDFDOC = record dliInstance: ^DLPDFINSTANCE; pdDoc: PDDoc; cosDoc: CosDoc; Outlines: ^DLPDFOUTLINE; PDFFileName: PAnsiChar; PDFPostFileName: PAnsiChar; LastPageEnd: DLPOS; BeforeDef: DLPOS; DocBBox: ASFixedRect; PageCount: Longint; PageTreeWidth: Longint; PageTreeDepth: Longint; PageTreeDepthUsed: Longint; AllPages: ^DLPDFPAGETREEARRAY; AllFonts: ^DLPDFFONTLIST; AllForms: ^DLPDFFORMLIST; AllColors: ^DLPDFFORMLIST; AllImages: ^DLPDFIMAGELIST; AllSpotColors: ^DLPDFSPOTCOLORLIST; AllPatterns: ^DLPDFSPOTCOLORLIST; AllExtGStates: ^DLPDFEXTGSTATELIST; PageList: ^DLPDFPAGE; LastPage: ^DLPDFPAGE; DeferedDests: ^DLPDFDEST; signatureHolder: ^DLPDFSIGNATURE; AcroFormBase: ^DLPDFACROFORM; PatternColorObj: CosObj; PatternColorRGBObj: CosObj; PatternColorCMYKObj: CosObj; PatternColorGrayObj: CosObj; PrintSelect: CosObj; PrintSelectCriteria: CosObj; IdentH: CosObj; IdentV: CosObj; DocumentEncoding: ASAtom; FontCount: Longint; FormCount: Longint; PatCount: Longint; ImageCount: Longint; Compress: AnsiChar; Linearize: AnsiChar; PageTreeComplete: AnsiChar; EmbedFonts: AnsiChar; PatternColorsDefined: AnsiChar; MakeThumbNails: AnsiChar; psSevenBitSafe: ASBool; EncryptKeyByteCount: ASInt32; condenseResDicts: AnsiChar; resourceDict: CosObj; pdfMajorVer: ASInt16; pdfMinorVer: ASInt16; InclRes: ^DLPDFINCLUDEDRES; AllShadings: ^DLPDFSPOTCOLORLIST; ShadeCount: Longint; end;

Tengo dos tipos. Un Tipo A y un Tipo B. El Tipo de Problema A contiene Tipo B y Tipo B contiene Tipo A. Tal cosa como esta no funcionará:

type typeA = record test1 : typeB; end; type typeB = record test2 : typeA; end;

Editar: Ese no es mi diseño. Puedo convertir archivos de encabezado C (para acceder a una DLL) que incluyen tales construcciones a delphi.

Edit2: "Las estructuras C ++ son otro nombre para las clases AFAIR. Y debe haber habido punteros, no valores en sí mismos. - Arioch ''Hace 1 minuto" Sí, tiene razón, que era un Puntero a un Tipo:

Ahí definí:

test1 : ^typeB;

¿Funcionará eso en su lugar?

test1 : Pointer;

Edit3: The C Structs:

/* DLPDFPAGE */ typedef struct dlpdfpage { CosObj Page; CosObj PrintSelect; ASFixedRect PageBBox; ASFixedRect ContentBBox; struct dlpdfpage *Next; PDRotate Angle; struct dlpdfdoc *Doc; DLPDFSTREAM *Content; long PageNumber; char Complete; char FontSubstituted; char FontMM; char FontBad; } DLPDFPAGE; /* DLPDFDOC */ typedef struct dlpdfdoc { DLPDFINSTANCE *dliInstance; PDDoc pdDoc; CosDoc cosDoc; DLPDFOUTLINE *Outlines; char *PDFFileName; char *PDFPostFileName; DLPOS LastPageEnd; DLPOS BeforeDef; ASFixedRect DocBBox; long PageCount; long PageTreeWidth; long PageTreeDepth; long PageTreeDepthUsed; DLPDFPAGETREEARRAY *AllPages; DLPDFFONTLIST *AllFonts; DLPDFFORMLIST *AllForms; DLPDFFORMLIST *AllColors; DLPDFIMAGELIST *AllImages; DLPDFSPOTCOLORLIST *AllSpotColors; DLPDFSPOTCOLORLIST *AllPatterns; DLPDFEXTGSTATELIST *AllExtGStates; DLPDFPAGE *PageList; DLPDFPAGE *LastPage; DLPDFDEST *DeferedDests; DLPDFSIGNATURE *signatureHolder; struct dlpdfacroform *AcroFormBase; CosObj PatternColorObj, PatternColorRGBObj, PatternColorCMYKObj, PatternColorGrayObj, PrintSelect, PrintSelectCriteria; CosObj IdentH, IdentV; ASAtom DocumentEncoding; long FontCount; long FormCount; long PatCount; long ImageCount; char Compress; char Linearize; char PageTreeComplete; char EmbedFonts; char PatternColorsDefined; char MakeThumbNails; ASBool psSevenBitSafe; ASInt32 EncryptKeyByteCount; char condenseResDicts; CosObj resourceDict; ASInt16 pdfMajorVer; ASInt16 pdfMinorVer; DLPDFINCLUDEDRES *InclRes; DLPDFSPOTCOLORLIST *AllShadings; long ShadeCount; } DLPDFDOC;


Quizás la mejor solución es replantear el diseño. Pero también podría estar interesado en las llamadas declaraciones de clases a futuro :

type TTypeB = class; TTypeA = class test: TTypeB; end; TTypeB = class test: TTypeA; end;

¡SIC! Esto solo funciona para clases, no para registros.


Usted no entendió lo que representan esas estructuras C Eso es porque un record es un tipo de valor: se almacena allí donde declaras la variable. Así que hagamos algunos niveles de declaraciones recursivas, y comprenderán lo que quiero decir; Suponiendo que las dos estructuras no son absolutamente idénticas:

type TA = record test1 : TB; SomethingElseFromA: Byte; end; TB = record test2 : TA; SomethingElseFromB: Byte; end;

La estructura TA podría reescribirse para significar esto:

type TA = record // Replaced test1 : TB with the actual content of TB, because that''s // what a record means. test1_test2: TA; test1_SomethingElseFromB: Byte; SomethingElseFromA: Byte; end;

Por supuesto, ahora tenemos una buena inclusión recursiva de uno mismo en el registro de TA , algo así como:

TA = record // Replaces test1_test: TA test1_test2: TA; // Oops, still not fixed, need to do it again... test1_SomethingElseFromB: Byte; SomethingElseFromA: Byte; test1_SomethingElseFromB: Byte; SomethingElseFromA: Byte; end;

Probablemente desee usar tipos de referencia para obtener algo que se vea similar, pero no es similar. Un tipo de referencia siempre es un puntero, por lo que es un tamaño fijo; El compilador puede asignarlo sin problemas. Esto sería válido, usando punteros a registros:

type pTypeB = ^typeB; pTypeA = ^typeA; typeA = record test1 : pTypeB; end; typeB = record test2 : pTypeA; end;

Alternativamente, podrías usar clases; Eso funciona por la misma razón, las clases son tipos de referencia; funcionan de la misma manera que los punteros. Cuando declara una variable de tipo puntero, el compilador asigna SizeOf(Pointer) .

Como ha publicado las estructuras C, puedo decir que son demasiado largas para intentar una traducción completa, pero puedo hacer algunas sugerencias: debe declarar todos sus tipos en un solo bloque Type ; no escriba el Type antes de cada declaración de tipo. Esto le permite crear el tipo de puntero antes del tipo de registro, como este:

Type PMyRecord = ^TMyRecord; // Somewhere in the same Type block TMyRecord = record end;

Para cada tipo que requiera punteros a registros, declare los punteros lo primero después de la palabra clave Type , es más simple de esa manera. A continuación, debe identificar los punteros C. Si hay un * entre el nombre del tipo de datos y el nombre del campo, eso es un puntero. Esto generalmente se escribe así:

int *PointerToSomeInt;

Pero esos serían igual de válidos:

int * PointerToSomeInt; int* VarName1, * VarName1, * VarName3; // Three pointers to integer.

Finalmente, tendrá que lidiar con problemas de alineación. Si puede, verifique el tamaño de las estructuras en el lado C y luego verifique el tamaño del lado Delphi: debe obtener el mismo tamaño. Si no lo hace, debe probar un par de directivas de compilación {$ALIGN} azar antes de su declaración de estructura y repetir hasta que encuentre la alineación correcta. Si todo lo demás falla, tendrá que encontrar lo que está mal (qué campos están alineados de manera diferente en el lado Delphi) y colocar algunos bytes de alineación para arreglarlo artificialmente.