Avatar billede ghorfraq Nybegynder
24. november 2003 - 10:57 Der er 36 kommentarer og
1 løsning

object type i c++

Jeg koder en wrapper i c++. Kan man returnerer en værdi uden at definere type i c++? Aka object i java og c#. Mao jeg ønsker at kunne returnere en vilkårlig datatype, og så typebestemme der hvor jeg modtager det.
Avatar billede thomas_nj Nybegynder
24. november 2003 - 11:41 #1
Du kan gøre det ved hjælp af templates, der er en udemærket tutorial til dem her:
http://cplus.about.com/library/weekly/aa070202a.htm
Avatar billede segmose Nybegynder
24. november 2003 - 11:42 #2
du kan ikke slippe for at skrive en konkret type, men denne kan pakkes ind på flere måder.

templates er en mulighed:
template <class T>
class Return() {
  T data;
public:
  T operator() { return data; }
  // etc.
}

Eller noget operator overload:
#include <stdio.h>

class Return {
  union {
    int x;
    char *y;
    float z;
  };
public:
  Return(int ax) : x(ax) { }
  operator int() { return x; }
  operator char *()  { return y; }
  operator float()  { return z; }
  int& operator=(int ax) { x = ax; return x; }
};

int main() {
  Return test = 7;

  printf("Test = %d\n", (int)test);

  return test;
}

Eller en union:

union Return {
  int x;
  char *y;
  float z;
};

Eller den gode gamle pointer cirkus med void * og diverse castings.
Avatar billede olennert Nybegynder
24. november 2003 - 11:44 #3
Jeg synes også jeg kan huske at boost har en variant klasse til den slags. Jeg er ikke sikker, men prøv at kigge på www.boost.org (der er også mange andre spændende ting)
Avatar billede thomas_nj Nybegynder
24. november 2003 - 11:48 #4
Du kan også vælge at overloade men templates er en hel del nemmere
Avatar billede ghorfraq Nybegynder
24. november 2003 - 11:53 #5
mit problem er at jeg skal returnere typer fra c++ til .NET (c#). Så derfor vil jeg gerne gøre det uden at definere en klar type
Avatar billede segmose Nybegynder
24. november 2003 - 11:55 #6
Så skal du være meget sikker på at de lagres end i C# og C++.
Avatar billede segmose Nybegynder
24. november 2003 - 11:59 #7
Der må da også være noget doku på C# for hvordan det problem skal løses.
Avatar billede thomas_nj Nybegynder
24. november 2003 - 12:00 #8
Glem min løsningside. Ved ikke en brik om C# så hvis det virker er det mere held end forstand :)
Avatar billede ghorfraq Nybegynder
24. november 2003 - 12:12 #9
helt specifikt handler det om at returnere char til .NET
Dette er ikke nemt :)
c++ char er 8-bit ansi og char i .NET er 16 bit.
Men har fundet noget om c++ / .NET string conversion. Så nu skal jeg bare have konverteret min c++ char til en native c++ string. OG så lige have c++ .NET converison til at virke :)
Avatar billede arne_v Ekspert
24. november 2003 - 13:33 #10
C++ char = C# byte
Avatar billede arne_v Ekspert
24. november 2003 - 13:34 #11
C++ wchar_t = C# char
Avatar billede arne_v Ekspert
24. november 2003 - 13:35 #12
Det er muligt at mappe mellem en C++ struct og en C# struct.
Avatar billede arne_v Ekspert
24. november 2003 - 13:36 #13
(ved at angive meta information i C# struct definitionen)
Avatar billede ghorfraq Nybegynder
24. november 2003 - 13:45 #14
arne_v : Lyder meget interessant. Der er dog tale om char array og evt wchar_t arrays. MEn hvis du evt ku eksemplificere det ville det være en kæmpe hjælp. Jeg giver gerne flere point for eksempel
har dog fundet ud af at bruge string i c++. Kan den ik bruges ?
Avatar billede ghorfraq Nybegynder
24. november 2003 - 13:47 #15
man kan jo DESVÆRRE ikke returnere arrays i c++ (ifølge min viden)
Avatar billede arne_v Ekspert
24. november 2003 - 13:55 #16
Det kan du godt !
Avatar billede arne_v Ekspert
24. november 2003 - 13:56 #17
Du må ikke returnerer et lokalt array.

Men du kan sagtens returnere et global array eller et dynamisk
allokeret array.

(teknisk set returnerer du en pointer til dem, men det må være det
samme i denn kontekst)
Avatar billede ghorfraq Nybegynder
24. november 2003 - 14:16 #18
DVS sige at det for at returnerer et array af chars kræves et globalt array på 16 bit (wchar_t[]). Dette kan så returneres til .NET....
og returtypen i .NET vil da være char?
Avatar billede ghorfraq Nybegynder
24. november 2003 - 14:17 #19
hvis dette er scenariet skal jeg egenlig bare kunne konvertere c++ char[] til wchar_t[] og returnere wchar_t[]!!
?
Avatar billede ghorfraq Nybegynder
24. november 2003 - 14:18 #20
ville være en dejlig simpel løsning.....
Avatar billede ghorfraq Nybegynder
24. november 2003 - 14:30 #21
Se nedenstående kode. KAn du vise med lidt kode hvordan man returnerer char str[16] som wchar_T  - Og hvordan wchar_T skal erklæres??

*ReturType* _stdcall timeToString(DBL_S16 strSize, unsigned long time)
{
        //buffer
    char str[16];       
       
    //void DBL_Time_2_Str(DBL_U8 *Str, DBL_S16 StrSize, DBL_TIME Time);
    DBL_Time_2_Str((DBL_U8*)str, strSize, time);

    return *ReturVærdi*;
}
Avatar billede ghorfraq Nybegynder
24. november 2003 - 14:40 #22
Skal måske nævnes her at DBL-typerne er typer der er typedef i en h-fil. DBL_U8 er en unsigned 8bit char.
-stdcall bruges da koden skal kompileres til en win32 DLL
Avatar billede arne_v Ekspert
24. november 2003 - 14:46 #23
Jeg kigger lige på det.
Avatar billede ghorfraq Nybegynder
25. november 2003 - 07:15 #24
siger lige godmorgen på tråden ;)
Avatar billede ghorfraq Nybegynder
25. november 2003 - 09:34 #25
upper lige pointene til 100
Avatar billede ghorfraq Nybegynder
25. november 2003 - 10:03 #26
er jeg virkelig den eneste på denne planet der har leget med returnering af char array eller streng fra c++ win32 dll til c#.NET???
Sørgeligt
Avatar billede segmose Nybegynder
25. november 2003 - 10:04 #27
prøv lige at slå op på wchar_t i din help og led efter converterings funktioner fx. char2wchar eller lignende.
Avatar billede segmose Nybegynder
25. november 2003 - 10:05 #28
Hvorfor vil du egentlig bruge C# (C bøf)?
Avatar billede ghorfraq Nybegynder
25. november 2003 - 10:40 #29
projektet skal udvikles i c# .NET
Har leget med wchar_t.
Men kan ikke returnere arrays
Avatar billede arne_v Ekspert
25. november 2003 - 10:42 #30
Selvfølgelig er der andre der arbejder med C# og C++.

Hvis jeg får mere tid i aften end i går aftes, så skal jeg nok prøve at få
taget mig sammen til at lave en komplet eksempel.
Avatar billede ghorfraq Nybegynder
25. november 2003 - 10:44 #31
arne_V : kommentaren var bare lige en krampeTrækning i frustration ;-)
Men ser da frem til dit evt svar
Avatar billede segmose Nybegynder
25. november 2003 - 10:55 #32
Har du fået converteret fra char til wchar_t, så kan du experimentere med at returnere en pointer til arrayet. Virker det ikke kan du prøve en typedef.

typedef wchar_t WC[16]; // array længde 16
WC tempbuf;

WC _stdcall timeToString(DBL_S16 strSize, unsigned long time) {

...
// convert to wchar_t i tempbuf
...
return tempbuf;
}
Avatar billede ghorfraq Nybegynder
25. november 2003 - 11:01 #33
er jo i princippet bare at returnere et array - resulterer i fejl
har osse leget med at returnere pointer. Både som char og wchar_t til henh byte[] og char[] i c#
Avatar billede segmose Nybegynder
25. november 2003 - 11:24 #34
Prøv at se om dette giver nogen mening for dig (jeg kende ikke C#) de snakker om nogle __gc som må være noget .net.
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20558918.html
Avatar billede ghorfraq Nybegynder
25. november 2003 - 11:28 #35
tror det er managed c++ kode. Jeg arbejder i native c++.
men har fundet ud af at returnering af pointers fra dll's kan modtages af typen IntPtr i c#. DEnne skal så bearbejdes i unsafe kontekst. Men har dog ikke noget fungerende kode endnu. får det sikkert heller ikke *G*
Avatar billede ghorfraq Nybegynder
25. november 2003 - 11:43 #36
har selv fundet et link til et eksempel der burde kunne klare mit problem
http://www.codeproject.com/csharp/interop.asp?print=true
Avatar billede ghorfraq Nybegynder
25. november 2003 - 12:28 #37
ved brug af linket jeg fandt lykkedes det mig at klare problemerne.
Så spørgsmålet lukkes. Men takker for interessen og den hjælp der er blevet givet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester