kategoria: ANSI C
[#31] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #30

Już wiem, kompiluje się na PC a uruchamia na Amidze. I wszystko działa. Mimo to lepiej pisać bezpośrednio na Amidze. Tak wygodniej.
[#32] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #31

Poczyniłem taki programik. Wypisuje w nieskończoność liczby pierwsze. Jak można określić by czas wypisywania był równy np. 1 minutę? Taki prymitywny benchmark by z tego wyszedł. Kto ma większą liczbę pierwszą ten ma szybszą Amigę.


#include <stdio.h>

main()
{

int liczba=0, i, modulo, licznik=0;
int kwadrat;

printf("Liczby pierwsze\n.");

while(1)
{
liczba=liczba+1;

for(i=1;i<=liczba;i=i+1)
{
modulo=liczba%i;
if(modulo==0)
licznik=licznik+1;
}

if(licznik==2)
printf("\nLIczba pierwsza: %d",liczba);
licznik=0;
}
return (0);
}
[#33] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #32

I tutaj właśnie pojawia się problem. Jeśli wnikałeś w moją radosną twórczość to robiłem benchmark obliczający liczbę PI. Pobierałem czas startowy obliczeń oraz czas zakończenia. Ich różnica stanowi o wydajności procesora/koprocesora - im szybciej tym lepiej. A teraz do problemu - pod Amigą VBCC nie chce prawidłowo działać funkcja clock() ze standardowej biblioteki time.h . Zawsze zwraca stałą zamiast wynik zmieniać się w czasie (rosnąco). Koledzy podesłali przykładowe rozwiązanie z netu ale jeszcze nie zająłem się nim.
[#34] Re: W jaki sposób napisać "Hello World" w języku C.

@pong777, post #33

Wnikałem i zainspirowany Twoim programem wpadłem na ten pomysł z liczbami pierwszymi.
[#35] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #32

Jest sposób. Amiga ma coś takiego jak przerwania sprzętowe, jednym z nich jest gdy klatka obrazu kończy być wyświetlana (VBLANK). Możesz sobie napisać funkcję, która będzie wywoływana przy danym przerwaniu. Załóżmy, że chcesz funkcję, która Ci podbija licznik klatek:

__amigainterrupt __saveds void timerVBlankServer(__reg("a1") UWORD *pCounter) {
	++(*pCounter);
}


Nagłówek tej funkcji jest obsiany dziwnymi rzeczami, nie przejmuj się nimi. Tak się pisze w VBCC obsługę przerwań. W parametrze przekazujemy adres licznika będącego UWORDem. Funkcja nie robi nic innego tylko zwiększa liczbę pod tym adresem.

Teraz wypadałoby to cholerstwo zaczepić:

UWORD g_uwCounter; // nasz licznik klatek
struct Interrupt *g_pInt;

void timerCreate(void) {
	g_uwCounter= 0; // zerujemy licznik
	g_pInt = AllocMem(sizeof(struct Interrupt), MEMF_CHIP);
	
	g_pInt->is_Node.ln_Type = NT_INTERRUPT;
	g_pInt->is_Node.ln_Pri = -60;
	g_pInt->is_Node.ln_Name = "Moje VBLANK";
	g_pInt->is_Data = (APTR)&g_uwCounter; // to co obsługa dostaje w argumencie
	g_pInt->is_Code = timerVBlankServer; // nazwa funkcji obsługująca przerwanie

	AddIntServer(INTB_VERTB, g_pInt);
}


Na wyjście z programu wypadałoby tę obsługę przerwania wywalić:

void timerDestroy(void) {
	RemIntServer(INTB_VERTB, g_pInt);
	FreeMem(g_pInt, sizeof(struct Interrupt));
}


I tak o to z prawie hello worlda dotknąłeś HW Amigi i od teraz zmienna g_uwCounter zwiększa Ci się 50 razy na sekundę na maszynach w PALu i 60 razy na sekundę przy NTSC. ;)

Pisałem przykład na kolanie więc zastrzegam sobie prawo do tego, że coś jest nie tak.

Jeżeli 50/60 razy na sekundę to dla Ciebie za mała rozdzielczość czasu to jeszcze w strukturze Custom możesz znaleźć pozycję wiązki rysującej obraz na ekranie. Mój engine używa tego do precyzyjnego liczenia czasu.

Ostatnia aktualizacja: 13.01.2016 23:03:34 przez teh_KaiN
[#36] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #35

Nie za bardzo rozumiem jaki jest sens podpinania się pod przerwanie gdy mamy gotowe API w systemie do odmierzenia czasu - timer.device.

Podpinanie się pod VBLANK może ma sens w demie czy w grze, ale nie w programie o charakterze użytkowym.

Wspomniany przykład z EAB dotyczący timer.device:
http://eab.abime.net/showpost.php?p=763787&postcount=2
[#37] Re: W jaki sposób napisać "Hello World" w języku C.

@strim_, post #36

Chociażby po to by pokazać, że tak też można. Przy okazji trochę zachęcić i pokazać wewnętrznych mechanizmów działania sprzętu. No ale ja właśnie patrzę przez pryzmat gamedevu.

Przy benczmarkowaniu w sumie też się uwalniasz od różnic w szybkości implementacji device'a. Masz pewność, że wszędzie kod wykona się dokładnie taki sam. Pytanie, czy to jest celem tego konkretnego benchmarku, czy jednak ewentualne usprawnienia funkcji OSu też ma brać pod uwagę. I tak, ten efekt to będzie kropla w morzu przy dłuższych obliczeniach. ;)

Ostatnia aktualizacja: 13.01.2016 23:17:20 przez teh_KaiN
[#38] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #37

Tak czy inaczej widzę tu potencjał na kilka przykładów do niedawno założonego repozytorium .
[#39] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #37

Jak podczepianie sie pod przerwanie i liczenie liczby wygaszan to moze ten przyklad i dobry ale do liczenia czasu juz srednio. Precyzja (lub komplikacja przez dodatkowe sprawdzanie pozycji w ramce) i komplikacja wynikajaca z potencjalnie roznego czasu trwania ramki. Moim zdaniem nie warto.
[#40] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #32

Tak na marginesie chcialbym przedstawic swoj program do liczb pierwszych ktory kiedys napisalem. Moze komus sie przyda.


#include <stdio.h>
#include <math.h>

#define TAK 1
#define NIE 0

int CzyLiczbaPierwsza(int Liczba);

int main(void)
{
int Liczba, IloscLiczb;

IloscLiczb = 10000; // tu ustawic ilosc badanych liczb

for(Liczba = 2; Liczba < IloscLiczb; Liczba++)
{
if(CzyLiczbaPierwsza(Liczba) == TAK)
{
printf("Liczba pierwsza = %d\n", Liczba);
}
}

return(0);
}

int CzyLiczbaPierwsza(int Liczba)
{
int Granica, Dzielnik, Wynik;

Granica = (int)(sqrt((double)(Liczba))) + 1;

for(Dzielnik = 2; Dzielnik < Granica; Dzielnik++)
{
Wynik = Liczba % Dzielnik;

if(Wynik == 0) return(NIE);
}

return(TAK);
}
[#41] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #37

Przy benczmarkowaniu w sumie też się uwalniasz od różnic w szybkości implementacji device'a. Masz pewność, że wszędzie kod wykona się dokładnie taki sam.

Pozwolę sobie zauważyć, że w wielu przypadkach lepiej jest zastosować device, ponieważ zyskujesz na kompatybilności oraz nie musisz duplikować gotowych rozwiązań.

Za przykład podam, że gdyby większość koderów amigowych w latach 90. używało dos.library, lub chociaż trackdisk.device nie byłoby problemów z instalacją gier, czy dem na twardym dysku. Nie mam pojęcia czemu nie używali tych zasobów... Bo za wolne? Przecież to tylko czytanie z dyskietki...

W wielu przypadkach rzeczywiście funkcje OS mogą nie wystarczyć i należy napisać swoje. Ostrożnie jednak należy to robić. Przykładowo Twój kod obsługi przerwania powinien być napisany w asemblerze ponieważ, jak mówi dokumentacja, system patrzy na status znacznika Z po wykonaniu każdej procedury obsługi przerwania. Jeśli znacznik jest ustawiony, wykonuje pozostałe serwery, w przeciwnym przypadku je pomija.

Czasami samo return( 0 ); nie wystarczy, zależy od kompilatora.

Z mojego doświadczenia Amiga OS może być Twoim sprzymierzeńcem, jeśli zostanie wykorzystany w odpowiedni sposób. Prawda jest taka, że tylko asembler użyty we właściwych miejscach (jakichś obliczeniach wymagających prędkości) może bardzo poprawić szybkość kodu, a nie pomijanie systemu. Wielokrotnie się o tym przekonałem.
[#42] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #34

@chicago

Widziałem, że wrzuciłeś do repozytorium swój przykładowy program. To fajnie, ale pamiętaj, że te przykłady maja pomóc innym początkującym.

Proszę zachowaj strukturę taką jak w pozostałych przykładach wrzucanych przeze mnie, Krashana, asmana i Flopsa:
  • osobny katalog per przykład
  • poprawe rozszerzenia plików sugerujące zawartość
  • preferowane są nazwy plików bez spacji (użyj myślnika zamiast spacji)
  • kod powinien być sformatowany tak aby być możliwie najbardziej czytelnym (w Twoim nie ma żadnych wcięć!)
  • dodaj opis co to w ogóle jest i skompilować, w postaci osobnego pliku README.md (w formacie Markdown, tak aby był ładnie renderowany przez interfejs web GitHuba)


Zapewne łatwiej byłoby Ci operować na zawartości repozytorium, gdybyś użył natywnego klienta dla Twojego systemu operacyjnego.


Ostatnia aktualizacja: 14.01.2016 00:43:07 przez strim_
[#43] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #35

I tak o to z prawie hello worlda dotknąłeś HW Amigi i od teraz zmienna g_uwCounter zwiększa Ci się 50 razy na sekundę na maszynach w PALu i 60 razy na sekundę przy NTSC. ;)


A jak bede mial wlaczony tryb Super72 albo jakis inny egzotyczny z odswierzaniem innym niz 50 albo 60Hz? Naprawde lepiej skorzystac z timer.device, tym bardziej ze timer.device jest duzo dokladniejszym narzedziem do mierzenia czasu (poczytaj o UNIT_MICROHZ)
[#44] Re: W jaki sposób napisać "Hello World" w języku C.

@mschulz, post #43

A jak bede mial wlaczony tryb Super72 albo jakis inny egzotyczny z odswierzaniem innym niz 50 albo 60Hz?

Ja mam na przykład tryb XTREME Laced (1280 x 1024) i on ma odświeżanie 37 Hz. pomysł. Ale widzę, że tu jest miejsce na kolejny mój przykład w repo Strima. Czyli szkielet w asmie do robienia benchmarków i mierzenia ich przy pomocy timer.device.

Ostatnia aktualizacja: 14.01.2016 08:39:20 przez Krashan
[#45] Re: W jaki sposób napisać "Hello World" w języku C.

@Krashan, post #44

Taki przykład byłby super!
Ja używam do wrzucania na GitHub TortoiseGit, wiele repozytorium używałem, ale jakoś nie mogłem się połapać w tym natywnym z GitHuba.
Ja jeszcze będę chciał dodać przykład rozpoznawania czy mamy procesor 68010+, żeby w razie czego odpowiednio ustawić wektory przerwań i jakiś przykład z obsługą przerwania VBlanc. Ale pewnie dopiero w weekend.
[#46] Re: W jaki sposób napisać "Hello World" w języku C.

@flops, post #45

Ja używam do wrzucania na GitHub TortoiseGit, wiele repozytorium używałem, ale jakoś nie mogłem się połapać w tym natywnym z GitHuba.


Szczerze mówiąc ja po prostu używam klienta "git" działającego z linii komend.

Wydaję mi się, że ten natywny GitHubowy klient może być najprostszy dla kogoś kto nie używał nigdy żadnego VCSa.

Skoro Ty jesteś programistą i używałeś, to Tobie bym go nie polecił bo za bardzo "ukrywa" mechanikę działania gita (i tu TortoiseGit może być lepsze, bo jego twórcy chyba założyli, że użytkownik wie co robi).

Ja jeszcze będę chciał dodać przykład...


Myślę, że to przydatne przykłady, ale dyskusję o nich można kontynuować we właściwym wątku ;).
[#47] Re: W jaki sposób napisać "Hello World" w języku C.

@strim_, post #46

Zaczynam zabawę z C na Ami, jakoś nie mogę poprawnie i kompletnie przygotować programu do edycji i kompilowania kodu C. Jedynie DICE kompiluje mi HelloWord, inne przykłady potrafią się wysypać. Może jest ktoś w okolicy 3city dysponujący skompletowanym aktualnym kompilatorem pod Ami na 68k i PPC, mającym ochotę się nim podzielić ?
[#48] Re: W jaki sposób napisać "Hello World" w języku C.

@Risc, post #47

Ja bym nie skreślał DICE. To mój ulubiony kompilator, używam go najczęściej i w praktyce jest niezawodny.
[#49] Re: W jaki sposób napisać "Hello World" w języku C.

@Hexmage960, post #48

A ja bym go skreślił, chyba że do pisania Hello Worldów. Moim zdaniem liczą się dwa: VBCC i GCC, pierwszy lżejszy i szybszy, drugi generujący bardziej zoptymalizowany kod, ale wolniejszy i bardziej zasobożerny. Z GCC 2.95.3 da się spokojnie pracować na 68030 z 16 MB fast.
[#50] Re: W jaki sposób napisać "Hello World" w języku C.

@Krashan, post #49

Bez przesady. DICE ma debuggera (czy VBCC albo GCC go ma?), edytor tekstu, program typu make (DMake) a nawet make z GUI (VMake), sporo utilków umilających życie Amigowcowi-programiście oraz automatyczne otwieranie bibliotek itp. Łatwo robić wstawki asemblerowe, pisać kod przerwania itp.

Z powodzeniem sprawdza się też w dużych projektach. Obecnie piszę w nim pewien większy program.

DICE używam dość długo i wyrobiłem sobie pozytywne zdanie na jego temat.

GCC dla mnie jest za wolny.
[#51] Re: W jaki sposób napisać "Hello World" w języku C.

@Hexmage960, post #50

A możesz mi podesłać DICE z skonfigurowanym edytorem ?
widzę że może pracowac z cedem i 3 innymi edytorami.ale jakoś nie potrafię tego rozgryźć.
Zasadniczo Dice mi działa i kompiluje HelloWorld, ale mało to wygodnie pisanie z cli i na edytorze nie zespolonym z DCC.
[#52] Re: W jaki sposób napisać "Hello World" w języku C.

@Risc, post #51

A ja właśnie tak robię - piszę w edytorze - potem DMake i odpalam. Nie mam specjalnie skonfigurowanego edytora dla DICE, choć za pomocą skryptów ARexxa pewnie da się to zrobić. Nigdy tego nie próbowałem.

Właśnie zajrzałem do katalogu z DICE (przypis DCC:). W katalogu "editors" rzeczywiście są cztery podkatalogi w tym "TurboText" i "CED" a w nich skrypty ARexxa i pliki konfiguracyjne.

Przepraszam, że w tej chwili nie mogę pomóc, postaram się sprawdzić to w działaniu z CygnusEDem i dam znać. Podejrzewam jednak, że sam też sobie poradzisz, pewnie wystarczy skopiować pliki w odpowiednie miejsca i przypisać dowolnym kombinacjom klawiszy odpowiednie skrypty.

Z jakiego edytora korzystasz?
[#53] Re: W jaki sposób napisać "Hello World" w języku C.

@Hexmage960, post #52

Napotkałem taki drobny problem. Program napisany w C nie daje się zamknąć, czyli raz uruchomiony po zamknięciu uruchamia się ponownie. Tylko reset systemu zostaje. Jak to rozwiązać?
[#54] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #53

A kod mógłbyś wkleić?
[#55] Re: W jaki sposób napisać "Hello World" w języku C.

@teh_KaiN, post #54

#include <stdio.h>

main()
{

int liczba=0, i, modulo, licznik=0;
int kwadrat;

printf("Liczby pierwsze\n.");

while(1)
{
liczba=liczba+1;

for(i=1;i<=liczba;i=i+1)
{
modulo=liczba%i;
if(modulo==0)
licznik=licznik+1;
}

if(licznik==2)
printf("\nLIczba pierwsza: %d",liczba);
licznik=0;
}
return (0);
}
[#56] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #55

Jak masz pętlę while(1) I żadnego break czy exit w środku to nie dziwne, że się nie kończy.
[#57] Re: W jaki sposób napisać "Hello World" w języku C.

@perinoid, post #56

Program póki działa ma się nie kończyć. Ale on się nie daje zamknąć klikając myszką. Tzn zamyka się i uruchamia od nowa.
[#58] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #57

a ubicie ctrl+c działa?
[#59] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #57

Nie uruchamia sie od nowa. Zamkniecie konsoli nie powoduje zamkniecie aplikacji! Po prostu zamykasz jej miejsce na którym wyświetla dane. Przy pierwszej próbie wyświetlenia czegokolwiek system operacyjny sam otwiera okno jezeli jest niedostepne (chyba tak to jakos bylo).
[#60] Re: W jaki sposób napisać "Hello World" w języku C.

@chicago, post #57

Jest dokładnie tak jak napisał Kiero.

Ja dodam, że jeśli chcesz by Twój program dało się zamknąć możesz skorzystać z sygnałów. Wówczas np. kombinacja klawiszy CTRL+C zatrzyma Twój program (jak wspomniał Teh_KaiN).

Załącz plik <dos/dos.h> oraz prototypy biblioteki exec, a następnie zamień while( 1 ) na:

while( !( SetSignal( 0L, SIGBREAKF_CTRL_C ) & SIGBREAKF_CTRL_C ) )

Dzięki temu program opuści pętlę, gdy naciśniesz kombinację CTRL + C, gdy konsola jest aktywna.
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