[c++ .net] conversions/typecast

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
//gemaakt in MS visual studio 2003
zit met een naar probleem met waardes die via een dll uit een database worden gehaald. Ik heb een 2x een .c en een .h waarmee ik connectie kan maken en verschillende functies kan gebruiken (bv insert en ophalen van tabellen).
waar ik nu vast loop is dat bijna alle waardes zijn getypedefd, dit zijn 2 relevante:
C++:
1
2
3
typedef unsigned char                DBL_U8;
typedef signed long int              DBL_S32;
typedef struct DBL_TABLE    *DBL_HTABLE;

dit is relevante code: (waar een error wordt gegeven is aangeduid met een "<== <#>"
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            DBL_HTABLE  hTable;
            DataRow *dRow;
            DBL_U8 *tName;
            DBL_S32 tNumber = DBL_NextTable(0);
            DBL_Allow(DBL_Err_TableNotFound);
            while (tNumber != 0)
            {
                if (!DBL_OpenTable(&hTable, tNumber)) // <== 1
                    tName = (DBL_U8*)"Error";
                else
                    tName = DBL_TableName(hTable);

                dRow = dTable->NewRow();
                dRow->Item[0] = (int)tNumber; // <== 2
                dRow->Item[1] = (String *)reinterpret_cast<const char*>(tName);

                dTable->Rows->Add(dRow);

                DBL_CloseTable(hTable);
                tNumber = DBL_NextTable(tNumber);
            }
            DBL_CloseTable(hTable);

de errors:
1 error C2664: 'DBL_BOOL (DBL_HTABLE * ,DBL_S32)' : cannot convert parameter 1 from 'DBL_HTABLE __gc * ' to 'DBL_HTABLE * '
2 error C2664: 'void System::Data::DataRow::set_Item(int,System::Object __gc *)' : cannot convert parameter 2 from 'int' to 'System::Object __gc *'

zoals je kunt zien heeft alles te maken met de garbage collecting (__gc). De conversie van DBL_U8* naar String vond ik bij toeval, het werkte met (String *)reinterpret_cast<const char*> in een andere functie. Maar hoe moet ik de andere waardes typecasten? of misschien is t mogelijk om garbage collecting uit te zetten en alles zelf opruimen?

bij voorbaad dank als iemand hier een oplossing voor heeft!

[ Voor 27% gewijzigd door PoweRoy op 14-03-2006 09:35 ]

[This space is for rent]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien moet je de documentatie gewoon even doorlezen? :)

1 kun je oplossen met pinning pointers, 2 met box casts.

Overigens zijn de managed extensions obsolete, er is nu een hele nieuwe taal, C++/CLI, die een veel cleanere syntax biedt om in C++ met .Net te werken. Dus als het mogelijk is om over te stappen naar visual studio 2005 zou ik dat zeker doen.

[ Voor 70% gewijzigd door .oisyn op 14-03-2006 12:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
bedankt voor t antwoord, heb die docu hier niet over kunnen vinden :X

heb alleen een vraagje over het pinnen. Hoe moet ik dat hier toepassen?
DBL_HTABLE __pin * hTable;
en dan
if (!DBL_OpenTable(hTable, tNumber))
krijg ik 2 errors op de declaratie van hTable:
error C3160: 'hTable' : cannot declare interior __gc pointer or reference as a member of 'cnetform::Form1'
error C3831: 'hTable': 'cnetform::Form1' cannot have a pinned data member or a member function returning a pinning pointer

boxen heb ik via dRow->Item[0] = __box((int)tNumber); gedaan en dat geeft geen error (maar kan nu ook niet de uitkomst hier van zijn omdat t niet compiled.

[This space is for rent]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Is DBL_TABLE eigenlijk wel een managed type?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
.oisyn schreef op woensdag 15 maart 2006 @ 11:54:
Is DBL_TABLE eigenlijk wel een managed type?
alle DBL_ variabelen zijn gedefineerd in een c header. Deze zijn dus niet managed.
ook alle DBL functies zijn niet managed.

bedoeling is via een c++ .net applicatie een database te raadplegen via een .c en een .h(beide unmanaged) die gegeven zijn door de database maker (nu MS, database is Navision Attain)
Maar alles gaat goed zoals connecten en companies opvragen, maar data uit een field (mbv opentable) krijg ik deze __gc error

[This space is for rent]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap niet waarom hij zegt dat het adres van je hTable een __gc pointer oplevert... misschien omdat het op de .Net stack staat? Verander die eerste regel in het stukje code in je openingspost eens naar
C++:
1
DBL_HTABLE * hTable = new DBL_HTABLE;

En de & op regel 8 moet je dan natuurlijk weghalen en waar je hTable verder gebruikt moet je dan natuurlijk *hTable doen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
compiler error is weg, dus er was nog geen ruimte gereserveerd voor hTable :/
krijg nu wel een runtime exception maar ik weet niet eens es waar hij foutgaat want als hij bij de functie aankomt en doe dan step into geeft ie de exception al aan zonder dat hij in de functie aankomt(boven staande code)
An unhandled exception of type 'System.TypeLoadException' occurred in c++ net form.exe

Additional information: Could not load type DBL_TABLE from assembly c++ net form, Version=1.0.2265.24691, Culture=neutral, PublicKeyToken=null.
in 'gewoon' c++ doe ik t via:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//list tables
printf("listing tables\n");
DBL_S32         TableNo = DBL_NextTable(0);
DBL_HTABLE      hTable;
while (TableNo != 0)
{
    DBL_Allow(DBL_Err_TableNotFound);
        if (!DBL_OpenTable(&hTable, TableNo))
        {
          printf("Table No %d Not Found Error !\n",TableNo);
          return;
        }
        printf("table: %d : %s\n",DBL_TableNo(DBL_TableName(hTable)), DBL_TableName(hTable));
    DBL_CloseTable(hTable);
        TableNo = DBL_NextTable(TableNo);
}

en dat werkt wel.

EDIT: handig om ff erbij te vermelden dat de .c en de .h gebruikt worden om een cfront.dll te gebruiken (waarmee je de database kan benaderen)

[ Voor 10% gewijzigd door PoweRoy op 15-03-2006 13:59 ]

[This space is for rent]


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
hmm na een beetje zoeken heb ik relevante artikels gevonden:
http://support.microsoft....aspx?scid=kb;EN-US;871182
http://www.winterdom.com/mcppfaq/archives/000262.html

form1.h staat de code bv klikken op een button die de code in FP staat
in cf.h (van navision zelf)
C:
1
2
typedef struct DBL_REC      *DBL_HREC;
typedef struct DBL_TABLE    *DBL_HTABLE;

naar
C:
1
2
3
4
5
6
7
8
typedef struct DBL_REC      *DBL_HREC;      
struct DBL_REC
{
};
typedef struct DBL_TABLE    *DBL_HTABLE;
struct DBL_TABLE
{
};


maar daar krijg ik een syntax error op beide '}'. Beetje vreemd als MS dit als antwoord geeft 8)7
kan het eraan liggen dat het in een header file staat en niet in een .c of een .cpp?

[ Voor 6% gewijzigd door PoweRoy op 17-03-2006 09:26 ]

[This space is for rent]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:20

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee dat maakt niets uit, een include plaatst de contents van de opgegeven file letterlijk op de plaats waar de include staat. Dit is ook een aparte stap dat door de preprocessor gedaan wordt, daarna wordt pas gecompileerd. De daadwerkelijke compiler heeft dan ook niet echt weet van de verschillende files

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 21:19
werkt nu (goh wat je op een maandag morgen kan doen 8)7 ):

de cf.h (van navision)
C:
1
2
3
4
5
6
7
8
9
10
typedef struct DBL_REC      *DBL_HREC;      
struct DBL_REC
{
    int temp; //dit moet anders error op }
};
typedef struct DBL_TABLE    *DBL_HTABLE;
struct DBL_TABLE
{
    int temp;//dit moet anders error op }
};


de code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
void GetTables(void)
        {
            DataTable *dTable = new DataTable(S"List Tables");
            
            //1st column
            DataColumn *dColumn = new DataColumn(S"Table nr");//,System::Type::GetType("System::Int32")
            dTable->Columns->Add(dColumn);
            //2nd column
            dColumn = new DataColumn(S"Table Name");//,System::Type::GetType(S"System::String")
            dTable->Columns->Add(dColumn);
            //3rd column
            //dColumn = new DataColumn("n# records",System.Type.GetType("System.Int32"));
            //dTable.Columns.Add(dColumn);

            DataRow *dRow;
            DBL_U8 * tName;

            hTable = new DBL_HTABLE;
            DBL_S32  tNumber = DBL_NextTable(0);
            DBL_Allow(DBL_Err_TableNotFound);
            while (tNumber != 0)
            {
                if (!DBL_OpenTable(hTable, tNumber)) //&hTable
                    tName = (DBL_U8*)"Error";
                else
                    tName = DBL_TableName(*hTable);

                dRow = dTable->NewRow();
                dRow->Item[0] = __box((int)tNumber); //kopieerd blijkbaar de waarde naar de heap
                dRow->Item[1] = (String *)reinterpret_cast<const char*>(tName);
                //dRow["n# records"] = DBL_RecCount(htable); <-- geen rechten voor sommige tabellen (geen manier om op te vangen)
                dTable->Rows->Add(dRow);

                DBL_CloseTable(*hTable);
                tNumber = DBL_NextTable(tNumber);
            }
            DBL_CloseTable(*hTable);
            dataGrid1->SetDataBinding(dTable,S"");
            return;
        }


nu weer verder met t programma __gc errors weghalen

[This space is for rent]

Pagina: 1