kategoria: ANSI C
[#1] [C] - Dziwne GURU
Mam tu kod pewnego swiezego programity ktory probuje swoich sil.
Nie jest tu zarejestrowany na portalu wiec poprosil mnie o pomoc.

#include <stdio.h> 

int main(void)
{
        float mt;
        int dt=25000;
        int surowce;
        float tn;
        float obliczenia;

        printf("Podaj poziom technoologii nadprzestrzennej.\n");
        scanf("%f",&tn);

        obliczenia = tn * 0.05;
        mt = obliczenia * 5000 + 5000;  //<- po dodaniu tej linijki jest GURU

        printf("\nPodaj ilosc surowcow.\n"); //surowce
        scanf("%d",&surowce);

        printf("\n Podano %d surowcow\n", surowce);
        printf("\n Poziom tehchnologii nadprzestrzennej to %f \n", tn);
        printf("\n Pojemnosc ladowni malego transportera to %f \n", mt);
        printf("technologia %.2f \n", obliczenia);

        return (0);
}


Kolega kompiluje pod 020 bez FPU pod GCC z parametrami:
-noixemul -O2 -s -lm

Po dodaniu zaznaczonej linijki jest GURU 8000000B a bez tej linijki jest OK.
Sam nie moge mu pomoc bo u mnie dziala.
Co moze byc nie tak? Moze jakis parametr GCC?
[#2] Re: [C] - Dziwne GURU

@Phibrizzo, post #1

Pewnie masz FPU dlatego dziala. Gdzies jest dolaczany lub wykonywany jakis kod FPU. Bo guru dotyczy komendy FPU. A dlaczego jest dolaczane, to ktos kto zna gcc moze odpowiedziec.
[#3] Re: [C] - Dziwne GURU

@Phibrizzo, post #1

Jaką wersją GCC kompiluje, no i nie podałeś wszystkich parametrów, bo żeby skompilować pod 020 to trzeba dodać -m68020. Po południu spróbuję skompilować ten kod u siebie, mam 020 bez FPU.
1
[#4] Re: [C] - Dziwne GURU

@Don_Adan, post #2

Nie wiem dokladnie jak dziala kompilator GCC, ale jesli w execu ktory tworzy ma odwolania do bibliotek matematycznych to niby czemu ma kozystac z FPU?

@Krashan
Przekaze koledze ten parametr. Jednak tu rodzi sie drugie pytanie: czy jesli nie podam takiego parametru
to kompilator nie powinien stworzyc uniwersalnego kodu dla dowolnego procesora z rodziny 68k?
Jesli nie, do defaultowo tworzy dla jakiego i na jakiej podstawie?
[#5] Re: [C] - Dziwne GURU

@Phibrizzo, post #4

Domyslnie gcc generuje na 68000:

m68k-amigaos-gcc -noixemul -O2 -s --save-temps test.c -o test -lm -v

gcc version 6.5.0b 210216082456 (GCC) 
COLLECT_GCC_OPTIONS='-noixemul' '-O2' '-s' '-save-temps' '-o' 'test' '-lm' '-v' '-mcpu=68000' '-B'


Kod na FPU zostanie wygenerowany, jesli jawnie podasz -m68881 lub inne -m z procesorem, ktory ma FPU (-m68060 na przyklad)

W przypadku tego kodu z pierwszego posta, gcc generuje w tej linii skoki do mulsf3 i addsf3:

<       jsr ___mulsf3
<       addq.l #4,sp
<       move.l #0x459c4000,(sp)
<       move.l d0,-(sp)
<       jsr ___addsf3


Teraz wszystko zalezy jak te funkcje sa zaimplementowane, poniewaz uzyles -noixemul linkowany bedzie libnix a tam implementacja uzywa IEEESPAdd oraz IEEESPMul - obie z biblioteki mathieeesingbas.library

Masz 3 mozliwosci, ktore mi do glowy na szybko przychodza:
- twoje gcc jednak generuje cos innego w tym miejscu (malo prawdopodobne, ale warto uzyc --save-temps i zobaczyc co tam sie dzieje)
- implementacja funkcji fmul i fadd w bibliotece linkowanej uzywa FPU albo jest po prostu zepsuta
- zla wersja mathieeesingbas.library? Ta biblioteka byla w ROMie ZTCP, moze podmienione sa na jakies inne? Albo jakis ROM dziwny? A3000 miala romy, ktore wymagaly FPU. Tez malo prawdopodobne, wiele roznych rzeczy by nie dzialalo z taka bilbioteka.
[#6] Re: [C] - Dziwne GURU

@Phibrizzo, post #4

Bo po prostu biblioteki matematyczne, tez korzystaja z FPU. To zalezy od wersji biblioteki, nie w kazdej bibliotece matematycznej jest/bylo rozpoznawanie FPU w inicie. Ja w swoich przerobkach bibliotek kickstartowych (AllInOne) to dodalem. Wez takie biblioteki hsmaths, one tez uzywaja FPU zalezy, ktora wersje zainstalujesz. Wiec jezeli ten program odwoluje sie do Amigowych bibliotek matematycznych, to uzytkownik musi miec prawidlowa biblioteke zainstalowana.
[#7] Re: [C] - Dziwne GURU

@Don_Adan, post #6

Sprawdzone, biblioteki prosto z systemu 3.1.
Komnpilator GCC 2.95.3.
[#8] Re: [C] - Dziwne GURU

@Phibrizzo, post #1

Mnie zastanawia komentarz w kodzie... ktory sugeruje ze mnożenie 2 liczb zmienno przecinkowych sie udaje, ale problem jest z operacja kiedy uzywamy jednej liczby stalo przecinkowej ze zmienno przecinkowa.
A co gdyby zapisac jako
= obliczenia * 5000.0 + 5000.0
?
[#9] Re: [C] - Dziwne GURU

@orila, post #8

W takiej sytuacji gcc wygeneruje operacje double precision, zamiast single (muldf3 zamiast mulsf3 i adddf3 zamiast mulsf3). To oznacza, ze uzyte zostana funkcje z biblioteki mathieeedoubbas zamiast mathieeesingbas.
Jesli taka zmiana spowoduje, ze program zadziala - nie rozwiazuje to problemu, jedynie go obchodzi, bo jesli cos jest nie tak z libnixem albo biblioteka mathieeesingbas to za chwile ten sam problem bedziesz mial w innym miejscu.

Mam jeszcze jeden pomysl - moze ten libnix co go linkujecie nie otwiera tych bibliotek automatycznie? Sprobuj dodac baze biblioteki i ja otworzyc recznie:
struct Library *MathIeeeSingBasBase;
MathIeeeSingBasBase = OpenLibrary("mathieeesingbas.library", 0);
[#10] Re: [C] - Dziwne GURU

@elf, post #9

Powtórzyłem ten błąd u siebie na Amidze 1200 z fastem.
Używam pakietu ADE z gcc 2.95.3

Snopdos pokazał, że gcc ładuje MathIeeeSingBasBase ale po uruchomieniu wyskakuje guru.

Dopisałem do kodu przed funckcją main()

struct Library *MathIeeeSingBasBase;
MathIeeeSingBasBase = OpenLibrary("mathieeesingbas.library", 0);


Ale wtedy kod nie chce się kompilować.
[#11] Re: [C] - Dziwne GURU

@Wankowicz, post #10

Co znaczy ze nie chce sie kompilowac?
Mozesz podac jaki blad Ci wyskakuje?
[#12] Re: [C] - Dziwne GURU

@Wankowicz, post #10

Skompilowałem ten kod na WinUAE (na razie czasu nie było na sprawdzenie na Amidze), które emuluje procesor 68020, bez FPU. Polecenie standardowo:
gcc -s -O2 -noixemul -m68020 -o test test.c
Odpalenie kończy się guru $8000000B, czyli jakiś problem jest... Spróbuję trochę popatrzeć...

Ostatnia aktualizacja: 12.07.2021 08:37:10 przez Krashan
[#13] Re: [C] - Dziwne GURU

@Krashan, post #12

Na razie upewniłem się, że w kodzie samego programu żadnego rozkazu FPU nie ma. Z tego by wynikało, że dzieje się to w którejś z bibliotek matematycznych (mathieeesingbas, mathieeedoubbas albo mathieeedoubtrans, bo te trzy są otwierane).
[#14] Re: [C] - Dziwne GURU

@Krashan, post #13

Z ciekawosci zaczalem szperac w roznych miejscach bo przypomnialy mi sie pewne informacje na temat
maitieeesingbas.library. Jednak to raczej w niczym nie pomoze.
Pierwsza to taka ze MCP patchowal te biblioteke w przypadku wykrycia 040 z powodu zlych odwolan do funkcji Mul/Div.
Druga, sam SetPatch tez to robil, jednak nie mam pewnosci czy w przypadku juz samego wykrycia jakiegokolwiek koprocesora.
[#15] Re: [C] - Dziwne GURU

@stefkos, post #11

Wydaje mi się, ze ELF nie podał stosownego " #includa do otwarcia w ten sposób biblioteki.

Pokazywałem ten kod koledze z pracy (programista zawodowy) Niestety współcześni programiści potrafią składać programy i gry z klocków jakie umożliwia im ide od microsoftu. Programować oni już nie umieją( bo po co?).

Z tym błędem gcc jestem mega ciekaw czy szanowne grono programistów odkryje przyczynę problemu.
[#16] Re: [C] - Dziwne GURU

@Wankowicz, post #15

Ja tam się na C nie znam ale może potrzebne jest dodanie czegoś w stylu include math.h
[#17] Re: [C] - Dziwne GURU

@pisklak, post #16

Nie jestem przekonany co do tych hipotez. Brak inkluda skutkowałby narzekaniem kompilatora. Z kolei nieotwarcie biblioteki, a co za tym idzie użycie zerowego, czy losowego adresu bazy, raczej nie powinno skutkować błędem 000B, bo ten wprost oznacza próbę wykonania rozkazu FPU na maszynie bez niego.
[#18] Re: [C] - Dziwne GURU

@Krashan, post #17

GCC 6.5 (od bebbo) skompilował to bez dodatkowych parametrów (cpu, optymallizacja itp.) i się uruchomiło w winuae (ale odpalanym na linux - emulacje OS3.9 na 68060, OS2.04 na 68000, OS3.1 na 68020 - wszędzie działa tak samo).
Jak podałem gcc opcje jak Krashan, to też się skompilowało, tyle że po odpaleniu nie wyświetla obliczonych liczb, tylko format, tj. np. zamiast wartość=123, printuje: wartość=%f - może gdzieś w tej okolicy jest problem z gcc 2.95 lub includami/libami.
[#19] Re: [C] - Dziwne GURU

@BigBang, post #18

tyle że po odpaleniu nie wyświetla obliczonych liczb, tylko format

Przy kompilacji musisz dodac parametr -lm (male "L").
[#20] Re: [C] - Dziwne GURU

@Phibrizzo, post #19

Przecież napisałem, że nie podając nic, czyli kompilując tak:
gcc test.c -o test
programik działa poprawnie, a skompilowany z tymi opcjami:
-s -O2 -noixemul -m68020
nie podstawia za %f.
[#21] Re: [C] - Dziwne GURU

@BigBang, post #20

Ah, racja. Nie doczytalem dokladnie
[#22] Re: [C] - Dziwne GURU

@BigBang, post #20

Właśnie sprawdzałem. Program kompiluje się bez błędu ale wiesza po uruchomieniu. Pyta o technologię i cokolwiek wpisze to jest guru.

Używam pakietu ADE z aminetu i kompiluje na Amidze 1200 z fastem.
[#23] Re: [C] - Dziwne GURU

@elf, post #9

Po dodaniu do kodu:

struct Library *MathIeeeSingBasBase;
MathIeeeSingBasBase = OpenLibrary("mathieeesingbas.library", 0);


gcc wypluwa:

initializer element is not costant
warning: data deinitions hs no type or storage class


Program się nie kompiluje
[#24] Re: [C] - Dziwne GURU

@Wankowicz, post #23

A to nie jest tak, że definicję struktury można umieścić poza main, wtedy jest globalna, ale jej inicjalizację trzeba już zrobić wewnątrz funkcji main, lub jakiejkolwiek innej. Poza funkcją mogą być zdefiniowane tylko stałe i zmienne ale operacje na nich muszą być już realizowane wewnątrz funkcji.
2
[#25] Re: [C] - Dziwne GURU

@Wankowicz, post #23

Jak dobrze pamiętam to zrzutuj string na CONST_STRPTR albo zrób coś takiego

static const char* mathName = "mathieeesingbas.library";
//...
MathIeeeSingBasBase = OpenLibrary(mathName, 0);
[#26] Re: [C] - Dziwne GURU

@asman, post #25

A taki prosty program w C sobie był....
Aż mi się przypomniał tytuł całkiem fajnego serialu animowanego - Było Sobie Życie
[#27] Re: [C] - Dziwne GURU

@pisklak, post #26

Podobny wątek dotyczący błędu: https://githubmemory.com/repo/bebbo/amiga-gcc/issues/155
i printf: https://githubmemory.com/repo/bebbo/amiga-gcc/issues/154
[#28] Re: [C] - Dziwne GURU

@Wankowicz, post #22

Testy pod 030 + FPU wykazaly ze program pracuje poprawnie.
Czyli cos wywoluje jakies odwolanie do FPU i dlatego jest problem.
[#29] Re: [C] - Dziwne GURU

@Phibrizzo, post #28

Jesli to jest problem z mathieeesingbas.library to mozesz sciagnac wersje ze strony WT (powinna byc w archiwum z malymi modulami ROM-u). Zaladuj za pomoca LoadModule, sprawdz czy sie zaladowala (C:version mathieeesingbas.library) i przestestuj ten program, powinien zadzialac.
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