![]() |
Übergabe von einem selbdef. Type in C++
Hallo Freunde,
neues Problem mit der Bitte um Rat. Enstsprechend dem tutorial: ![]() Möchte ich jetzt ein integer array einer C++ routine übergeben. Da ja in Delphi Pascal man das so macht:
Delphi-Quellcode:
habe ich jetzt das Problem, dass in C++ die Typdef von
type
Tinputvec = array of integer; .. private { Private declarations } procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ; function readTTSetting(): Tinputvec ;
Code:
nicht dem delphi type Tinputvec übereinstimmt.
std::vector <int>
Wie kann ich auf C++ Seite auch dort den Type Tinputvec verwenden oder casten? Danke Walter |
AW: Übergabe von einem selbdef. Type in C++
Geht das nicht
![]() |
AW: Übergabe von einem selbdef. Type in C++
Ich will kein Miesmacher sein, aber du darfst wirklich nicht zu viel erwarten. Der std::vector ist eine eigene C++-Klasse, kein Array. Der vector<> ist in der Delphi-Welt noch am ähnlichsten zu einer TList<> aber nicht dasselbe!
Wenn du mit Delphi-Code interagieren willst kannst du kein Standard-C++ durchhalten sondern musst ständig Klassen und Strukturen aus der Delphi-Welt verwenden. Das angesprochene DynamicArray<> ist ein Beispiel dafür. Das gibt es nur in der Borland/Embarcadero-Welt... Wenn deine C++-Routine fest einen std::vector<> erwartet und du daran nicht rütteln kannst müsstest du dir eine Zwischenroutine bauen welche z.B. ein DynamicArray<> entgegennimmt und daraus dann einen std::vector<> macht um diesen dann endlich in die Routine reinzustecken... |
AW: Übergabe von einem selbdef. Type in C++
Danke Ihr beiden, jetzt weiß ich mehr doch hab noch nicht die Lösung und bin am Knobeln.
Melde mich: |
AW: Übergabe von einem selbdef. Type in C++
Vielleicht kannst du es dir auch einfacher machen: Wenn die Länge des Arrays fix ist, kannst du ein Pärchen aus Zeiger auf's erste Arrayelement und Arraylänge übergeben.
|
AW: Übergabe von einem selbdef. Type in C++
So also ich konnte compilieren, doch wenn ich was ändere und abspeichere dann ändert er automatisch immer mein Abstractclass.hpp file
so sieht es aus wo das kompilieren nicht mehr geht:
Delphi-Quellcode:
Dieses File wird dann autmo. erstellt.
unit DelphiAbstractClass;
interface uses UnitTyp; type TAbstractClass = class protected function GetDummy : integer; virtual; abstract; procedure SetDummy(Value : integer); virtual; abstract; function GetMTCount : integer; virtual; abstract; procedure SetMTCount(Value : integer); virtual; abstract; function GetText : ansistring; virtual; abstract; procedure SetText(Value : ansistring); virtual; abstract; function GetTTT : ansistring; virtual; abstract; procedure SetTTT (Value : ansistring); virtual; abstract; function GetTTInput : Tinputvec; virtual; abstract; procedure SetTTInput (Value : tinputvec); virtual; abstract; public procedure DoSomething; virtual; abstract; procedure DoTTable; virtual; abstract; property Text : ansistring read GetText write SetText; property TTT : ansistring read GetTTT write SetTTT; property TTInput :tinputvec read GetTTInput write SetTTInput; property Dummy : integer read GetDummy write SetDummy; property MTCount : integer read GetMTCount write SetMTCount; end; function CreateCppDescendant : TAbstractClass; stdcall; external 'CPPPackage.bpl'; implementation end.
Code:
Wenn ich die Zeile dann manuale in das abändere kann ich wieder compilieren.
// CodeGear C++Builder
// Copyright (c) 1995, 2016 by Embarcadero Technologies, Inc. // All rights reserved // (DO NOT EDIT: machine generated header) 'DelphiAbstractClass.pas' rev: 32.00 (Windows) #ifndef DelphiabstractclassHPP #define DelphiabstractclassHPP #pragma delphiheader begin #pragma option push #pragma option -w- // All warnings off #pragma option -Vx // Zero-length empty class member #pragma pack(push,8) #include <System.hpp> #include <SysInit.hpp> #include <UnitTyp.hpp> //-- user supplied ----------------------------------------------------------- namespace Delphiabstractclass { //-- forward type declarations ----------------------------------------------- class DELPHICLASS TAbstractClass; //-- type declarations ------------------------------------------------------- #pragma pack(push,4) class PASCALIMPLEMENTATION TAbstractClass : public System::TObject { typedef System::TObject inherited; protected: virtual int __fastcall GetDummy(void) = 0 ; virtual void __fastcall SetDummy(int Value) = 0 ; virtual int __fastcall GetMTCount(void) = 0 ; virtual void __fastcall SetMTCount(int Value) = 0 ; virtual System::AnsiString __fastcall GetText(void) = 0 ; virtual void __fastcall SetText(System::AnsiString Value) = 0 ; virtual System::AnsiString __fastcall GetTTT(void) = 0 ; virtual void __fastcall SetTTT(System::AnsiString Value) = 0 ; virtual Unittyp::Tinputvec __fastcall GetTTInput(void) = 0 ; [I]virtual void __fastcall SetTTInput(const Unittyp::Tinputvec Value) = 0 ;[/I] public: virtual void __fastcall DoSomething(void) = 0 ; virtual void __fastcall DoTTable(void) = 0 ; __property System::AnsiString Text = {read=GetText, write=SetText}; __property System::AnsiString TTT = {read=GetTTT, write=SetTTT}; __property Unittyp::Tinputvec TTInput = {read=GetTTInput, write=SetTTInput}; __property int Dummy = {read=GetDummy, write=SetDummy, nodefault}; __property int MTCount = {read=GetMTCount, write=SetMTCount, nodefault}; public: /* TObject.Create */ inline __fastcall TAbstractClass(void) : System::TObject() { } /* TObject.Destroy */ inline __fastcall virtual ~TAbstractClass(void) { } }; #pragma pack(pop) //-- var, const, procedure --------------------------------------------------- extern "C" TAbstractClass* __stdcall CreateCppDescendant(void); } /* namespace Delphiabstractclass */ #if !defined(DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE) && !defined(NO_USING_NAMESPACE_DELPHIABSTRACTCLASS) using namespace Delphiabstractclass; #endif #pragma pack(pop) #pragma option pop #pragma delphiheader end. //-- end unit ---------------------------------------------------------------- #endif // DelphiabstractclassHPP
Code:
Gibts da eine Lösung, auch habe ich in dem File: CPPClass.cpp die INit von m_DVector drin, daher habe ich immer 5 Elemente in der Abrage:
virtual void __fastcall SetTTInput(const DynamicArray<int>& Value) = 0 ;
Code:
Abfrage:
__fastcall TCppClass::TCppClass() :
TAbstractClass(), m_Dummy (0), m_MTCount (0), m_Text(L"Initialised in C++___________________________"), m_TTT (L"Initialised in C++___________________________"), //m_TTT(L"__;xy#"), m_Vector { 1, 2, 3, 4, 5 }, m_DVector{ 1, 2, 3, 4, 5 } { }
Code:
Danke für die TIPS.
void __fastcall TCppClass::DoSomething() {
//System::AnsiString qmc_result; //qmc_result=calcmain(m_MTCount).c_str(); if (GetDummy() == 1) { // MessageBox(0, L"Now Dummy-String", L"Delphi/C++ interaction", 0); TCppClass::SetText(L"My DUMMY:RESULT"); TCppClass::SetTTT(L"__ __;DUMMY#"); } else { TCppClass::SetText(calcmain(m_MTCount).c_str()); // does work } //TCppClass::SetText(L"myreslut:x"); // works fine std::wstringstream strMessage; strMessage << L"Hello from a C++ class. Result of QMC is: " << m_Text.c_str() << std::endl << L"InputVector contains " << std::to_wstring(m_DVector.Length) << " elements"; MessageBox(0, strMessage.str().c_str(), L"Delphi/C++ interaction", 0); //TCppClass::SetText(qmc_result); // works NOT fine } Walter |
AW: Übergabe von einem selbdef. Type in C++
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Dann wird das Array der Class übergeben und in C++ bleibt es dann fix. Bei mir stimmt was noch nicht, es ist immer 5 Elemente lang. Es wird die SetTTInput Forschleife nicht durchgeführt. Stimmt da was mit dem & nicht?
Code:
Interessanterweise klappt in C++ der Call:
void __fastcall TCppClass::SetTTInput(const DynamicArray<int>& Value) {
for (int i=Value.Low; i<=Value.High; i++) { m_DVector[i] = Value[i]; std::wstringstream strMessage; strMessage << L"Hello from a C++ class. Set now DVector: DVector[" << std::to_wstring(i) << L"] is " << std::to_wstring(m_DVector[i]) << std::endl << L"InputVector contains " << std::to_wstring(m_DVector.Length) << L" elements"; MessageBox(0, strMessage.str().c_str(), L"Delphi/C++ interaction", 0); } }
Code:
Also hier der PAscal call als bild, wo die richtingen Werte drin stehen und der Debug in C++ wo ein NULL Array da ist.
TCppClass::SetTTInput({1, 2, 3});
Was ist da falsch? DANKE HERZLICHST. |
AW: Übergabe von einem selbdef. Type in C++
Sorry, ich kann mir jetzt nicht den ganzen Code durchlesen. Bin auch nicht der C++-Builder-Profi.
Die Antworten auf deine Fragen hängen davon ab, was du eigentlich machen willst... Willst du bestehenden C++-Code in Delphi nutzen oder umgedreht? Ist das C++ standardkonform oder darf und soll es C++-Builder sein? |
AW: Übergabe von einem selbdef. Type in C++
Ich habe es jetzt nur kurz überflogen, aber in deiner abstrakten Delphi-Klasse sind die Setter-Methoden "call by value". In der C++-Implementierung haben die Methoden aber konstante Referenzen (dein "const" und "&").
|
AW: Übergabe von einem selbdef. Type in C++
Liste der Anhänge anzeigen (Anzahl: 1)
GESCHAFFT! :-D
Anbei für Leute die sich auch dafür interessieren. Wie gesagt bei Neuem Erstellen, muss man die Zeile in AbstractClass.hpp Zitat:
Nach dem Korrig. kann man F9 Drücken und mit /ohne Debugger laufen lassen. Danke an alle die geholfen haben. |
AW: Übergabe von einem selbdef. Type in C++
Danke Dir Günther!
Kannst mir sagen was ich da genau ändern müßte. Man lernt nie aus. Wennst mir die Zeile hier korrigiert zeigt, weiß ich dann genau was Du meinst. Sorry. Zitat:
|
AW: Übergabe von einem selbdef. Type in C++
Liste der Anhänge anzeigen (Anzahl: 1)
DANKEEEE ! Ja das wars, einfach const un & weglassen.
Jetzt klappt auch die autom. Erstellung des Files wieder. Hier das Fertige Resulat. :-D:-D:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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