[#1] MorphOS SDK C/C++ i MUI
Poczytałem tu i tam, i zdaje się trzeba sobie dodać do inkludów:

#ifdef __cplusplus
extern "C" { 
#endif /* __cplusplus */


Pytanie czy na pewno to dobry kierunek?
Pytam bo sporo nowości w świeżym SDK dla MorphOS i może jakoś inaczej teraz to się robi.
Dodatkowo, którym kompilatorem z SDK MOS-a najlepiej podejść do tego tematu?
[#2] Re: MorphOS SDK C/C++ i MUI

@ede, post #1

Dodać do jakich inkludów dokładniej? Normalnie to nie jest potrzebne. Co próbujesz zrobić? Jakiś błąd dostajesz?

Zdecydowanie polecam ppc-morphos-g++-9, jeśli chcesz użyć C++.
[#3] Re: MorphOS SDK C/C++ i MUI

@Jacek Piszczek, post #2

Dodać do jakich inkludów dokładniej?

Do systemowych. Jak mam *.cpp i w tym np. funkcje z MUI, to g++ (2.95.3 i 4.4.5) jakby nie trybił.

Co próbujesz zrobić? Jakiś błąd dostajesz?


Ogólnie to próbowałem skompilować cokolwiek z kodu RayStorm, a to jest "mixed code C/C++". Kompilowane było przez autora w StormC. Coś tam się udało, po moich bojach ale wieszało się na starcie i nieco wymiękłem.

Także odpuściłem to i wziąłem sobie jakiś przykładowy kod w C z MUI, z zamiarem dołączenia czegoś w C++, żeby sobie zobaczyć jak to powinno być zrobione aby GCC to przełknęło. No i jak tylko zrobię z tego *.cpp to tak jakby nie było w kodzie żadnych inkludów.

Pokombinuję jeszcze na spokojnie z tym ppc-morphos-g++-9 i sprawdzę, który to błąd nie do przejścia - bo to już różne rzeczy były... :)





Ostatnia aktualizacja: 18.09.2020 21:25:29 przez ede
[wyróżniony] [#4] Re: MorphOS SDK C/C++ i MUI

@ede, post #3

Ja mam u siebie tony kodu w C++ z niewielkimi domieszkami C. Używam ppc-morphos-g++-8. Z dziewiątką miałem jakiś problem i to chyba właśnie na styku C i C++. Chyba nic wielkiego ale nie drążyłem tematu, bo miałem ważniejsze rzeczy do dziubania, a ósemka jest dla mnie jak najbardziej wystarczająca. Kiedyś pewnie znów spróbuję dziewiątki.

Generalnie to FlowStudio jest bardzo wygodne (jak na amigowe warunki) i nie mam z nim większych problemów. Ma kilka niedoróbek ale nawet nie śmiem wypominać, bo to co dostaliśmy i tak przekroczyło moje marzenia z czasów klasycznej Amigi. szeroki uśmiech

Ostatnia aktualizacja: 18.09.2020 22:49:59 przez MDW
[#5] Re: MorphOS SDK C/C++ i MUI

@ede, post #3

GCC 2 i 4 są już tak antyczne, że lepiej tego nie używać - zdecydowanie do C++ nic poniżej GCC5 się nie nadaje. StormC powiedzmy że średnio kompilował C++ (standardy? jakie standardy? :) ), więc to mnie akurat nie dziwi, że masz problemy. Anyway, zapodaj konkretny przykład problemu, to coś poradzimy.
[#6] Re: MorphOS SDK C/C++ i MUI

@Jacek Piszczek, post #5

Pokombinowałem i mam tak, że mam dokładnie odwrotnie: GCC powyżej 4.4.5 też kompiluje, jednak programik po uruchomieniu i wyświetleniu okna MUI od razu się zawiesza - "Unknow Exception" albo "Illegal Instruction".

Przykład poniżej ("Hello world" w MUI z Morphzone Library) można kompilować jako *.c jak również *.cpp.
Dodałem minimalne komentarze w miejscach niezbędnych zmian aby dało się kompilować jako C++. Co ciekawe po odwróceniu zmian do oryginału i kompilacji jako C nowszymi wersjami od 4.4.5 - efekt ten sam co powyżej - zawieszka.

/* compile with "ppc-morphos-g++-9 -noixemul -o helloworld_mui helloworld_mui.cpp" */


#include <proto/muimaster.h>
#include <proto/intuition.h>

#include <proto/alib.h> //     bez tych dwóch inkludów nie kompiluje się jako C++
#include <proto/exec.h> //

Object *App, *Win;


Object* build_gui(void)
{
	App = MUI_NewObject(MUIC_Application,
		MUIA_Application_Author, (ULONG)"Grzegorz Kraszewski",
		MUIA_Application_Base, (ULONG)"HELLOWORLD",
		MUIA_Application_Copyright, (ULONG)"Š 2010 Grzegorz Kraszewski",
		MUIA_Application_Description, (ULONG)"Hello World in MUI.",
		MUIA_Application_Title, (ULONG)"Hello World",
		MUIA_Application_Version, (ULONG)"$VER: HelloWorld 1.0 (16.11.2010)",
		MUIA_Application_Window, (ULONG)(Win = MUI_NewObject(MUIC_Window,
			MUIA_Window_Title, (ULONG)"Hello World",
			MUIA_Window_RootObject, MUI_NewObject(MUIC_Group,
				MUIA_Group_Child, MUI_NewObject(MUIC_Text,
					MUIA_Text_Contents, (ULONG)"Hello world!",
				TAG_END),
			TAG_END),
		TAG_END)),
	TAG_END);
}


void notifications(void)
{
	DoMethod(Win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App, 2, 
	 MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
}


void main_loop(void)
{
	ULONG signals = 0;

	SetAttrs(Win, MUIA_Window_Open, TRUE, TAG_END);    // set(Win, MUIA_Window_Open, TRUE);  - tak jest w oryginale
			 
	while (DoMethod(App, MUIM_Application_NewInput, &signals) != MUIV_Application_ReturnID_Quit)
	{
		signals = Wait(signals | SIGBREAKF_CTRL_C);
		if (signals & SIGBREAKF_CTRL_C) break;
	}

	SetAttrs(Win, MUIA_Window_Open, FALSE, TAG_END);   // set(Win, MUIA_Window_Open, FALSE); -  tak jest w oryginale
}

int main(void)
{
	if (App = build_gui())
	{
		notifications();
		main_loop();
		MUI_DisposeObject(App);
	}
	return 0;
}


Po kompilacji za pomocą GCC 2.95.3 i 4.4.5 działa jak należy





Ostatnia aktualizacja: 20.09.2020 19:30:53 przez ede
[wyróżniony] [#7] Re: MorphOS SDK C/C++ i MUI

@ede, post #6

Object* build_gui(void) nie zwraca nic. Polecam kompilować z -Wall -Werror.

Object* build_gui(void)
{
	return MUI_NewObject(MUIC_Application,
		MUIA_Application_Author, (ULONG)"Grzegorz Kraszewski",
		MUIA_Application_Base, (ULONG)"HELLOWORLD",
		MUIA_Application_Copyright, (ULONG)"Š 2010 Grzegorz Kraszewski",
		MUIA_Application_Description, (ULONG)"Hello World in MUI.",
		MUIA_Application_Title, (ULONG)"Hello World",
		MUIA_Application_Version, (ULONG)"$VER: HelloWorld 1.0 (16.11.2010)",
		MUIA_Application_Window, (ULONG)(Win = MUI_NewObject(MUIC_Window,
			MUIA_Window_Title, (ULONG)"Hello World",
			MUIA_Window_RootObject, MUI_NewObject(MUIC_Group,
				MUIA_Group_Child, MUI_NewObject(MUIC_Text,
					MUIA_Text_Contents, (ULONG)"Hello world!",
				TAG_END),
			TAG_END),
		TAG_END)),
	TAG_END);
}


działa OK z g++-9.

Ostatnia aktualizacja: 20.09.2020 23:18:16 przez Jacek Piszczek
[#8] Re: MorphOS SDK C/C++ i MUI

@Jacek Piszczek, post #7

Z -Wall -Werror kompiluje się elegancko po zmianie w funkcji: void main_loop(void)
while (DoMethod(App, MUIM_Application_NewInput, &signals) != MUIV_Application_ReturnID_Quit)

na
while (DoMethod(App, MUIM_Application_NewInput, &signals) != (ULONG)MUIV_Application_ReturnID_Quit)


i w funkcji: int main(void)
if (App = build_gui())

na
App = build_gui();
	
	if (App)

I tak właściwie jest w artykule na Morphzone Library z tym ostatnim warunkiem. Co prawda w załączonym kodzie do artykułu jest nieco inaczej, czyli
if (App = build_gui())

Niby to samo a jednak jest warning: "suggest parentheses around assignment used as truth value"
Więc zrobiłem na początku tak:
if (App != NULL)

Tak jest też OK zdaje się, ale w tym kodzie jakby bez sensu. Chyba, że treść funkcji 'Object* build_gui(void)' znalazła by się w funkcji 'int main(void)' jeśli dobrze rozumiem.

Dzięki za pomoc :)
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem