Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem mit einem Struct 2

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.01.2005, 12:08 Uhr
dad_an_der_fh



Nachdem ich nun den Ansatz verfolgt habe,

ARMarkerInfo Struct;
ARMarkerInfo* marker_info = &Struct;

bekomme ich Fehler:

cJOB\Source\__ARBlueBox\ARMarkerTracking.h(62): error C2864: 'marker_info' : Es können nur konstante statische integrale Datenmember innerhalb einer Klasse oder einer Struktur initialisiert werden
cJOB\Source\__ARBlueBox\ARMarkerTracking.h(62): error C2065: 'Struct' : nichtdeklarierter Bezeichner
cJOB\Source\__ARBlueBox\ARMarkerTracking.h(62): error C2327: 'ARMarker::Struct' : Element der einschließenden Klasse ist kein Typname, nicht statisch und kein Enumerator

Was mach ich da Falsch?


Ich hab auch folgendes probiert:

C++:
//Konstruktor
...
    marker_info = (ARMarkerInfo*)malloc(sizeof(marker_info));
    marker_info->area = 0;
    marker_info->cf = 0;
    marker_info->dir = 0;
    marker_info->id = 0;
    for(int i=0; i<4; i++) {
        for(int j=0; j<3; j++) {
            marker_info->line[i][j] = 0;
        }
    }
    for(int i=0; i<2; i++) {
        marker_info->pos[i] = 0;
    }
    for(int i=0; i<4; i++) {
        for(int j=0; j<2; j++) {
            marker_info->vertex[i][j] = 0;
        }
    }
...



jedoch bringt er mir jetzt überall wo ich ein new mache eine Speicherverletzung.

C++:
//a.h
    char* path_gfx_typ;
    char* path_gfx_dir;
//a.cpp
    path_gfx_typ        = new char[40];
    path_gfx_dir        = new char[40];



Hat jemand noch eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.01.2005, 12:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


habs mir nicht richtig angeguckt aber das erste was mir ins gesicht springt ist das du new und malloc mischt... leg dich mal auf eines fest...

dann seh ich nirgendwo was davon wie du den speicher für marker_info->line pos und vertex allokiert hast...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.01.2005, 13:27 Uhr
dad_an_der_fh



meinst du es so:

marker_info = new ARMarkerInfo;
marker_info->area = *new int;
marker_info->cf = *new double;
...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2005, 13:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


äh weiss ich nicht genau... poste doch erstmal wie dein struct aussieht (also wie du es definiert hast) und wo und wie du da überall was allokiert hast...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.01.2005, 13:43 Uhr
dad_an_der_fh



Das Struct:


C++:
typedef struct {
    int     area;
    int     id;
    int     dir;
    double  cf;
    double  pos[2];
    double  line[4][3];
    double  vertex[4][2];
} ARMarkerInfo;


Mein Ansatz:

C++:
ARMarkerInfo*    marker_info;
....
marker_info = new ARMarkerInfo;

marker_info->area = *new int;
marker_info->cf = *new double;
marker_info->dir = *new int;
marker_info->id = *new int;
for(int i=0; i<4; i++) {
    for(int j=0; j<3; j++) {
        marker_info->line[i][j] = *new double;
    }
}
for(int i=0; i<2; i++) {
    marker_info->pos[i] = *new double;
}
for(int i=0; i<4; i++) {
    for(int j=0; j<2; j++) {
        marker_info->vertex[i][j] = *new double;
    }
}



So richtig will er aber net, er bringt immernoch:

DAMAGE: after Normal block (#292) at 0x05D3D260.
Normal located at 0x05D3D260 is 18 bytes long.
etc.....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.01.2005, 14:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm also als erstes... wiso nimmst du eigentlich ein stuct wenn du schon c++ verwenden willst kannst du doch auch ne klasse verwenden und in dieser dann das speichermanagement betreiben lassen... (aber das nur mal so nebenbei...)...


C++:
ARMarkerInfo*    marker_info;
....
marker_info = new ARMarkerInfo


äh wiso willst du das hier allokieren... kannst doch auch gleich


C++:
ARMarkerInfo   marker_info;


verwenden... aber ok wenns denn sein muss


C++:
marker_info->area = *new int;
marker_info->cf = *new double;
marker_info->dir = *new int;
marker_info->id = *new int;


das ist alles blödsinn das sind keine arrays und auch keine zeiger... da brauchst du nix allokieren der speicherplatz wird automatisch zur verfügung stelllt sowie du ein struct instantierst... also hau das in die tonne...


C++:
for(int i=0; i<4; i++) {
    for(int j=0; j<3; j++) {
        marker_info->line[i][j] = *new double;
    }
}
for(int i=0; i<2; i++) {
    marker_info->pos[i] = *new double;
}
for(int i=0; i<4; i++) {
    for(int j=0; j<2; j++) {
        marker_info->vertex[i][j] = *new double;
    }
}


hier auch die selber frage... was soll das denn werden.. du hast doch schon speicher fester grösse bereitgestellt da brauchst du nix allokieren das kannst du weglassen...

und an der stelle zeigt sich auch warum es schlauer ist ggf ne klasse zu verwenden damit du das speichermanagement kapseln kannst (so du nicht double pos[2]; double line[4][3]; double vertex[4][2]; schreibst sondern double *pos; double *line; double **vertex; müsstest du speicher selber mit new allokieren und dann würde sich ganz besonders ne klasse anbeiten)...

also kurz gesagt wenn du dein strukt so wie oben definierst brauchst und darfst du new eigentlich gar nicht verwenden...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.01.2005, 15:06 Uhr
dad_an_der_fh



aber wieso bekomme ich dann:

DAMAGE: after Normal block (#237) at 0x05D3D010.
Normal located at 0x05D3D010 is 18 bytes long.
DAMAGE: after Normal block (#226) at 0x05D3BC60.
Normal located at 0x05D3BC60 is 12 bytes long.
DAMAGE: after Normal block (#109) at 0x05D38218.
Normal located at 0x05D38218 is 12 bytes long.
DAMAGE: after Normal block (#237) at 0x05D3D010.
Normal located at 0x05D3D010 is 18 bytes long.
DAMAGE: after Normal block (#226) at 0x05D3BC60.
Normal located at 0x05D3BC60 is 12 bytes long.
DAMAGE: after Normal block (#109) at 0x05D38218.
Normal located at 0x05D38218 is 12 bytes long.
Second Chance Assertion Failed: File dbgheap.c, Line 346
Unbehandelte Ausnahme bei 0x778813b1 in ARBlueBox.exe: Benutzerhaltepunkt.

an der Stelle wo ich die Werte füllen lasse:


C++:
if( arDetectMarker( /*unsigned char* */frame_data,  /* int */ thresh, &marker_info, /* int */ &marker_num ) < 0 ) {
    cleanup();
    exit(0);
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.01.2005, 15:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zeig mal code wie du da was mit werten füllst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.01.2005, 15:44 Uhr
dad_an_der_fh



steht in ner fremden libary, müßte aber so aussehen:


C++:
int arDetectMarker( ARUint8 *dataPtr, int thresh,
                    ARMarkerInfo **marker_info, int *marker_num )
{
    ARInt16                *limage;
    int                    label_num;
    int                    *area, *clip, *label_ref;
    double                 *pos;
    double                 rarea, rlen, rlenmin;
    double                 diff, diffmin;
    int                    cid, cdir;
    int                    i, j, k;

    *marker_num = 0;

    limage = arLabeling( dataPtr, thresh,
                         &label_num, &area, &pos, &clip, &label_ref );
    if( limage == 0 )    return -1;

    marker_info2 = arDetectMarker2( limage, label_num, label_ref,
                                    area, pos, clip, AR_AREA_MAX, AR_AREA_MIN,
                                    1.0, &wmarker_num);
    if( marker_info2 == 0 ) return -1;

    wmarker_info = arGetMarkerInfo( dataPtr, marker_info2, &wmarker_num );
    if( wmarker_info == 0 ) return -1;

    for( i = 0; i < prev_num; i++ ) {
        rlenmin = 10.0;
        cid = -1;
        for( j = 0; j < wmarker_num; j++ ) {
            rarea = (double)prev_info[i].marker.area / (double)wmarker_info[j].area;
            if( rarea < 0.7 || rarea > 1.43 ) continue;
            rlen = ( (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0])
                   * (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0])
                   + (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1])
                   * (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]) ) / wmarker_info[j].area;
            if( rlen < 0.5 && rlen < rlenmin ) {
                rlenmin = rlen;
                cid = j;
            }
        }
        if( cid >= 0 && wmarker_info[cid].cf < prev_info[i].marker.cf ) {
            wmarker_info[cid].cf = prev_info[i].marker.cf;
            wmarker_info[cid].id = prev_info[i].marker.id;
            diffmin = 10000.0 * 10000.0;
            cdir = -1;
            for( j = 0; j < 4; j++ ) {
                diff = 0;
                for( k = 0; k < 4; k++ ) {
                    diff += (prev_info[i].marker.vertex[k][0] - wmarker_info[cid].vertex[(j+k)%4][0])
                          * (prev_info[i].marker.vertex[k][0] - wmarker_info[cid].vertex[(j+k)%4][0])
                          + (prev_info[i].marker.vertex[k][1] - wmarker_info[cid].vertex[(j+k)%4][1])
                          * (prev_info[i].marker.vertex[k][1] - wmarker_info[cid].vertex[(j+k)%4][1]);
                }
                if( diff < diffmin ) {
                    diffmin = diff;
                    cdir = (prev_info[i].marker.dir - j + 4) % 4;
                }
            }
            wmarker_info[cid].dir = cdir;
        }
    }

    for( i = 0; i < wmarker_num; i++ ) {
/*
    printf("cf = %g\n", wmarker_info[i].cf);
*/

        if( wmarker_info[i].cf < 0.5 ) wmarker_info[i].id = -1;
   }


/*------------------------------------------------------------*/

    for( i = j = 0; i < prev_num; i++ ) {
        prev_info[i].count++;
        if( prev_info[i].count < 4 ) {
            prev_info[j] = prev_info[i];
            j++;
        }
    }
    prev_num = j;

    for( i = 0; i < wmarker_num; i++ ) {
        if( wmarker_info[i].id < 0 ) continue;

        for( j = 0; j < prev_num; j++ ) {
            if( prev_info[j].marker.id == wmarker_info[i].id ) break;
        }
        prev_info[j].marker = wmarker_info[i];
        prev_info[j].count  = 1;
        if( j == prev_num ) prev_num++;
    }

    for( i = 0; i < prev_num; i++ ) {
        for( j = 0; j < wmarker_num; j++ ) {
            rarea = (double)prev_info[i].marker.area / (double)wmarker_info[j].area;
            if( rarea < 0.7 || rarea > 1.43 ) continue;
            rlen = ( (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0])
                   * (wmarker_info[j].pos[0] - prev_info[i].marker.pos[0])
                   + (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1])
                   * (wmarker_info[j].pos[1] - prev_info[i].marker.pos[1]) ) / wmarker_info[j].area;
            if( rlen < 0.5 ) break;
        }
        if( j == wmarker_num ) {
            wmarker_info[wmarker_num] = prev_info[i].marker;
            wmarker_num++;
        }
    }


    *marker_num  = wmarker_num;
    *marker_info = wmarker_info;

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.01.2005, 20:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also ich steig da immer noch nicht so ganz durch was du da überhaupt machen willst aber um die mal ein beispiel zu geben...

wolltest du das von dir definierte struct mit werten füllen würde das in etwa so ablaufen...

C++:
typedef struct {
    int     area;
    int     id;
    int     dir;
    double  cf;
    double  pos[2];
    double  line[4][3];
    double  vertex[4][2];
} ARMarkerInfo;





C++:
ARMarkerInfo armi;

armi.area=0;
armi.id=0;
armi.id=4711;
armi.cf=0.815;
for(i=0;i<2;++i)pos[i]=i;
for(j=0;j<4;++j)for(i=0;i<3;++i)armi.line[j][i]=j*i;
for(j=0;j<4;++j)for(i=0;i<2;++i)armi.vertex[j][i]=j+i;



ob der spass nun in einer anderen funktion steht oder wo auch immer wichtig dabei ist das du die arraygrenzen nicht überschreitet und wie gesagt so wie du das struct definiert hast ist kein speicher zu allokieren...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 18.01.2005 um 20:51 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: