amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Welcher fehler im Programm? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

01.02.2006, 23:34 Uhr

MaikG
Posts: 5172
Nutzer
Ich hab hier ein Programmteil, der eigentlich Bilder
über Datatypes zeigen soll. Unter AGA(bzw. dazu umlenken)
geht das auch, nur leider nicht auf Graka. Ein Screen öffnet
sich, das Bild wird jedoch nicht dargestellt.

Sieht da jemand den Fehler? Hab keinen gefunden(Anfänger), notfalls
müsste ich ein Programm das die Funktion übernimmt einfügen.


WORD showdatatypepicture(struct FMHandle *h,struct DataType *dt,struct CMenuConfig *cmc)
{
struct DataTypeHeader *dth;
Object *obj;
struct ShowScreen shows;
struct BitMapHeader *bmhd=0;
ULONG modeid=0;
struct BitMap *bm;
struct gpLayout layout;
ULONG *creg,*palette=0;
LONG ncol,crsize,palsize;
UBYTE *src;
LONG type;
WORD ret=0;

changename(h->owner,cmc->label);
priority(cmc);

memseti(&shows,0,sizeof(struct ShowScreen));
dth=dt->dtn_Header;

if(h->flags&OFDECRUNCH) {
type=DTST_RAM;
src=h->decbuffer;
} else {
type=DTST_FILE;
src=h->filename;
}


pictureinfo(h,0,0,0,0,dth->dth_Name);
if(!(obj=NewDTObject(src,DTA_SourceType,type,DTA_GroupID,GID_PICTURE,PDTA_Remap,TRUE,TAG_DONE))) goto error;
if(GetDTAttrs(obj,PDTA_ModeID,&modeid,PDTA_BitMapHeader,&bmhd,TAG_DONE)!=2) goto error;
pictureinfo(h,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,dth->dth_Name);
layout.MethodID=DTM_PROCLAYOUT;
layout.gpl_GInfo=NULL;
layout.gpl_Initial=TRUE;
if(!DoDTMethodA(obj,NULL,NULL,(Msg)&layout)) goto error;
if(GetDTAttrs(obj,PDTA_BitMap,&bm,PDTA_CRegs,&creg,PDTA_NumColors,&ncol,TAG_DONE)!=3) goto error;
if(!bm||!creg||!ncol) goto error;
crsize=(ncol*3)*4;
palsize=crsize+2*4;
palette=allocvec(h->owner,palsize,MEMF_CLEAR);
if(!palette) goto error;
palette[0]=ncol<<16;
CopyMem(creg,&palette[1],crsize);
if(openshowscreen(h->owner,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,&shows)) {
LoadRGB32(&shows.screen->ViewPort,palette);
BltBitMap(bm,0,0,shows.bitmap,0,0,bmhd->bmh_Width,bmhd->bmh_Height,0xC0,0xFF, NULL);
WaitBlit();
SetPointer(shows.window,shows.mouse,2,16,0,0);
ret=waitbutton(shows.window)+1;
closeshowscreen(&shows);
}
goto picerr;
error:
if(!ret) requestmsg(h->owner->workname,0,MSG_OK,MSG_MAIN_DATATYPEERROR,dth->dth_Name);
picerr:
freemem(palette);
if(obj) DisposeDTObject(obj);
return(ret);
}
WORD openshowscreen(struct FMList *list,WORD wide,WORD high,WORD deep,ULONG modeid,WORD realw,WORD realh,WORD reald,struct ShowScreen *shows)
{
struct Rectangle spos, dclip, txto, stdo, maxo;
WORD oscan,apu2;
ULONG scrtags[24];
extern struct GfxBase *GfxBase;

memseti(scrtags,0,24*4);
shows->gfxbase=GfxBase;shows->tempbm=0;
shows->screen=0; shows->window=0; shows->bitmap=0; shows->mouse=0;
shows->mouse=allocvec(list,32,MEMF_CHIP|MEMF_CLEAR);
if(!shows->mouse) goto serr;

if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE|BMF_INTERLEAVED,0))) {
if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE,0))) {
requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
goto serr;
}
}

if(ModeNotAvailable(modeid)) modeid=modefallback(modeid,wide,high,deep);

spos.MinX=0; spos.MinY=0;

oscan=((QueryOverscan(modeid,&txto,OSCAN_TEXT))&&(QueryOverscan(modeid,&stdo,OSCAN_STANDARD))&&(QueryOverscan(modeid,&maxo,OSCAN_MAX)));

scrtags[0]=SA_Left; scrtags[1]=spos.MinX;
scrtags[2]=SA_Top; scrtags[3]=spos.MinY;
scrtags[4]=SA_Width; scrtags[5]=wide;
scrtags[6]=SA_Height; scrtags[7]=high;
scrtags[8]=SA_Depth;if(fmmain.kick<39&&deep>6) scrtags[9]=6; else scrtags[9]=deep;
scrtags[10]=SA_Type; scrtags[11]=CUSTOMSCREEN;
scrtags[12]=SA_BitMap; scrtags[13]=(ULONG)(shows->bitmap);
scrtags[14]=SA_DisplayID; scrtags[15]=modeid;
scrtags[16]=SA_Quiet; scrtags[17]=1;
scrtags[18]=SA_AutoScroll; scrtags[19]=1;
scrtags[20]=SA_BackFill; scrtags[21]=(ULONG)LAYERS_NOBACKFILL;

if (oscan) {
clipit(wide,high,&spos,&dclip,&txto,&stdo,&maxo);
scrtags[22]=SA_DClip; scrtags[23]=(ULONG)&dclip;
}

if (!(shows->screen=OpenScreenTagList(0,(struct TagItem*)scrtags))) {
requestmsg(list->workname,0,MSG_OK,MSG_MAIN_SCRERR1);
goto serr;
}
if (!(shows->window=OpenWindowTags(0,
WA_Left,0,WA_Top,0,WA_Width,wide,WA_Height,high,
WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_ACTIVEWINDOW|IDCMP_VANILLAKEY,
WA_Flags,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_NOCAREREFRESH,
WA_BackFill,LAYERS_NOBACKFILL,WA_SimpleRefresh,TRUE,
WA_CustomScreen,shows->screen,WA_BusyPointer,TRUE,
TAG_DONE))) {
requestmsg(list->workname,0,MSG_OK,MSG_MAIN_WINERR1);
goto serr;
}

apu2=1;

shows->tempbm=AllocBitMap(realw,1,reald,BMF_CLEAR,0);
printf("realw reald: %ld %ld ", realw, reald);
CopyMem(&shows->screen->RastPort,&shows->temprp,sizeof(struct RastPort));
shows->temprp.Layer=0;shows->temprp.BitMap=shows->tempbm;
if(!shows->tempbm||!apu2) {
requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
goto serr;
}
return(1);
serr:
closeshowscreen(shows);
return(0);
}

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 09:11 Uhr

Solar
Posts: 3680
Nutzer
Da geben sich die Admins solche Mühe mit einem [ code ] - Tag, das sogar Syntax Highlighting kann, und keiner nutzt es... in so einer Code-Wüste will doch niemand herumstochern...

Zur AmigaOS API kann ich nichts sagen, aber:


  • Mehr Leerzeichen (vor und nach Operatoren, zwischen Klammern und Inhalt);
  • Kommentieren!
  • evtl. <assert.h> statt "goto error"
C code:
WORD showdatatypepicture(struct FMHandle *h,struct DataType *dt,struct CMenuConfig *cmc)
{
    struct DataTypeHeader *dth;
    Object *obj;
    struct ShowScreen shows;
    struct BitMapHeader *bmhd=0;
    ULONG modeid=0;
    struct BitMap *bm;
    struct gpLayout layout;
    ULONG *creg,*palette=0;
    LONG ncol,crsize,palsize;
    UBYTE *src;
    LONG type;
    WORD ret=0;

    changename(h->owner,cmc->label);
    priority(cmc);

    memseti(&shows,0,sizeof(struct ShowScreen));
    dth=dt->dtn_Header;

    if(h->flags&OFDECRUNCH) {
        type=DTST_RAM;
        src=h->decbuffer;
    } else {
        type=DTST_FILE;
        src=h->filename;
    }


    pictureinfo(h,0,0,0,0,dth->dth_Name);
    if(!(obj=NewDTObject(src,DTA_SourceType,type,DTA_GroupID,GID_PICTURE,PDTA_Remap,TRUE,TAG_DONE))) goto error;
    if(GetDTAttrs(obj,PDTA_ModeID,&modeid,PDTA_BitMapHeader,&bmhd,TAG_DONE)!=2) goto error;
    pictureinfo(h,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,dth->dth_Name);
    layout.MethodID=DTM_PROCLAYOUT;
    layout.gpl_GInfo=NULL;
    layout.gpl_Initial=TRUE;
    if(!DoDTMethodA(obj,NULL,NULL,(Msg)&layout)) goto error;
    if(GetDTAttrs(obj,PDTA_BitMap,&bm,PDTA_CRegs,&creg,PDTA_NumColors,&ncol,TAG_DONE)!=3) goto error;
    if(!bm||!creg||!ncol) goto error;
    crsize=(ncol*3)*4;
    palsize=crsize+2*4;
    palette=allocvec(h->owner,palsize,MEMF_CLEAR);
    if(!palette) goto error;
    palette[0]=ncol<<16;
    CopyMem(creg,&palette[1],crsize);
    if(openshowscreen(h->owner,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,modeid,bmhd->bmh_Width,bmhd->bmh_Height,bmhd->bmh_Depth,&shows)) {
        LoadRGB32(&shows.screen->ViewPort,palette);
        BltBitMap(bm,0,0,shows.bitmap,0,0,bmhd->bmh_Width,bmhd->bmh_Height,0xC0,0xFF, NULL);
        WaitBlit();
        SetPointer(shows.window,shows.mouse,2,16,0,0);
        ret=waitbutton(shows.window)+1;
        closeshowscreen(&shows);
    }
    goto picerr;
error:
    if(!ret) requestmsg(h->owner->workname,0,MSG_OK,MSG_MAIN_DATATYPEERROR,dth->dth_Name);
picerr:
    freemem(palette);
    if(obj) DisposeDTObject(obj);
    return(ret);
}

WORD openshowscreen(struct FMList *list,WORD wide,WORD high,WORD deep,ULONG modeid,WORD realw,WORD realh,WORD reald,struct ShowScreen *shows)
{
    struct Rectangle spos, dclip, txto, stdo, maxo;
    WORD oscan,apu2;
    ULONG scrtags[24];
    extern struct GfxBase *GfxBase;

    memseti(scrtags,0,24*4);
    shows->gfxbase=GfxBase;shows->tempbm=0;
    shows->screen=0; shows->window=0; shows->bitmap=0; shows->mouse=0;
    shows->mouse=allocvec(list,32,MEMF_CHIP|MEMF_CLEAR);
    if(!shows->mouse) goto serr;

    if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE|BMF_INTERLEAVED,0))) {
        if(!(shows->bitmap=AllocBitMap(realw,realh,reald,BMF_CLEAR|BMF_DISPLAYABLE,0))) {
            requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
            goto serr;
        }
    }

    if(ModeNotAvailable(modeid)) modeid=modefallback(modeid,wide,high,deep);

    spos.MinX=0; spos.MinY=0;

    oscan=((QueryOverscan(modeid,&txto,OSCAN_TEXT))&&(QueryOverscan(modeid,&stdo,OSCAN_STANDARD))&&(QueryOverscan(modeid,&maxo,OSCAN_MAX)));

    scrtags[0]=SA_Left; scrtags[1]=spos.MinX;
    scrtags[2]=SA_Top; scrtags[3]=spos.MinY;
    scrtags[4]=SA_Width; scrtags[5]=wide;
    scrtags[6]=SA_Height; scrtags[7]=high;
    scrtags[8]=SA_Depth;
    if(fmmain.kick<39&&deep>6) scrtags[9]=6;
    else     scrtags[9]=deep;
    scrtags[10]=SA_Type; scrtags[11]=CUSTOMSCREEN;
    scrtags[12]=SA_BitMap; scrtags[13]=(ULONG)(shows->bitmap);
    scrtags[14]=SA_DisplayID; scrtags[15]=modeid;
    scrtags[16]=SA_Quiet; scrtags[17]=1;
    scrtags[18]=SA_AutoScroll; scrtags[19]=1;
    scrtags[20]=SA_BackFill; scrtags[21]=(ULONG)LAYERS_NOBACKFILL;

    if (oscan) {
        clipit(wide,high,&spos,&dclip,&txto,&stdo,&maxo);
        scrtags[22]=SA_DClip; scrtags[23]=(ULONG)&dclip;
    }

    if (!(shows->screen=OpenScreenTagList(0,(struct TagItem*)scrtags))) {
        requestmsg(list->workname,0,MSG_OK,MSG_MAIN_SCRERR1);
        goto serr;
    }
    if (!(shows->window=OpenWindowTags(0, WA_Left,0,WA_Top,0,WA_Width,wide,WA_Height,high,
        WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_ACTIVEWINDOW|IDCMP_VANILLAKEY,
        WA_Flags,WFLG_BACKDROP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_RMBTRAP|WFLG_NOCAREREFRESH,
        WA_BackFill,LAYERS_NOBACKFILL,WA_SimpleRefresh,TRUE,
        WA_CustomScreen,shows->screen,WA_BusyPointer,TRUE,
        TAG_DONE))) {
        requestmsg(list->workname,0,MSG_OK,MSG_MAIN_WINERR1);
        goto serr;
    }

    apu2=1;

    shows->tempbm=AllocBitMap(realw,1,reald,BMF_CLEAR,0);
    printf("realw reald: %ld %ld ", realw, reald);
    CopyMem(&shows->screen->RastPort,&shows->temprp,sizeof(struct RastPort));
    shows->temprp.Layer=0;shows->temprp.BitMap=shows->tempbm;
    if(!shows->tempbm||!apu2) {
        requestmsg(list->workname,0,MSG_OK,MSG_MAIN_ERRNOBITMAP);
        goto serr;
    }
    return(1);
serr:
    closeshowscreen(shows);
    return(0);
}


[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 10:15 Uhr

MaikG
Posts: 5172
Nutzer
>Da geben sich die Admins solche Mühe mit einem [ code ] - Tag, das
>sogar Syntax Highlighting kann, und keiner nutzt es... in so einer
>Code-Wüste will doch niemand herumstochern...

Ich vergesse immer wie das geht.
@Admin wenn das z.B. wo fett und kursiv steht währe müsste
man das nicht auswendig lernen.

>Zur AmigaOS API kann ich nichts sagen, aber:
>o Mehr Leerzeichen (vor und nach Operatoren, zwischen Klammern und Inhalt);
>o Kommentieren!
>o evtl. <assert.h> statt "goto error"

Der Programmteil ist ja nicht von mir, ich will ihn nur
fixen.

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 10:36 Uhr

thomas
Posts: 7718
Nutzer

Du solltest es neu schreiben. Sowas umständliches habe ich noch nicht gesehen. Wozu soll das denn alles gut sein ?


Der Fehler dürfte sein, daß die geladene Bitmap nicht mit dem Pixelformat des Screens übereinstimmt. Beim Öffnen der Datei wird zwar PDTA_Remap,TRUE mitgegeben, aber kein Pointer auf einen Screen. Dementsprechend kann die Bitmap auch nicht für den Screen gerendert werden.

Entweder ich mache zuerst den Screen auf und lasse das Bild dann für diesen Screen rendern, oder ich öffne erst die Datei und dann einen Screen, der genau zu dem Bild paßt. Beides mischen geht nicht.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 13:29 Uhr

_PAB_
Posts: 3016
Nutzer
@MaikG:
Du suchst den "Hilfe"-Link in der oberen Navigationszeile ?
http://www.amiga-news.de/forum/help.php

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 13:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
evtl. <assert.h> statt "goto error"

Zwischen Fehlerbedingungen und Annahmen besteht doch ein gewaltiger Unterschied. assert ist keine Alternative zu einem Abbruch im Fehlerfall.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 13:59 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Der Fehler dürfte sein, daß die geladene Bitmap nicht mit dem Pixelformat des Screens übereinstimmt. Beim Öffnen der Datei wird zwar PDTA_Remap,TRUE mitgegeben, aber kein Pointer auf einen Screen. Dementsprechend kann die Bitmap auch nicht für den Screen gerendert werden.


Ach, die Chancen stehen gar nicht mal so schlecht. Schließlich legt er die Screen-BitMap ja über AllocBitMap an. (Kann man leicht übersehen, bei diesem Code...) Deshalb werden beide mit ziemlicher Sicherheit AGA-BitMaps sein.
Nur daß RTG-Screens eine solche BitMap natürlich nicht anzeigen können...
Mich wundert eher, daß sich überhaupt ein Screen öffnet.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 18:50 Uhr

MaikG
Posts: 5172
Nutzer
>Du solltest es neu schreiben.

Ich hab nur ein C Beispiel ohne Screen. Ggf muss das auch
"eingepasst" werden.

>Der Fehler dürfte sein, daß die geladene Bitmap nicht mit
>dem Pixelformat des Screens übereinstimmt. Beim Öffnen der
>Datei wird zwar PDTA_Remap,TRUE mitgegeben, aber kein
>Pointer auf einen Screen. Dementsprechend kann die Bitmap
>auch nicht für den Screen gerendert werden.


Ich hab schon Remap FALSE gemacht und V43(24 Bit) gesetzt.
Wird auch als 24 Bit erkannt und ein 24 Bit Screen geöffnet.

>@MaikG:
>Du suchst den "Hilfe"-Link in der oberen Navigationszeile ?
>http://www.amiga-news.de/forum/help.php

Ich weiss es steht unter hilfe Aweb 3.5.07 hat aber ein
Problem mit dem Refresh, wenn man was falsches macht ist
der geschriebene Text weck. Kannst du das nicht bei dem
fett+kursiv hinpacken, wenigstens in Programmierung?

>Nur daß RTG-Screens eine solche BitMap natürlich nicht anzeigen
>können...

Wenn die Bitmap in 24 Bit vorliegt gehts aber auch nicht(V43).

>Mich wundert eher, daß sich überhaupt ein Screen öffnet.

Warum nicht? Es wird immer der korrekte Screen mit dem korrekten
Fenster geöffnet. Es kann sein das ich Unterprogramme die benötigt
werden hier nicht gepostet habe.

[ - Antworten - Zitieren - Direktlink - ]

02.02.2006, 19:45 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Wenn die Bitmap in 24 Bit vorliegt gehts aber auch nicht(V43).

Welche?
Du hantierst mit mindestens zwei verschiedenen BitMaps herum, einer, die Du von DataType bekommst und einer, die Du selbst per AllocBitMap() anlegst.
Letztere wird angelegt, ohne das die OS-Funktion den geringsten Hinweis darauf bekommt, welche ModeID der Screen hinterher haben wird.

Somit hast Du gleich zwei potentielle Inkompatiblitäten in Deinem Programm, genaugenommen drei, weil Du erst danach überprüfst, ob die ModeID gültig ist und sie dann möglicherweise noch mal änderst.
Mal abgesehen davon, daß das alles überhaupt nicht nötig ist. Öffne einfach einen Screen und Du bekommst eine kompatible BitMap frei Haus.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 09:47 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:

Zwischen Fehlerbedingungen und Annahmen besteht doch ein gewaltiger Unterschied. assert ist keine Alternative zu einem Abbruch im Fehlerfall.


Ein assert() ist ein Abbruch im Fehlerfall...

Ich hab' nicht in's Detail geschaut, nur flugs den Code eingerückt und in code-Tags gesetzt. Aber "goto error" ist mir ein bißchen zu sehr VisualBasic... normalerweise läßt sich das besser lösen.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 13:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Ein assert() ist ein Abbruch im Fehlerfall...

Dann meinst Du ein anderes assert als ich. Für mich ist assert() etwas, das man sogar abschalten kann. Ganz abgesehen davon, daß ich schon Programme erlebt habe, die mir mit assertion-Fehlermeldungen die Konsolen vollgekleistert haben, aber gar nicht daran dachten, sich zu beenden (in einigen Fällen: zum Glück).
Ich weiß auch nicht, inwieweit assert einen sauberen Ausstieg inkl. Freigeben der Resourcen ermöglichen soll, außer es verwendet intern doch goto.
Zitat:
Aber "goto error" ist mir ein bißchen zu sehr VisualBasic... normalerweise läßt sich das besser lösen.
"normalerweise" ist dehnbar. Ich bin auch kein Freund von goto; unter C++ oder anderen zeitgemäßen Sprachen würde ich sofort exceptions empfehlen. Oder halt return, wenn kein Rückgabewert verlangt wurde und beim Verlassen des Scope korrekt aufgeräumt wird.
Bei plain C gibt es fast immer nur eine Alternative: dutzende verschachtelte if() Anweisungen. Und da laß ich mitunter ein goto durchgehen...

Wobei es bei dem Code dieses Threads nach Entfernung aller unnötigen Operationen wahrscheinlich wirklich ohne goto gehen sollte.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 14:29 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:

Für mich ist assert() etwas, das man sogar abschalten kann.


Korrekt. NDEBUG definiert, und schon sind die assert()s draußen. zumindest die der Standardbibliothek; man kann sich natürlich auch selbst eine assert()-Funktion basteln.

Zitat:
Ganz abgesehen davon, daß ich schon Programme erlebt habe, die mir mit assertion-Fehlermeldungen die Konsolen vollgekleistert haben, aber gar nicht daran dachten, sich zu beenden (in einigen Fällen: zum Glück).
Ich weiß auch nicht, inwieweit assert einen sauberen Ausstieg inkl. Freigeben der Resourcen ermöglichen soll, außer es verwendet intern doch goto.


assert() ruft im Fehlerfall raise(SIGABRT). Ob der Default-Handler für SIGABRT Dateien flusht und schließt und temporäre Dateien entfernt, ist implementierungsabhängig.

Wenn ein Programm einen SIGABRT-Handler installiert, der zum Aufrufer (raise()) zurückkehrt, ruft assert() exit( EXIT_FAILURE ). In keinem Fall darf assert() im Fehlerfall zum Aufrufer zurückkehren.

Das sagt der Standard. Was die jeweils benutzte C-Lib daraus macht...

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 14:36 Uhr

MaikG
Posts: 5172
Nutzer
>Welche?

Wenn der Datatype 24 Bit liefert(V43), dann werden auch
24 Bit erkannt.

>Du hantierst mit mindestens zwei verschiedenen BitMaps
>herum, einer, die Du von DataType bekommst und einer,
>die Du selbst per AllocBitMap() anlegst.
>Letztere wird angelegt, ohne das die OS-Funktion den
>geringsten Hinweis darauf bekommt, welche ModeID der
>Screen hinterher haben wird.

Also eigentlich habe ich mich nie richtig mit dem
ganzen beschäftigt, ich hatte für DTypes verwendung immer
Beispielprogramme. Die hab ich nach meinen bedürfnissen
angepasst und es lief dann.

>Somit hast Du gleich zwei potentielle Inkompatiblitäten in
>Deinem Programm, genaugenommen drei, weil Du erst danach
>überprüfst, ob die ModeID gültig ist und sie dann möglicherweise
>noch mal änderst.
>Mal abgesehen davon, daß das alles überhaupt nicht nötig ist.
>Öffne einfach einen Screen und Du bekommst eine kompatible BitMap
>frei Haus.

Ist ja nicht mein Programm, ich hab auch schon gesehen das
bei AllocBitmap einmal Interleaved angegenen wird wenn das
nicht geht nochmal AllocBitmap ohne Interleaved. Laut AutoDocs
macht das OS das selbst.

Ich hab unter C ein Beispiel mit DType auf einem Fenster.
Screen öffnen ist klar, aber vorher brauche ich die Bilddimensionen
um bestimmen zu können was für ein Schirm ich öffnen möchte.
Dann ist da ja noch was mit der Colormap, ich hab das unter
Basic weiss aber nicht wie es unter C geht.

Gibts nicht irgendwo ein Beispiel mit Screen?

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 14:43 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Solar:
Korrekt. NDEBUG definiert, und schon sind die assert()s draußen. zumindest die der Standardbibliothek;

Eben—deswegen sind assertions auch nur angebracht, wenn es um Bedingungen geht, die bei einem fehlerfreien Programm immer erfüllt sind. In diesem Fall geht es aber um Bedingungen, die auch bei fehlerfreien Porgramm nicht erfüllt sein können, nämlich um Rückgabewerte der OS-Funktionen beim Einladen/Analysieren eines Bildes.
Die muß man immer prüfen, auch wenn man nicht debug't.
Aber gut—Du hast Dir das Programm ja nicht so genau angesehen...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 15:10 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Gibts nicht irgendwo ein Beispiel mit Screen?


Ich hatte eigentlich gehofft, daß das jemand anderes macht... :D

Ich sitze hier eigentlich nicht auf Tonnen von Beispielsourcen. Wenn Du schon ein Beispiel mit Fenster hast, passe ich es Dir gerne an, falls es brauchbar ist und keiner hier schon ein fertiges screen-Beispiel hat.
Du müßtest Dein Fenster-Beispiel nur hier posten...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 16:30 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Holger:
Aber gut - Du hast Dir das Programm ja nicht so genau angesehen...


Selbst wenn würd's mir nix bringen. Als meine C/C++-Kenne anfing, für API-Programmierung auszureichen, war Amiga leider schon so auf dem absteigenden Ast, das ich mir das nicht mehr angetan habe.

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 17:26 Uhr

whose
Posts: 2156
Nutzer
@MaikG:

Ich sags mal so: Normal ist es nicht besonders sinnvoll, den Screen nach den Bildeigenschaften zu erstellen, weil es, je nach Hardware, einen passenden Screen-Modus dann und wann schon mal nicht geben könnte ;)

Für Screens habe ich jetzt ad hoc auch keine Quellen parat, ich kann Dir nur sagen, daß es technisch im Grunde nicht anders funktioniert wie mit einem Fenster. Letztendlich blittet man die vom Datatype erhaltene Bitmap ja "nur" in die Screen-Bitmap statt in die des Fensters. Ist zwar nicht gerade die feine Englische, aber erlaubt.

Zum Thema "wie bastel ich einen ViewPort nach den Vorgaben von Bildeigenschaften" kann ich leider kaum etwas sagen, weil ich mich damit nie tiefer beschäftigt habe. In der Theorie sollte das aber schon mit Deinem Programm problemlos machbar sein, sofern Du die Bildeigenschaften vollständig ausliest und den Screen exakt nach den Bildeigenschaften erstellst (das schließt auch Pixelformate mit ein!). Auf ModeIDs solltest Du in diesem Fall aber verzichten, da Du den Screen ja selbst erstellst.

Danach sollte es dann kein Problem sein, die vom Datatype erhaltene Bitmap platt in die Bitmap des Screens zu schreiben (ob per Blit...()-Funktionen oder mittels CopyMem() u.ä. ist in diesem Fall Wurst wie Käse, da nicht konvertiert werden muß).

Ich weiß jetzt allerdings nicht, ob das auf Dein Programm zutrifft, ich habs nur kurz überflogen und etwas unübersichtlich ist es noch dazu :P

Da es aber mit AGA-Screens funktioniert, scheint der von Dir erstellte Screen das Problem zu sein. So, wie sich mir das jetzt auf die Schnelle darstellt, würde ich mein Augenmerk einmal auf die Sache mit LoadRGB32 und folgende richten. Das macht bei einem 24Bit-Bild irgendwie gar keinen Sinn. Es sieht ganz so aus, als wäre dieses von Dir angepaßte Programm rein für AGA/ECS gedacht. Das macht den Umbau naturgemäß etwas schwierig.

Wenn Du Dich trotzdem etwas in Datatypes und deren Benutzung einarbeiten möchtest, kann ich Dir Thomas' Beispielquellen dazu nur wärmstens empfehlen. Schön einfach gehalten und vor allem alles Notwendige drin, was man zu dem Thema wissen sollte. Damit kommst Du schnell zu eigenen brauchbaren Ergebnissen.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 18:40 Uhr

MaikG
Posts: 5172
Nutzer
>Ich sitze hier eigentlich nicht auf Tonnen von Beispielsourcen.
>Wenn Du schon ein Beispiel mit Fenster hast, passe ich es Dir gerne
>an, falls es brauchbar ist und keiner hier schon ein fertiges
>screen-Beispiel hat.
>Du müßtest Dein Fenster-Beispiel nur hier posten...

Okay ist das von Thomas seine Seite:
C++ code:
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/datatypes.h>
#include <datatypes/pictureclass.h>

long min (long a,long b) {return (a < b ? a : b);}

int main (void)

{
struct RDArgs *rdargs;
static struct {
 char *file;
 char *pubscreen;
 } args = {NULL};
int rc = RETURN_ERROR;
struct Screen *scr;
Object *o;
struct BitMapHeader *bmhd;
struct BitMap *bm;
long winw,winh;
long winx,winy;
struct Window *win;
BOOL cont;
struct IntuiMessage *mess;

if (rdargs = ReadArgs ("FILE/A,PUBSCREEN/K",(APTR)&args,NULL))
 {
 if (scr = LockPubScreen (args.pubscreen))
 {

 if (o = NewDTObject (args.file,
 DTA_GroupID,GID_PICTURE,
 PDTA_Remap,TRUE,
 PDTA_Screen,scr,
 TAG_END))

 {
 DoDTMethod (o,NULL,NULL,DTM_PROCLAYOUT,NULL,TRUE);

 GetDTAttrs (o,
 PDTA_BitMapHeader,&bmhd,
 PDTA_DestBitMap,&bm,
 TAG_END);

 winw = min(scr->Width,  bmhd->bmh_Width);
 winh = min(scr->Height, bmhd->bmh_Height);
 winx = (scr->Width  - winw) >> 1;
 winy = (scr->Height - winh) >> 1;

 if (win = OpenWindowTags (NULL,
 WA_CustomScreen,scr,
 WA_Left,winx,
 WA_Top,winy,
 WA_Width,winw,
 WA_Height,winh,
 WA_Flags,WFLG_BORDERLESS|WFLG_ACTIVATE,
 WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_VANILLAKEY,
 TAG_END))
 {
 BltBitMapRastPort (bm,0,0,win->RPort,0,0,winw,winh,0xC0);

 rc = RETURN_OK;

 cont = TRUE;
 do {
 WaitPort (win->UserPort);
 while (mess = (struct IntuiMessage *)GetMsg (win->UserPort))
 {
 switch (mess->Class)
 {
 case IDCMP_MOUSEBUTTONS:
 if (mess->Code == IECODE_LBUTTON)
 cont = FALSE;
 break;
 case IDCMP_VANILLAKEY:
 if (mess->Code == 0x1b) /* Esc */
 cont = FALSE;
 break;
 }
 ReplyMsg ((struct Message *)mess);
 }
 }
 while (cont);

 CloseWindow (win);
 }

 DisposeDTObject (o);
 }

 UnlockPubScreen (NULL,scr);
 }

 FreeArgs (rdargs);
 }

PrintFault (IoErr(),NULL);
return (rc);
}



@whose

der schlimme Code müsste dir eigentlich bekannt vor kommen
ist von Filemaster...


[ Dieser Beitrag wurde von MaikG am 03.02.2006 um 18:43 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

03.02.2006, 23:43 Uhr

thomas
Posts: 7718
Nutzer
Hier ist ein Beispiel mit Screen:
C code:
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/datatypes.h>
#include <datatypes/pictureclass.h>
#include <string.h>

int main (void)

{
struct RDArgs *rdargs;
struct {
	char *file;
	} args;
Object *dto;
struct BitMapHeader *bmhd;
struct BitMap *bm;
ULONG modeid;
ULONG ncols;
ULONG *cregs;
ULONG *colortable;
struct Screen *scr;
struct Window *win;
struct IntuiMessage *mess;
BOOL cont;

if (rdargs = ReadArgs ("FILE/A",(ULONG *)&args,NULL))
	{
	if (dto = NewDTObject (args.file,DTA_GroupID,GID_PICTURE,PDTA_DestMode,PMODE_V43,TAG_END))
		{
		DoDTMethod (dto,NULL,NULL,DTM_PROCLAYOUT,NULL,1);

		GetDTAttrs (dto,
			PDTA_BitMapHeader,&bmhd,
			PDTA_BitMap,&bm,
			PDTA_ModeID,&modeid,
			PDTA_NumColors,&ncols,
			PDTA_CRegs,&cregs,
			TAG_END);

		if (scr = OpenScreenTags (NULL,
				SA_Width,bmhd->bmh_Width,
				SA_Height,bmhd->bmh_Height,
				SA_Depth,bmhd->bmh_Depth,
				SA_DisplayID,modeid,
				TAG_END))
			{
			if (colortable = AllocVec (ncols * 12 + 8,MEMF_CLEAR))
				{
				colortable[0] = ncols << 16;
				memcpy (&colortable[1],cregs,ncols * 12);
				LoadRGB32 (&scr->ViewPort,colortable);
				FreeVec (colortable);
				}

			if (win = OpenWindowTags (NULL,
					WA_CustomScreen,scr,
					WA_Width,scr->Width,
					WA_Height,scr->Height,
					WA_Flags,WFLG_BORDERLESS|WFLG_NOCAREREFRESH|WFLG_ACTIVATE,
					WA_IDCMP,IDCMP_MOUSEBUTTONS|IDCMP_VANILLAKEY,
					TAG_END))
				{
				BltBitMapRastPort (bm,0,0,win->RPort,0,0,win->Width,win->Height,0xc0);

				cont = TRUE;
				do	{
					if (Wait ((1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
						cont = FALSE;

					while (mess = (struct IntuiMessage *) GetMsg (win->UserPort))
						{
						cont = FALSE;
						ReplyMsg ((struct Message *) mess);
						}
					}
				while (cont);

				CloseWindow (win);
				}

			CloseScreen (scr);
			}

		DisposeDTObject (dto);
		}

	FreeArgs (rdargs);
	}
else
	PrintFault (IoErr(),NULL);

return (0);
}


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

04.02.2006, 18:38 Uhr

MaikG
Posts: 5172
Nutzer
Danke! Funktioniert.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Welcher fehler im Programm? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.