Project Coco/R sepatutnya project yang sgt portable kerana kodnya langsung tak target untuk specific platform. Akan tetapi beberapa hari lepas, saya telah cuba untuk compile Coco/R dari source code menggunakan gcc versi 4.6.1 (pakej compiler mingw) dan ia berakhir dengan error (gcc invoked dengan
gcc -c -w crp.c)
crp.h:168:6: error: conflicting types for 'SynError'
crp.h:27:6: note: previous declaration of 'SynError' was here
crp.h:178:6: error: conflicting types for 'SemError'
crp.h:30:6: note: previous declaration of 'SemError' was here
Error ini memanglah tak sepatutnya keluar. Dan memang error ini langsung tak keluar bila saya compile kod yang sama di Linux Mint 12 (juga menggunakan gcc versi 4.6.1). Ia tercompile dengan sempurna tanpa apa-apa warning di Linux Mint 12. Nasib baik saya invoke gcc diatas dengan
-w, kalau tak, console saya dah penuh dengan warning.
Saya cuba untuk compile COLLECT.C, CR.C, CRA.C, CRF.C, CRP.C, CRS.C, CRT.C, CRX.C dan SET.C, dan saya dapati satu-satunya kod yang bermasaalah adalah CRP.C. Saya mati akal untuk membetulkan source code ini. Sebab crp.c adalah kod C yang sempurna di Linux Mint 12. Akhirnya saya mengambil keputusan untuk compile crp.c dengan menggunakan Tiny C Compiler. Invoked
tcc -c crp.c dan tcc memberikan error ini:
crp.c:147: incompatible types for redefinition of 'SynError'
Masaalah sama. Ia tentang types dan tentang "
SynError" (juga "
SemError", tapi tcc tak dapat detect error ini. gcc walaubagaimanapun dapat detect masaalah symbol "
SemError"). Nampaknya ia bukan masaalah compiler MingW lagi kerana kedua-dua compiler gcc dan tcc dapat detect error yang sama.
Buntu mencari penyelesaian, saya cuba pula mencari consultation melalui IRC di server IRC Linux Mint. Di server berkenaan ada satu channel bernama "#mingw" dan ia rupanya satu channel unofficial bagi project MingW. Saya cuba menanyakan soal ini di channel berkenaan dan beberapa orang tampil untuk membantu. Ada juga yang menanyakan tentang Coco/R sendiri, kerana ia satu project yang tidak famous berbanding project lain. Coco/R adalah satu program untuk menghasilkan compiler lain. Ia seperti tool
lex dan
yacc bersama dalam satu pakej. Malang sekali, tak ada penyelesaian dapat dicapai dalam sesi consultation tersebut. Cuma saya dinasihatkan untuk examine kod crp.c tersebut dalam bentuk yang dah di preprocessed. Saya invoke lagi
gcc -E -o crp-pre.c crp.c untuk mendapatkan output crp.c yang dah di preprocessed. Ini adalah crp-pre.c:
Long story shorts, saya spotted error dari declaration
SynError dan
SemError. Ia di declared sebagai
void SynError(int errno); untuk
SynError dan
void SemError(int errno); untuk
SemError. Bagi saya yang baru didalam C ini, saya kurang memahami tentang apa masaalah disini, cuma saya hanya tahu, declaration dalam file header mestilah sama dengan assignment (saya belajar ini dari pengalaman dengan Pascal). Contohnya
SynError dideclare
void SynError(int errno); tapi di dalam crp.c, ia function
SynError digunakan sebagai
void SynError(int (*_errno())). The "*" dan "_" missing. Jeng jeng jeng..
Saya kemudian mengubah crp.h dengan mengantikan
void SynError(int errno); kepada
void SynError(int (*_errno())); dan
void SemError(int errno); kepada
void SemError(int (*_errno()));.
Guess what, gcc dan even tcc telah berjaya compile crp.c dan berjaya link semua object lain membentuk file cocor.exe! I'm actually spotted error yang susah nak ditemui hurray!
Ini adalah crp.h dengan modifikasi dari saya:
Alhamdulillah! :) Terima kasih kerana sudi membaca. Selamat berprogramming!