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

amiga-news.de Forum > Programmierung > Optimale Grafikprogrammierung für AGA&CGX [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

10.03.2004, 22:28 Uhr

Ralf27
Posts: 2779
Nutzer
Die meisten meiner Programme sind für AGA und unter Grafikkarte entwender nicht lauffähig oder mit Grafikfehlern. Und genau dieses möchte ich jetzt optimieren das es auf beiden läuft, AGA und Grafikkarte. Dazu jetzt meine Fragen:

Wenn ich jetzt z.b. ein Bildpunkt auslesen möchte, wie kann ich das am besten machen das es unter AGA und Grafikkarte genau so funktioniert? Geht auch ReadPixel auf einem CGX-Screen?!?

Wenn ich ein Punkt setzen möchte (z.b. mit WritePixel), geht das wahrscheinlich nur mit AGA richtig. Wie schauts unter Grafikkarte aus?
Gibt es eine Möglichkeit das es mit beiden läuft?


Beispiel:
Lese Farbwert vom Bildschirm. Unter AGA wäre es wohl die Farbnummer, unter Grafikkarte müßte es ja der Farbwert R G B sein.
Beim Setzen ist es ja ähnlich...



Ich weiß, das sind jetzt eigentlich Anfängerfragen... :)

Danke im vorraus!
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 00:27 Uhr

Mad_Dog
Posts: 1944
Nutzer
Die meisten Grafikfunktionen, wie z.B. die Grafikprimitiven funktionieren sowohl auf dem OCS/ECS/AGA Chipset, als auch unter CGX.
Wenn du diese sauber auf einen RastPort anwendest, sollte es eigentlich keine Probleme geben.

Die Funktion ReadPixel gibt immer die Nummer eines Stiftes zurück (siehe auch entsprechende Autodocs zur graphics.library).

Syntax: penno = ReadPixel(rp, x, y)

penno ist die Nummer des Stiftes als LONG, rp ist ein Zeiger auf einen RastPort, x und y sind die Koordinaten des Pixels vom Typ SHORT.

Alles weitere findest Du in den Autodocs.

Und ja: In meinem C-Kurs kommt das auch irgendwann mal dran. :D
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 08:31 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:
Die meisten Grafikfunktionen, wie z.B. die Grafikprimitiven funktionieren sowohl auf dem OCS/ECS/AGA Chipset, als auch unter CGX.
Wenn du diese sauber auf einen RastPort anwendest, sollte es eigentlich keine Probleme geben.

Die Funktion ReadPixel gibt immer die Nummer eines Stiftes zurück (siehe auch entsprechende Autodocs zur graphics.library).

Syntax: penno = ReadPixel(rp, x, y)

penno ist die Nummer des Stiftes als LONG, rp ist ein Zeiger auf einen RastPort, x und y sind die Koordinaten des Pixels vom Typ SHORT.

Alles weitere findest Du in den Autodocs.

Und ja: In meinem C-Kurs kommt das auch irgendwann mal dran. :D
--

http://www.norman-interactive.com



ReadPixel benutze ich schon recht lange, aber was mir augefallen ist das es bei einer Grafikkarte einen anderen Wert liefert bzw. das es da nicht richtig funktioniert. Bei einer Grafikkarte ist ReadRGBPixel und WriteRGBPixel ideal.

Ich frag mich nur ob ich vorher eine Abfrage machen soll ob Grafikkarte oder nicht:dance3:
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 12:53 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von Ralf27:

ReadPixel benutze ich schon recht lange, aber was mir augefallen ist das es bei einer Grafikkarte einen anderen Wert liefert bzw. das es da nicht richtig funktioniert. Bei einer Grafikkarte ist ReadRGBPixel und WriteRGBPixel ideal.

Ich frag mich nur ob ich vorher eine Abfrage machen soll ob Grafikkarte oder nicht:dance3:
--
http://www.alternativercomputerclub.de.vu



ReadPixel gibt dir die Pen-Nummer und ReadRGBPixel den RGB-Wert zurück. ReadPixel funktioniert immer, allerdings gibt es nur 256 Pens pro Screen. ReadRGBPixel funktioniert nur auf Screens mit 15/16 oder 24/32 Bit Farbtiefe.

Je nachdem, was du brauchst, mußt du halt unterscheiden, ob die Farbtiefe kleiner oder größer 8 Bit ist. Mit GetBitMapAttr(rastport->BitMap,BMA_DEPTH) bekommst du die Farbtiefe heraus. Wenn sie 8 oder kleiner ist, mußt du mit ReadPixel und GetRGB32 arbeiten, bei 16 oder 24 Bit mit ReadRGBPixel.

Wenn dir die High- und True-Color-Fähigkeiten der Grafikkarte egal sind, kannst du einfach für AGA programmieren und auf der Grafikkarte testen. Dann funktioniert's überall. Generell solltest du immer darauf achten, daß du vorhandene AllocXXX und FreeXXX Funktionen benutzt (z.B. AllocBitMap und FreeBitMap) und Speicher nicht selber mit AllocMem und FreeMem anforderst.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 20:04 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von thomas:

Je nachdem, was du brauchst, mußt du halt unterscheiden, ob die Farbtiefe kleiner oder größer 8 Bit ist. Mit GetBitMapAttr(rastport->BitMap,BMA_DEPTH) bekommst du die Farbtiefe heraus. Wenn sie 8 oder kleiner ist, mußt du mit ReadPixel und GetRGB32 arbeiten, bei 16 oder 24 Bit mit ReadRGBPixel.

Danke, es läuft wunderbar! :)
Denn Befehl GetMitMapAttr hätte ich nie dafür "gefunden". Hab eben ein Testprogramm geschrieben und es unter AGA/Grafikkarte getestet und es geht. :)
Zitat:
Wenn dir die High- und True-Color-Fähigkeiten der Grafikkarte egal sind, kannst du einfach für AGA programmieren und auf der Grafikkarte testen. Dann funktioniert's überall. Generell solltest du immer darauf achten, daß du vorhandene AllocXXX und FreeXXX Funktionen benutzt (z.B. AllocBitMap und FreeBitMap) und Speicher nicht selber mit AllocMem und FreeMem anforderst.
Ich öffne die Fenster unter AGA und Grafikkarte gleich: Mit dem Window-Befehl. Insofern komme ich erst gar nicht an die Bitmap.

Das einzige ist wenn ich direkt einen neuen Grafikkartenscreen aufmachen will, dann muß ich das mit den Befehlen der Libs machen.
Aber das müßte man glaub ich unter C so oder so. :)
Zitat:
Gruß Thomas

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


--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 20:58 Uhr

Ralf27
Posts: 2779
Nutzer
Der Befehl ist genial, genau das habe ich gesucht. Da kann man außerdem unabhängig die Breite,Höhe und die Flags auslesen. Gefällt mir. :D


Was mich jetzt noch interesiert(fällt mir eben so ein):
Bei OCS bis AGA gab es die Bitmaps mit Strukturen, etc. Wie sieht es denn bei Grafikkarten aus? (Ich will jetzt da nicht will Basic-Artig rumpoken :lach: ). Ich geh mal davon aus das es die gibt. Rein interesenhalber. :rotate:
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 21:17 Uhr

Mad_Dog
Posts: 1944
Nutzer
Strukturen gibt's überall im AmigaOS. :D

Ich weiß jetzt nicht, wie Du das meinst...

Meinst Du diese Sturktur aus graphics/gfx.h?

code:
struct BitMap
{
    UWORD   BytesPerRow;
    UWORD   Rows;
    UBYTE   Flags;
    UBYTE   Depth;
    UWORD   pad;
    PLANEPTR Planes[8];
};


oder meinst Du die Struktur des RastPort aus graphics/rastport.h ?

code:
struct RastPort
{
    struct  Layer *Layer;
    struct  BitMap   *BitMap;
    UWORD  *AreaPtrn;      /* ptr to areafill pattern */
    struct  TmpRas *TmpRas;
    struct  AreaInfo *AreaInfo;
    struct  GelsInfo *GelsInfo;
    UBYTE   Mask;       /* write mask for this raster */
    BYTE    FgPen;       /* foreground pen for this raster */
    BYTE    BgPen;       /* background pen  */
    BYTE    AOlPen;       /* areafill outline pen */
    BYTE    DrawMode;       /* drawing mode for fill, lines, and text */
    BYTE    AreaPtSz;       /* 2^n words for areafill pattern */
    BYTE    linpatcnt;       /* current line drawing pattern preshift */
    BYTE    dummy;
    UWORD  Flags;      /* miscellaneous control bits */
    UWORD  LinePtrn;      /* 16 bits for textured lines */
    WORD   cp_x, cp_y;      /* current pen position */
    UBYTE   minterms[8];
    WORD   PenWidth;
    WORD   PenHeight;
    struct  TextFont *Font;   /* current font address */
    UBYTE   AlgoStyle;       /* the algorithmically generated style */
    UBYTE   TxFlags;       /* text specific flags */
    UWORD   TxHeight;       /* text height */
    UWORD   TxWidth;       /* text nominal width */
    UWORD   TxBaseline;       /* text baseline */
    WORD    TxSpacing;       /* text spacing (per character) */
    APTR    *RP_User;
    ULONG   longreserved[2];
#ifndef GFX_RASTPORT_1_2
    UWORD   wordreserved[7];  /* used to be a node */
    UBYTE   reserved[8];      /* for future use */
#endif
};


Bei 24 Bit Bitmap-Grafiken (z.B. ein 24 Bit BMP-File) gibt's keine Colortable (Siehe BMP-Loader auf meiner Homepage).

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 21:28 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:
Strukturen gibt's überall im AmigaOS. :D

Ich weiß jetzt nicht, wie Du das meinst...

Meinst Du diese Sturktur aus graphics/gfx.h?

code:
struct BitMap
{
    UWORD   BytesPerRow;
    UWORD   Rows;
    UBYTE   Flags;
    UBYTE   Depth;
    UWORD   pad;
    PLANEPTR Planes[8];
};


oder meinst Du die Struktur des RastPort aus graphics/rastport.h ?

code:
struct RastPort
{
    struct  Layer *Layer;
    struct  BitMap   *BitMap;
    UWORD  *AreaPtrn;      /* ptr to areafill pattern */
    struct  TmpRas *TmpRas;
    struct  AreaInfo *AreaInfo;
    struct  GelsInfo *GelsInfo;
    UBYTE   Mask;       /* write mask for this raster */
    BYTE    FgPen;       /* foreground pen for this raster */
    BYTE    BgPen;       /* background pen  */
    BYTE    AOlPen;       /* areafill outline pen */
    BYTE    DrawMode;       /* drawing mode for fill, lines, and text */
    BYTE    AreaPtSz;       /* 2^n words for areafill pattern */
    BYTE    linpatcnt;       /* current line drawing pattern preshift */
    BYTE    dummy;
    UWORD  Flags;      /* miscellaneous control bits */
    UWORD  LinePtrn;      /* 16 bits for textured lines */
    WORD   cp_x, cp_y;      /* current pen position */
    UBYTE   minterms[8];
    WORD   PenWidth;
    WORD   PenHeight;
    struct  TextFont *Font;   /* current font address */
    UBYTE   AlgoStyle;       /* the algorithmically generated style */
    UBYTE   TxFlags;       /* text specific flags */
    UWORD   TxHeight;       /* text height */
    UWORD   TxWidth;       /* text nominal width */
    UWORD   TxBaseline;       /* text baseline */
    WORD    TxSpacing;       /* text spacing (per character) */
    APTR    *RP_User;
    ULONG   longreserved[2];
#ifndef GFX_RASTPORT_1_2
    UWORD   wordreserved[7];  /* used to be a node */
    UBYTE   reserved[8];      /* for future use */
#endif
};


Bei 24 Bit Bitmap-Grafiken (z.B. ein 24 Bit BMP-File) gibt's keine Colortable (Siehe BMP-Loader auf meiner Homepage).

--

http://www.norman-interactive.com



Ich hab hier alle Tabellen vom AmigaOS bis 1.3 :) Nur ich hab hier nix über Grafikkarten oder neue Tabellen über 1.3 :)

PS: Ich hab hier auch (unter anderem) das Buch Amiga Intern. :)

Und jetzt muß ich mal was testen: :bounce:
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 11.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 22:03 Uhr

Mad_Dog
Posts: 1944
Nutzer
Ich glaube, Du solltest Dir unbedingt die AmigaOS Developer CD zulegen. Dort ist alles beschrieben.

Und wie thomas schon geschrieben hat: Auch auf CGX-Screens hast Du nur 256 Pens - falls Du irgendwas mit Pens vorhast.

Ansonsten kannst Du wie gesagt die Grafikprimitiven etc. auf CGX-Screens genauso wie auf "normalen" Intuition-Screens benutzen.

Nur irgendwelche Copper-Rainbows oder sowas geht nicht, da man dazu die Amiga Custom-Chips braucht.

--

http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 11.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 22:58 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Mad_Dog:
Ich glaube, Du solltest Dir unbedingt die AmigaOS Developer CD zulegen. Dort ist alles beschrieben.


Wie ich schon mehrfach geschrieben habe kann ich leider kaum Englisch, sorry.

Die CD hab ich hier sogar mehrfach (EBay), wie viele andere CDs.

Deswegen muß ich hier Euch ja um Hilfe bitte. :D

Und ich muß tippen das ihr mir wirklich recht gut helft. Hier findet man wenigstens noch die echte, alte Amigagemeinschaft.
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

11.03.2004, 23:46 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:
Zitat:
Original von Mad_Dog:
Ich glaube, Du solltest Dir unbedingt die AmigaOS Developer CD zulegen. Dort ist alles beschrieben.


Wie ich schon mehrfach geschrieben habe kann ich leider kaum Englisch, sorry.

Die CD hab ich hier sogar mehrfach (EBay), wie viele andere CDs.

Deswegen muß ich hier Euch ja um Hilfe bitte. :D


Welche Version der CD hast Du?

Welche Fremdsprache hattest Du in der Schule? Nunja... für mich ist Englisch fast schon selbstverständlich, da ich in der Schule Englisch Leistungskurs hatte. :) ich achte mittlerweile nicht mehr beim Kauf von Fachliteratur darauf, ob es in Deutsch oder Englisch ist.
Englisch wenigstens halbwegs zu verstehen, ist in der Computerwelt schon sehr sinnvoll...

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

12.03.2004, 00:05 Uhr

Ralf27
Posts: 2779
Nutzer
[quote]
Original von Mad_Dog:
Zitat:
Welche Version der CD hast Du?

Welche Fremdsprache hattest Du in der Schule? Nunja... für mich ist Englisch fast schon selbstverständlich, da ich in der Schule Englisch Leistungskurs hatte. :) ich achte mittlerweile nicht mehr beim Kauf von Fachliteratur darauf, ob es in Deutsch oder Englisch ist.
Englisch wenigstens halbwegs zu verstehen, ist in der Computerwelt schon sehr sinnvoll...

--

http://www.norman-interactive.com


Ich weiß nicht welche Versionen das sind. Ich hab inzwischen zwei Schränke voll mit Amigasache (große Schränke). Denn früher war es oft so gewesen das die Leute zu mir gekommen sind mit ihren Sachen und meinte nur das ich das Zeug nehmen könne, oder es kommte zum Sperrmüll... alleine bei diesem Gedanken wurde mir schlecht und ich hab alle Amigasachen entgegengenommen.

Und so kommt einiges zusammen, dann noch EBaykäufe (CDs sind dabei, ob ich sie schon 2, 3 oder 4 mal habe). Inzwischen schau ich schon nicht mehr nach was für CDs es sind.

Achja, wegen den Sprachen:
Damit kannst Du mich jagen! :D
Englisch hatte ich in der Grundschule und selbst in Deutsch war ich nicht gerade gut. Mathe und andere Naturwissenschaftliche Fächer hatte ich als "Leistungsfach". In EDV war ich der Lehrer und der Lehrer der Schüler, da konnte mir kein Lehrer was vor machen. Das ist jetzt bald 15 Jahre her. (Damals war halt 286er top. :) )

Englisch kann ich somit nur ein wenig. Wenn ich einen englischen Text habe dann versteh ich ihn "in etwar", aber das wars auch schon. Mir ist halt meine Muttersprache lieber. :)

Und jetzt rate mal wieso ich noch an MaxonBasic hänge und mir mit C so schwer tu? Inzwischen kann ich zwar auch schon etwas C lesen und auch etwas C tippen, aber nunja... Ich denk mir mal das ich mit ASM besser zurecht komme als mit C, aber ich übe. :)



Achja, C:
Ich muß eigenstehn das ich heute wieder in MaxonBasic geschrieben habe und heute wieder schöne Erfolge erzielt habe. Hab noch nie richig für Grafikkarte programmiert und jetzt brummt MaxonBasic ganz schön auf der Grafikkarte mit denn Befehlen der CGX-Lib. :)
Leider brummt MB nicht mit OpenGL (FP-Register, wahrscheinlich mag er die nicht) und mit dem anderen OpenGL-Clone(Name gerade entfallen) komme ich noch nicht ganz klar. Aber da mach ich auch noch durch, wenn ich Zeit finde. Leider ist das bei mir etwas knapp geworden.

Ich fühle mich irgendwie gerade bei MaxonBasic irgendwie "besonderst". Das scheinen wohl auf diesen Planeten wohl nur noch ca. 10 Leute zu benutzen. Jedenfalls habe ich hier im Forum nur noch einen gefunden der das noch benutzt. :)



PS: Ich stelle gerade auf meiner Homepage Stück für Stück meine alten Programme online.

Wolken (hab ich heute Grafikartentauglich gemacht) kommt wohl auch bald. Und es werden immer mehr. (z.b. Geländerplaner, der auch in DXF speichert. Zur Zeit in 2D, 3D wird gerade erstellt)


PPS: Ein Festplattencrash kann einem ganz schön demotivieren. Bei mir hat das sogar recht lange angehalten. Das sehe ich auch gerade an denn Programmen von mir (z.b. 1991 oder älter...)


Gott, bin ich hier gerade am Texten, liegt wohl am guten Bier.. :nuke: :smokin:
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

12.03.2004, 09:20 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Original von Ralf27:
Was mich jetzt noch interesiert(fällt mir eben so ein):
Bei OCS bis AGA gab es die Bitmaps mit Strukturen, etc. Wie sieht es denn bei Grafikkarten aus? (Ich will jetzt da nicht will Basic-Artig rumpoken :lach: ). Ich geh mal davon aus das es die gibt. Rein interesenhalber. :rotate:



Die Strukturen sind noch da, aber du solltest da die Finger von lassen. Bei Grafikkarten werden die Felder anders benutzt. Besonders die Bitplanes sehen ganz anders aus (Chunky). Die CGX-Doku sagt eindeutig, daß man Bitmaps nur mit AllocBitMap/FreeBitMap und GetBitMapAttr anfassen darf.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

12.03.2004, 15:30 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

Ich weiß nicht welche Versionen das sind. Ich hab inzwischen zwei Schränke voll mit Amigasache (große Schränke). Denn früher war es oft so gewesen das die Leute zu mir gekommen sind mit ihren Sachen und meinte nur das ich das Zeug nehmen könne, oder es kommte zum Sperrmüll... alleine bei diesem Gedanken wurde mir schlecht und ich hab alle Amigasachen entgegengenommen.

Und so kommt einiges zusammen, dann noch EBaykäufe (CDs sind dabei, ob ich sie schon 2, 3 oder 4 mal habe). Inzwischen schau ich schon nicht mehr nach was für CDs es sind.


Auch die besten CDs nützen Dir nichts, wenn sie bei Dir im Schrank vergammeln. Vielleicht solltest Du mal einen Blick auf die Developer CD riskieren. ;)

Zitat:
Und jetzt rate mal wieso ich noch an MaxonBasic hänge und mir mit C so schwer tu? Inzwischen kann ich zwar auch schon etwas C lesen und auch etwas C tippen, aber nunja... Ich denk mir mal das ich mit ASM besser zurecht komme als mit C, aber ich übe. :)

Machst Du den C-Kurs mit? Und wenn ja: Wie gut kommst Du mit?
Übrigens gibt's den Kernighan/Ritchie auch auf Deutsch. :D

Zum Thema "Programmiersprachen und Englisch" werd ich Dir mal was verraten: Ich habe mir damals, so im Alter von 15 Jahren auch selbst AMOS Pro beigebracht. Und das Handbuch (ein sehr dicker Schinken) war in Englisch.
--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 00:22 Uhr

Holger
Posts: 8116
Nutzer
@Ralf27:
Als Java-Programmierer kann ich durchaus verstehen, warum Du Basic angenehmer findest. Man kommt doch im Durchschnitt wesentlich schneller zu einem Ergebnis. Das liegt aber nicht nur an der Programmiersprache C, sondern auch an der AmigaOS API, die für viele einfache Dinge einen viel zu großen Aufwand erfordert.

Zum Thema:
WritePixel + ReadPixel sollte man niemals in einem produktiven Code benutzen. Schon auf dem AmigaOS ist der Performanceverlust durch die Verwendung dieser Funktionen unglaublich, auf anderen Systemen wird es noch viel schlimmer.
Zum Übertragen von Pixeldaten sollte man immer Read/WritePixelArray oder wenigstens -Line benutzen.

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

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 06:17 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Holger:
@Ralf27:
Als Java-Programmierer kann ich durchaus verstehen, warum Du Basic angenehmer findest. Man kommt doch im Durchschnitt wesentlich schneller zu einem Ergebnis. Das liegt aber nicht nur an der Programmiersprache C, sondern auch an der AmigaOS API, die für viele einfache Dinge einen viel zu großen Aufwand erfordert.


Stimmt auch. Allerdings sieht das Verwenden von AmigaOS API-Funktionen in C wesentlich eleganter aus, wie dieses PEEK und POKE in Basic. ;)

--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 09:53 Uhr

Ralf27
Posts: 2779
Nutzer
[quote]
Original von Mad_Dog:
Zitat:
Stimmt auch. Allerdings sieht das Verwenden von AmigaOS API-Funktionen in C wesentlich eleganter aus, wie dieses PEEK und POKE in Basic. ;)

--

http://www.norman-interactive.com



Ich glaub Du unterliegst da einem Mißverständniss:
Die Aufrufe der Libs mit Basic ist genau so wie bei C auch. Insofern werden keine PEEK und POKE gebraucht. Schau Dir einfach mal Basic-Codes an die Libs benutzen.

Ich hab Dich vor einigen Wochen auch mal gefragt wie man unter C einzelne Speicherstellen bearbeitet, aber leider hab ich bis jetzt noch keine Antwort drauf bekommen. :)
Entweder geht das nicht unter C oder es geht, aber dann wäre es genau so wie bei Basic. :)


Also, gibt es unter C Befehle um einzelne Speicherstellen aufzurufen?


PS: Das Beispielskript von mir damals wegene Datatypse war von mir experimentel umgebaut worden damit ich das versteh. Die jetzige Version hat keine Peeks und Poks mehr. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 10:14 Uhr

tokai
Posts: 1071
Nutzer
Zitat:
Also, gibt es unter C Befehle um einzelne Speicherstellen aufzurufen?

klar, nur sollte man vorsichtig sein was man da wie verändert. :)


BYTE myarr[1024]; /* nur als Beispiel-Speicherbereich */
BYTE *p = myarr; /* pointer to myarr (Speicherbereich) */


for (i=0; i<1024; i++)
{
*p = 128; /* setze Speicherstelle auf die p zeigt auf 128 */
p++; /* zeige auf nächste Speicherstelle */
}

--
http://www.christianrosentreter.com


IRC: #amiganews.de @ARCNET (e.g. de3.arcnet.vapor.com/ port 6667)

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 10:53 Uhr

thomas
Posts: 7717
Nutzer

Zitat:
Also, gibt es unter C Befehle um einzelne Speicherstellen aufzurufen?


#define POKE(adresse,wert) (*((char *)(adresse)) = (wert))
#define PEEK(adresse) (*((char *)(adresse)))

Wie schon gesagt, nur um zu zeigen, daß es geht. Benutzen sollte man es nie, auch nicht in Basic.

Gruß Thomas
--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 12:50 Uhr

whose
Posts: 2156
Nutzer
> BYTE myarr[1024]; /* nur als Beispiel-Speicherbereich */
> BYTE *p = myarr; /* pointer to myarr (Speicherbereich) */


> for (i=0; i<1024; i++)
> {
> *p = 128; /* setze Speicherstelle auf die p zeigt auf 128 */
> p++; /* zeige auf nächste Speicherstelle */
> }

Ermh, das ist nicht Dein Ernst, tokai, oder? :)

Also, nach K&R würde man sowas folgendermaßen schreiben:

BYTE myarr[1024];

for(j = 0; j < 1024; i++)
{
myarr[j] = 128;
}

oder wahlweise statt

myarr[j] = 128;

so

*(myarr + j) = 128;

wenn man schon unbedingt mit Pointer arbeiten will

Bring die Jungs doch nicht gleich mit Arrays und Zeigern darauf zum Verzweifeln ;)

Wenn man eine bestimmte Speicherstelle mit einem Wert belegen will, sollte man als erstes wissen, WO genau diese Speicherstelle liegt. Nehmen wir mal wieder das berühmte Beispiel des toten Fleisches:

gewünschte Speicherstelle: 0xdeadbeef (hexadezimal)

In C benötigt man, wie tokai schon richtig bemerkt hat, einen "Zeiger" auf die entsprechende Speicherstelle. Man vereinbart (wer erinnert sich an Pascal? ;) ) also einen solchen Zeiger

int *zeiger; /* Man beachte das *!!! */

und belegt diesen mit dem ADRESS-Wert der gewünschten Speicherstelle, also

zeiger = 0xdeadbeef;

Jetzt kann man über den Zeiger den INHALT der Speicherstelle verändern, nämlich so:

*zeiger = 128;
(das "*zeiger" nennt sich "Derefenzieren", weil man nicht den Inhalt des Zeigers verändern will, sondern den Inhalt der Speicherstelle, auf die "zeiger" verweist, also referenziert)

Um hier gleich Problemen vorzubeugen:

Man sollte für AOS generell die Verwendung fester Speicherstellen vermeiden! Alles mögliche wird dynamisch alloziert und verändert daher ständig die Position im Speicher, abgesehen von Adresse 4, die die Exec-Base enthält. Und davon sollte man sowieso die Finger lassen ;)


[ Dieser Beitrag wurde von whose am 15.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 13:29 Uhr

tokai
Posts: 1071
Nutzer
Zitat:
Original von whose:
> BYTE myarr[1024]; /* nur als Beispiel-Speicherbereich */
> BYTE *p = myarr; /* pointer to myarr (Speicherbereich) */

> for (i=0; i<1024; i++)
> {
> *p = 128; /* setze Speicherstelle auf die p zeigt auf 128 */
> p++; /* zeige auf nächste Speicherstelle */
> }

Ermh, das ist nicht Dein Ernst, tokai, oder? :)


eigentlich schon :) Weil, es ging mir mehr um die Pointer und weniger um's Array an sich (das war im Beispiel nur als "anzupointender Beispiel-Speicherbereich" gedacht, und muss nicht zwangsläufig ein Array sein :P )

regards,
tokai
--
http://www.christianrosentreter.com


IRC: #amiganews.de @ARCNET (e.g. de3.arcnet.vapor.com/ port 6667)

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 14:53 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Ermh, das ist nicht Dein Ernst, tokai, oder?

Also, nach K&R würde man sowas folgendermaßen schreiben:


Es ging hier darum zu zeigen, wie man Peek und Poke in C realisiert, nicht darum, wie man das schönste C schreibt.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 15:09 Uhr

Ralf27
Posts: 2779
Nutzer
Hui, jetzt gehts hier aber Rund! :)

Ok, also kann man mit C auch "Poken". Wäre auch der Hammer wenn man das nicht könnte. :lach:

Mir ist auch klar das man das wilde rumpoken lassen sollte.
Poke und Peek kommen bir mir eigentlich nur zum Einsatz wenn ich zum Beispiel eine Tabelle für eine Libsaufruf füllen möchte oder aus so einer Tabelle auslesen möchte.
Es kann aber auch vorkommen das ich z.b. die ScreenStruktur Suche und dann steig ich halt über das Window ein und Peekl mich halt dann durch die Win-Struktur zur Screen-Struktur.

Hm, geht das eigentlich auch dann unter z.b. MorphOS?
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 22:20 Uhr

Mad_Dog
Posts: 1944
Nutzer
Zitat:
Original von Ralf27:

Ich hab Dich vor einigen Wochen auch mal gefragt wie man unter C einzelne Speicherstellen bearbeitet, aber leider hab ich bis jetzt noch keine Antwort drauf bekommen. :)
Entweder geht das nicht unter C oder es geht, aber dann wäre es genau so wie bei Basic. :)


Sorry, das habe ich dann wohl übersehen.

Zitat:
Also, gibt es unter C Befehle um einzelne Speicherstellen aufzurufen?

Doch! Was tokai gezeigt hat, ist ein ziemlich geläufiges Beispiel. In meinem C-Kurs bringe ich ja auch sowas ähnliches...

Aber in C muß man nicht bei jedem API-Aufruf solche Verrenkungen machen... :)


--

http://www.norman-interactive.com

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 22:44 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Ralf27:
Poke und Peek kommen bir mir eigentlich nur zum Einsatz wenn ich zum Beispiel eine Tabelle für eine Libsaufruf füllen möchte oder aus so einer Tabelle auslesen möchte.
Es kann aber auch vorkommen das ich z.b. die ScreenStruktur Suche und dann steig ich halt über das Window ein und Peekl mich halt dann durch die Win-Struktur zur Screen-Struktur.

Ich glaube, Du bist Dir nicht darüber im Klaren, daß es eben genau für diese Anwendungsfälle geeignetere Sprachkonstrukte in C gibt.
Genau deshalb kann man auch auf peek+poke ähnliche Konstrukte ganz verzichten.
Ich bin schon seit etlichen Jahren komplett ohne ausgekommen, kein Wunder, meine bevorzugte Programmiersprache hat ja tatsächlich kein peek+poke.:lach:

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

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 22:54 Uhr

Holger
Posts: 8116
Nutzer
Zum Thema, warum man das Schreiben und Lesen einzelner Pixel vermeiden sollte, hier ein älteres Posting von mit, daß auf diese Problematik tiefer eingeht.

http://www.amiga-news.de/forum/thread.php3?id=9537&start=35&BoardID=7


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

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 23:00 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Ich glaube, Du bist Dir nicht darüber im Klaren, daß es eben genau für diese Anwendungsfälle geeignetere Sprachkonstrukte in C gibt.
Genau deshalb kann man auch auf peek+poke ähnliche Konstrukte ganz verzichten.
Ich bin schon seit etlichen Jahren komplett ohne ausgekommen, kein Wunder, meine bevorzugte Programmiersprache hat ja tatsächlich kein peek+poke.

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



Es gibt einen berühmten Spruch: Viele Wege führen nach Rom.

Ich hab mir eben einige Quellcodes von MaxonBasic aus dem Internet angesehn und ich war auch erstaunt wie man sonst noch so an die Daten kommt.
Ich bin halt z.b. das Hangeln durch die Strukturen aus mit AmigaBasic gewöhnt. Aber das es auch anderst geht, also ganz ohne diese Peek und Poke, sehe ich an diesen Quellcodes.

Es hat also mehr was mit dem Progger zu tun als mit der Sprache.

PS: Mir ist klar das MaxonBasic eine tote Sprache ist die vielleicht noch 10 Leute auf diesem Planeten benutzen (wenn es hoch kommt).
Aber ganz so mies ist sie nun auch wieder nicht. :)

Ich bin diese gewohnt und ich komme noch zu meinem Ziel. :-)

Aber um C kommt man nicht rum, aber das ist ja schon seit Jahren bekannt.
--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 15.03.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 23:08 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von Holger:
Zum Thema, warum man das Schreiben und Lesen einzelner Pixel vermeiden sollte, hier ein älteres Posting von mit, daß auf diese Problematik tiefer eingeht.

http://www.amiga-news.de/forum/thread.php3?id=9537&start=35&BoardID=7



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


Ja, dieses Posting. Aber dazu wolle ich eigentlich auch noch was schreiben:

Du hast geschrieben das moderne Architekturen Probleme haben mit einzelnen Punkte setzen oder lesen. Probleme in der Hinsicht das es nicht gerade effektiv ist. Und in der Hinsicht muß ich Dir recht geben.

Mein Beispielprogramm lief mit genau diesem setzen von einzelnen Punkten auf einem 2,4GHz-Pentium unter VBasic.
Ich war da sosehr erstaunt das es so langsam lief, langsamer als auf einem Amiga unter AGA mit MaxonBasic.

Es hieß dann das AGA logischerweiße schneller ist, weil es eine andere Architektur hat (Treiber, etc.)

Aber mit einem Amiga und CGX läuft es nochmal viel schneller... :)

Auf den Punkt gebracht:
VBasic ist wohl wirklich der Hammer in Sachen langsam. (Ok, ich hab es nur mit Punktesetzen getestet). Ich dachte wirklich es wäre schneller, vorallem auf einem 2,4GHz-Rechner.
Ich hab jetzt keinen verleich wie es ist wenn man einen ganzen Array setzt. Wäre doch mal interesant zu testen, oder? :)

Also das gleiche Programm unter AGA, CGX (MaxonBasic) und Win (VBasic).

Wie würden dann die Wetten stehn? :)



--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 23:12 Uhr

Ralf27
Posts: 2779
Nutzer
Achja, wegen ganzen Arrays setzen:

Ich werd mir mal ein kleines ASM-Prog schreiben das aus einer Integer-Feld von MaxonBasic jedes zweite Byte übergeht. Somit kann ich es dann mit den bekannten Array-Befehlen aus graphics oder cybergraphics gleich direkt einen ganzen Array voll machen. Bin auch mal gespannt wie sich die Geschwindigkeit erhöht.
Werd ich irgendwann noch mal machen. Erste Tests liefen schon :)


--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

15.03.2004, 23:46 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von thomas:
Zitat:
Ermh, das ist nicht Dein Ernst, tokai, oder?

Also, nach K&R würde man sowas folgendermaßen schreiben:


Es ging hier darum zu zeigen, wie man Peek und Poke in C realisiert, nicht darum, wie man das schönste C schreibt.

Gruß Thomas


Eijo, das war mir klar. Aber warum schreibt er das dann nicht gleich und bringt statt dessen ein Beispiel mit Array und nem Zeiger darauf? Ich glaub weniger, daß ein Basic-Programmierer auf Anhieb versteht, was damit gemeint ist.

Gewöhnt Euch doch einfach mal an, die Sache kurz, knapp und einfach zu erklären, statt mit lustigen Tricks zu prahlen ;)

Grüße


[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Optimale Grafikprogrammierung für AGA&CGX [ - Suche - Neue Beiträge - Registrieren - Login - ]


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