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

amiga-news.de Forum > Programmierung > Program von win auf amiga [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

30.06.2002, 16:02 Uhr

Moritz
Posts: 65
Nutzer
hi

ich habe im zuge meines studiums ein c-program mit dem lcc compiler unter windoes schreiben müssen mit grafischer oberfläche!
jetzt will ich in den semesterferien es auf meinen amiga umschreiben.
geht das? wenn ja was brauche ich, mir macht vorallem die windows.h sorgen weil die gibt es nicht unter dem amiga , oder? und wie zeichne ich das fenster unter dem amiga mit pulldownmenue. ich habe auch messageboxes geschrieben. aber mein hauptziel ist, dass das programm dargestellt wird. es werden halt einige graphische befehle verwendet.

also vielleicht könnt ihr mir ja helfen.
ach ja gibt einen free compiler für solche angelegenheiten!

Moritz

[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 16:57 Uhr

Michael_Mann
Posts: 1012
Nutzer
Zitat:
Original von Moritz:
hi

ich habe im zuge meines studiums ein c-program mit dem lcc compiler unter windoes schreiben müssen mit grafischer oberfläche!

ach ja gibt einen free compiler für solche angelegenheiten!

Moritz



Mein Beileid :D
Wie wäre es aber mal endlich mit einem gescheiten zentralen Requester für WIN (nebst einem ordentlichen OS dazu)... ;)

Für Amiga gibt es z.B. den vbcc-Compiler (aminet), für eine GUI z.B. Emperor v4.3 (wurde kürzlich auch in den AmigaNews genannt) oder den MUIBuilder (so sollte det Dingens heißen), zu finden im Aminet.
Irgendwann gab es auch mal einen GUI-Generator für GadTools (wie das Programm allerdings hieß d?).
Damit solltest Du gerüstet sein, wenn Du noch die kommentierten Original-Includes für Amiga besitzt.


Michael

[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 17:49 Uhr

thomas
Posts: 7678
Nutzer

Die Programmierschnittstellen von Windows und AmigaOS sind sehr sehr unterschiedlich (Windows ist der Horror). Da würde ich nicht gleich mit einer Portierung anfangen, sondern mich erstmal mit dem AmigaOS beschäftigen. Ohne die Amiga Developer CD (oder vergleichbare Unterlagen) solltest du jedenfalls gar nicht erst anfangen.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 19:20 Uhr

Michael_Mann
Posts: 1012
Nutzer
Zitat:
Original von thomas:

Die Programmierschnittstellen von Windows und AmigaOS sind sehr sehr unterschiedlich (Windows ist der Horror).



Ich will mal versuchen YAM auf WIN zu portieren - ich brauch halt mal was gescheites. Also hab' ich mir Visual C++ in Version 6 besorgt.
Der Programm-Editor ist bereits der Ober-Horror...

Michael




[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 20:14 Uhr

Moritz
Posts: 65
Nutzer
so sieht es aus, der lcc ist auch nicht besser, ich musste den halt nehmen wegen meines profs, aber ich hatte null keinen schwimmer von C und dann auch gleich eine grahische lösung des problems! ich wollte halt nur mal wissen was mein amiga drauss macht, weil das ganze erst ab einen PIII 500 flüssig läuft so wie ich programmieren musste, vielleicht kann mir ja einer sagen wie ich ein fenster mache unter Amiga OS weil das machte der lcc fast von alleine, ich musste das nur anpassen!
Moritz

[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 20:31 Uhr

thomas
Posts: 7678
Nutzer

Hol dir von http://www.amiga.com/3.9/download/NDK3.9.lha das 3.9 NDK. Da sind die Autodocs drin, das ist das mindeste, was man als Referenz braucht.

Fenster öffnen mit OpenWindows (intuition.library), oder ab 2.1 besser mit OpenWindowTags. Das gibt eine struct Window zurück. in Window->RPort ist ein struct RastPort, mit dem man alle Graphics-Funktionen aufrufen kann. Zum Zeichnen Move(rastport,x,y) und Draw(rastport,x,y) (Turtle-Grafik eben). Farben setzen mit SetAPen, SetBPen und SetDrMd (gilt für den nächsten Draw).

In Window->UserPort ist ein MsgPort. In einer Schleife WaitPort(MsgPort), dann GetMsg(MsgPort). GetMsg gibt (in diesem Fall) eine struct IntuiMessage zurück, diese spiegelt Eingaben wieder. Es kommen alle Messages, die man bei OpenWindow in den IDCMP-Flags angegeben hat. Bei IDCMP_CLOSEWINDOW sollte man die Schleife dann verlassen. Für jede Message muß, nachdem sie bearbeitet wurde, ReplyMsg(Message) aufgerufen werden !!!

Nicht vergessen, alle Resourcen wieder freizugeben, also CloseWindow etc. Und nicht mit exit() zurückspringen, bevor alles wieder freigegeben ist !! Und Pointer immer auf NULL prüfen, es kann schon öfters vorkommen, daß man etwas nicht bekommt.

Als Compiler nimmst du am besten einen, der die Libraries automatisch öffnet (z.B. Dice C), sonnst mußt du, bevor du eine Funktion benutzt, die entsprechende Library mit OpenLibrary öffnen und am Programmende mit CloseLibrary wieder schließen.

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 20:54 Uhr

Michael_Mann
Posts: 1012
Nutzer
Nicht vergessen - den Message-Port ebenfalls zum Schluß mit NULL aktualisieren (damit werden dann Resourcen freigegeben (Speicher pp)) und alles mögliche noch aus dem Multitasking-System entfernt.
Übrigens: Unter Amiga höre ich aber den Begriff einer "Abfrage-schleife" mal garnicht so gerne. Erinnert zu sehr an WIN...

Öh Moritz:
Hoffentlich hat Dein Prof nicht einen Berater-Vertrag mit M$. Dem seine Hausaufgabe klingt so verdächtig danach... :D


Michael


[ Dieser Beitrag wurde von Michael_Mann am 30.06.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

30.06.2002, 22:09 Uhr

Moritz
Posts: 65
Nutzer
nein mein prof hat keinen beratervertrag mit ms, er meinte nur einmal wir sollten nicht verstehen lernen warum der computer so ist, sonderen seine fehler hin nehmen und weiter machen.
ich meine die unlogischen sachen unter windows will ich auch nicht lernen, weil sonst bin ich bis zur rente noch bicht fertig. aber in der windowsprogrammierung ist mir mein amiga wieder ans herz gewachsen. so ein krampf das betriebsystem. ich bin normaler weise einer der logisch denkt, aber das half mir da nicht weiter. ich musste eine andere denkweise an tag legen. deshalb will das programm auf meinen amiga mal umsetzten um zu schauen was er daraus macht.

danke für die ganzen tipps. dann werde ich micht mal in den kommenden semesterferien damit beschäftigen.
ich werde euch weiter auf dem laufenden halten wie es aussieht und falls es funktionieren sollte das prgramm ins aminet stellen.

Moritz

[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 10:35 Uhr

thomas
Posts: 7678
Nutzer
Zitat:
den Message-Port ebenfalls zum Schluß mit NULL aktualisieren

Hast du 'nen Knall ? Der Message-Port gehört zum Window, den darf man nicht anfassen !


Zitat:
er meinte nur einmal wir sollten nicht verstehen lernen warum der computer so ist, sonderen seine fehler hin nehmen

Der hat wirklich einen Knall. Computer sind die logischsten Geräte überhaupt. Das einzige, was unlogische Fehler hat, ist Windows. Und 80% aller Fehlerquellen sitzt immer noch vor der Tastatur !

Ich kann dir versprechen, beim AmigaOS habe ich noch keine unlogischen Dinge gefunden. Dinge, die man nicht versteht, kann man entweder der Magie zuordnen oder in der Broschüre nachlesen. Die RKRMs sind da sehr aufschlußreich. (Rom Kernel Reference Manuals, sind auf der Developer CD mit drauf).

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 11:04 Uhr

Azrael
Posts: 41
Nutzer
So schlimm ist Windows nicht. Die MFC enthält ein paar gar lustige Dinge, aber sonst? Und gerade sowas wie den Editor oder den genialen Debugger von VC6 bräuchte man ganz dringend auf dem Amiga.

Aber zu Deinem Problem:
Programme, die primär auf einer GUI arbeiten, kannst Du beim Portieren nur praktisch neuschreiben, da Win32 und Amiga doch gewaltige Unterschiede aufweisen. Neuschreiben ist einfach schneller.

Bye, Azrael.
--
Dreamworlds Development - http://www.dreamworlds.de

[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 11:36 Uhr

Michael_Mann
Posts: 1012
Nutzer
Zitat:
Original von thomas:
Zitat:
den Message-Port ebenfalls zum Schluß mit NULL aktualisieren

Hast du 'nen Knall ? Der Message-Port gehört zum Window, den darf man nicht anfassen !


Gruß Thomas

--
Email: thomas-rapp@web.de



Home: home.t-online.de/home/thomas-rapp/



Hi,
Bumm - 'nen Knall, weiß nicht, glaube ich aber eher nicht. I-)

Wie Du schon richtig sagtest, der MessagePort gehört zum Fenster. Ich meinte das Fenster das von Moritz' Programm geöffnet wird und nach Programmende hoffentlich wieder, vor dem Screenende, auch geschlossen wird.
Zum ordentlichen Aufräumen eines Programms das mit eigenen Screens/Fenstern (Windows, pffh) arbeitet gehört abschließend immer ein ModifyIDCMP(*Window,0); diese NULL besorgt dann den Rest und wird aber allzugerne vergessen.
Übrigens: DICE 3.16 kann leider keinen Code höher als 68020 generieren (Fundstelle: Begleittext zum Compiler im Aminet).


Michael

P.s.: Übrigens ich war bisher immer der Meinung das ein Computer nur das macht was ein Programmierer der armen Kiste halt so eingibt... :rolleyes:

[ Dieser Beitrag wurde von Michael_Mann am 01.07.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 12:22 Uhr

Woody
Posts: 115
Nutzer
>Zum ordentlichen Aufräumen eines Programms das mit eigenen Screens/Fenstern (Windows, pffh) arbeitet gehört abschließend immer ein ModifyIDCMP(*Window,0); diese NULL besorgt dann den Rest und wird aber allzugerne vergessen.
Wahrscheinlich, weil es absolut unnötig ist ;)
CloseWindow gibt beim Schliessen auch die gesamten Resourcen die zum Message-Port gehören frei.Das was du sagst, würde nur Sinn machen, wenn das Fenster offen bleibt,aber man keinen Input mehr vom Fenster benötigt.

[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 13:50 Uhr

Michael_Mann
Posts: 1012
Nutzer
Zitat:
Original von Woody:
Wahrscheinlich, weil es absolut unnötig ist ;)
CloseWindow gibt beim Schliessen auch die gesamten Resourcen die zum Message-Port gehören frei.Das was du sagst, würde nur Sinn machen, wenn das Fenster offen bleibt,aber man keinen Input mehr vom Fenster benötigt.



Nein.
CloseWindow(Fenster x) nullt zwar vieles gibt aber nicht den Speicher frei der für die Kommunikation benötigt wird. Das kann nur über den obigen Modifizierungsbefehl geschehen der auch mit FreeMem arbeitet.
Daher ist ein ModifyIDCMP für das zu schließende Fenster nötig.

Der Grund für die Extra-Behandlung könnte vielleicht darin liegen das mehrere Fenster mit nur *einem (gemeinsamen)* Messageport angelegt werden können. Wäre dem so wie Du sagst dann könnten die anderen offenen Fenster nicht mehr bedient werden und Du wärest dann vermutlich auch bedient.


Michael

[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 15:10 Uhr

thomas
Posts: 7678
Nutzer

Intuition gibt alle Resourcen frei, die es angelegt hat. Du kannst OpenWindow() machen und danach CloseWindow(), ohne daß irgendwas übrigbleibt und ohne jemals eine Message abgeholt zu haben.

Vieleicht solltest du die Autodocs nochmal lesen, bevor mitdiskutierst. Da ist dein Vorgehen nämlich auch dokumentiert. Aber *nur* dann, wenn es mehrere Fenster mit demselben MsgPort gibt. Das dürfte für normale Kleinstprogramme äußerst selten vorkommen. (Man muß erstmal herauskriegen, wie das geht).

Gruß Thomas

--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

01.07.2002, 15:14 Uhr

Woody
Posts: 115
Nutzer
OpenWindow initialisiert den UserPort wenn die IDCMP-Flags beim öffnen ungleich 0 sind und mit CloseWindow wird dieser Port zusammen mit den zughörigen Resourcen auch wieder freigegeben.
ModifyIDCMP macht genau das selbe,nur ebend bei geöffnetem Fenster.Es initialisiert also den UserPort, falls noch nicht vorhanden und löscht diesen ebend, wenn man ModifyIDCMP mit NULL für die Flags aufruft.

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 09:37 Uhr

mrbbc
Posts: 101
Nutzer
Genau DAS ist der Sinn und Zweck von UniverC

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


Natürlich müsstest du dich beim Programmieren trotzdem auf UniverC einschiessen; die lachhaften M$-APIs kann man ja wirklich niemanden zu muten.

Du kennst ja die Konsolenapplikationen "Hallo Welt" etc. printf(), fopen() und Co. funktionieren auf jeder Plattform ohne Anpassungen. AUCH *ALLES* von C: <<= macht das gleiche auf 68k, PPC und x86.

Das Ziel von UniverC ist, dass das auch mit Grafikbefehlen usw. klappt; Multimedia bis GUI - alles.

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 10:59 Uhr

Azrael
Posts: 41
Nutzer
Was ist an den Win-APIs so lachhaft? Ich würde gern mal auf dem Amiga wie auf Win32 mit wenigen Zeilen Code ein FAX verschicken, EMails empfangen, die 3D-Grafikkarte schubsen und was weiß ich noch alles. Sicherlich hat die ganz unterste WinAPI oder auch die MFC ein paar Macken, aber sonst gibt es soooo unheimlich vieles und ausgereiftes, daß man wirklich zu jedem Thema praktisch fertige Sourcen findet.

Aber ich weiß, das war OT. :)

Bye, Azrael.

--
Dreamworlds Development - http://www.dreamworlds.de

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 14:45 Uhr

mrbbc
Posts: 101
Nutzer
Zitat:
Original von Azrael:
Was ist an den Win-APIs so lachhaft?


Sicher nicht WAS man damit kann - aber WIE ! Ich glaube da müssen tausend tibetanische Knotenteppichknüpfer einen Knoten zusammengedacht haben, um diese APIs ins Leben zu rufen...

- Gehört wohl zur Strategie von M$; wer sich mit solchen APIs rumärgert hat keine Zeit mehr für andere APIs, ausserdem verlernt er, systematische APIs zu benutzen.

Nach drei Jahren bin ich mal auf was Systematisches in der MFC gestossen: man kann über das Fensterobjekt vom Desktop die Bildschirmauflösung über dessen Fenstergröße ermitteln...

Das Problem mit M$ ist eigentlich, dass alles ein Flickwerk ist; da wird nicht lange geplant sondern erst mal drauflos gehackt; dann heissts plötzlich myobject.ReadString(), myobject.PutText() usw.

Auch ein Grund für UniverC. Das Ziel ist u.a. auch, das Programmieren in C erheblich zu vereinfachen, indem die API überall ein ähnliches Schema verwendet.

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 16:23 Uhr

Azrael
Posts: 41
Nutzer
Gut, da gebe ich Dir Recht. Soo schlimm ist es zwar wirklich nicht, aber Einheitlichkeit mangelt. Und die MFC ist nicht schnell zusammengeflickt worden, sondern nahezu unverändert seit Win3.1. :)

Aber dieses Einheitlichkeitsproblem besteht auch noch auf modernen Plattformen, wie z.B. JAVA: In jeder Klasse anders. Read, Set, Write, Put, Get. Man darf immer raten.

Was soll's, alles OT.

Bye, Azrael.
--
Dreamworlds Development - http://www.dreamworlds.de

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 21:03 Uhr

AchimStegemann
Posts: 112
Nutzer
Hi alle zusammen!

Um mal die Meinungsverschiedenheit zu klären, was das ordentliche Schließen eines Fensters betrifft, hier die Lösung, wie ich sie kenne.

Richtig ist, dass CloseWindow() NICHT die Kommunikationskanäle aufräumt. Um alle Nachrichten, die noch ausstehen, vom MessagePort des Fensters zu löschen sollte man wie folgt vorgehen.

.....
BOOL ende=0;
Window *w;
IntuiMessage *im;
.....
while(!ende)
{
im=WaitPort(w->UserPort);
if(im->Class==IDCMP_CLOSEWINDOW)
{
ende=1;
break;
}
.......
ReplyMsg(im);
}
// hier ist Schluss und es muss aufgeräumt werden
ModifyIDCMP(w,0);
// Verhindert, dass das Fenster noch Nachrichten empfangen kann, während aufgeräumt wird

while(im=GetMsg(w->UserPort)) ReplyMsg(im);
// Solange noch irgendwelche Nachrichten auf dem Port liegen, sollen diese gelöscht werden
CloseWindow(w);
......

exit(0);



GetMsg holt die oberste Nachricht vom Stack, löscht diese aber nicht.
Die Nachrichten werden erst mit ReplyMsg vom OS gelöscht. ReplyMsg dient dazu, dem Sender mitzuteilen, dass die Nachricht angekommen ist und bearbeitet wurde. Der Sender weiß dann, dass er diese Nachricht dann löschen kann. ReplyMsg löscht nicht automatisch die Nachricht aus dem Speicher, sondern dass muss der Sender selbst tun.
ReplyMsg sendet nur mittels PutMsg eine Nachricht an den ReplyPort des betreffenden Ports (port->mp_ReplyPort).

Gruß
Achim

[ - Antworten - Zitieren - Direktlink - ]

02.07.2002, 21:58 Uhr

Michael_Mann
Posts: 1012
Nutzer
Hi Achim,

so kenne ich diese Lösung auch. Wenn es auch von den Autoren z.T. leicht abweichende Begründungen gab.
Hennig hat in seinen AmigaBasic-Büchern für Profis diesen Grund genannt und das ModifyIDCMP immer als korrekte Beendigung empfohlen. Andere Autoren nannten ergänzend noch ein MsgBit(???) im NachrichtenPort als Grund für diese Beendigungsart.
Auch in den AutoDocs scheint C= diese Lösung zu bevorzugen, wenn mich meine bescheidenen Englisch-Kenntnisse nicht täuschen.

Und Meinungsverschiedenheiten - nun eine Diskussion ist doch nie verkehrt, oder?


Michael



[ Dieser Beitrag wurde von Michael_Mann am 02.07.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

03.07.2002, 22:20 Uhr

Moritz
Posts: 65
Nutzer
HI

ich finde das schon der hammer wie ihr über meine kleine anfrage diskutiert, inzwischen verstehe ich nicht mehr viel davon.
aber weiter so und nicht bremsen lassen, sobald ich die aktion gestartet habe und der versuch scheitert werde ich wieder mit meinen fragen kommen.
das einzige was ich bis her nicht geschafft habe ist den vbcc compiler zum rennen zu bewegen und die gui(emperor) macht auch nicht was ich will.

Moritz

[ - Antworten - Zitieren - Direktlink - ]

22.08.2002, 12:35 Uhr

Mad_Dog
Posts: 1944
Nutzer
Hallo Moritz

Ein kleiner Tip: Schau Dir mal OpenGL an..
OpenGL Programme lassen sich meist ohne Änderung des Source-Codes
portieren, wenn man nicht die OS-spezifische API verwendet.
Wir haben an der Uni auch einige OpenGL Sachen in C gemacht,
die ich dann ohne eine Zeile Code zu ändern direkt auf meinem
Amiga compilieren konnte.

...aber Du suchst wahrscheinlich eher sowas in Richtung
GUI-Programmierung.

[ - Antworten - Zitieren - Direktlink - ]

27.08.2002, 12:50 Uhr

[Cyborg]
Posts:
[Ex-Mitglied]
Zitat:
Original von Moritz:
nein mein prof hat keinen beratervertrag mit ms, er meinte nur einmal wir sollten nicht verstehen lernen warum der computer so ist, sonderen seine fehler hin nehmen und weiter machen.


Son Quatsch, die typische M$ Einstellung , egal, Fehler werden nicht gefixt, sondern geworkaround!

Zitat:
ich meine die unlogischen sachen unter windows will ich auch nicht lernen, weil sonst bin ich bis zur rente noch bicht fertig. aber in der windowsprogrammierung ist mir mein amiga wieder ans herz gewachsen. so ein krampf das betriebsystem. ich bin normaler weise einer der logisch denkt, aber das half mir da nicht weiter. ich musste eine andere denkweise an tag legen. deshalb will das programm auf meinen amiga mal umsetzten um zu schauen was er daraus macht.
Moritz


Seit wann gehorchen Windowsprogramme der Logik ? *G* :rotate:

[ - Ändern - Antworten - Zitieren - Direktlink - ]

27.08.2002, 12:57 Uhr

[Cyborg]
Posts:
[Ex-Mitglied]
[quote]
Original von Azrael:
So schlimm ist Windows nicht. Die MFC enthält ein paar gar lustige
[quote]
Wird vorsätzliche Falschaussage eigentlich auch außerhalb des Gerichts verfolgt? :)
Zitat:
Aber zu Deinem Problem:
Programme, die primär auf einer GUI arbeiten, kannst Du beim Portieren nur praktisch neuschreiben, da Win32 und Amiga doch gewaltige Unterschiede aufweisen. Neuschreiben ist einfach schneller.


Was dann in der Endform eines Programmes dazu führt, daß man
Gui und Algos trennt und nur noch über eine Schnittstelle
spricht. Lohnt aber ,IMHO, nur bei Portierung und austauschbarer Guis.

Ich kenn allerdings auch nur EIN EINZIGES Windowsprogramm, das der Mühe wert wäre Systemübergreifend umgesetzt zu werden - TMPEGENC .
Bei NERO bin ich mir da schon nicht mehr so sicher :) )



[ - Ändern - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Program von win auf amiga [ - Suche - Neue Beiträge - Registrieren - Login - ]


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