Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Jul 23, 2019 6:35 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 1 post ] 
Author Message
PostPosted: Thu Jan 08, 2015 5:09 pm 
Offline

Joined: Mon Feb 16, 2009 5:40 am
Posts: 80
Попытался написать маленькую игру на Си, и откомпилировать её в ktcc (tinyC).
Spoiler: Show
Code:
#include <stdio.h>
#include <string.h>
#include <kolibrisys.h>

char* dllname="/sys/lib/console.obj";
int i;

char* imports[] = {"START","version","con_init","con_write_asciiz","con_printf","con_exit",NULL};
char* caption = "Console test - colors";

dword (* dll_start)(dword res);
dword* dll_ver;
void stdcall (* con_init)(dword wnd_width, dword wnd_height, dword scr_width, dword scr_height, const char* title);
void stdcall (* con_write_asciiz)(const char* string);
void cdecl  (* con_printf)(const char* format,...);
void stdcall (* con_exit)(dword bCloseWindow);

struct import{
        char *name;
        void *data;
};

void link(struct import *exp, char** imports){
        dll_start = (dword (*)(dword))
                _ksys_cofflib_getproc(exp, imports[0]);
        dll_ver = (dword*)
                _ksys_cofflib_getproc(exp, imports[1]);
        con_init = (void stdcall (*)(dword , dword, dword, dword, const char*))
                _ksys_cofflib_getproc(exp, imports[2]);
        con_write_asciiz = (void stdcall (*)(const char*))
                _ksys_cofflib_getproc(exp, imports[3]);
        con_printf = (void cdecl (*)(const char*,...))
                _ksys_cofflib_getproc(exp, imports[4]);
        con_exit = (void stdcall (*)(dword))
                _ksys_cofflib_getproc(exp, imports[5]);
}

int main(int argc, char **argv){

        struct import * hDll;
        int a,b,c,d;

        if((hDll = (struct import *)_ksys_cofflib_load(dllname)) == 0){
                debug_out_str("can't load lib\n");
                return 1;
        }
        link(hDll, imports);
        debug_out_str("dll loaded\n");

        if(dll_start(1) == 0){
                debug_out_str("dll_start failed\n");
                return 1;
        }

        con_init(-1, -1, -1, -1, caption);

char lab[20] [20],key;
int x,y,a,b,c,kolvo=0;

con_printf("\nŒ â¥¬ â¨ç¥áª¨© « ¡¨à¨­â.");
con_printf("\n\n‡ ¤ ç  ¤®©â¨ ¤® 業âà  « ¡¨à¨­â .");
con_printf("\n‚ è¥ ¬¥á⮯®«®¦¥­¨¥ ®¡®§­ ç¥­® §¢ñ§¤®çª®©.");
con_printf("\n“¯à ¢«¥­¨¥ w-¢¢¥àå, s-¢­¨§, d-¢¯à ¢®, a-¢«¥¢®, esc - ¢ë室");
con_printf("\n’¥ªã饥 ª®«¨ç¥á⢮ è £®¢ 㪠§ ­­® ¢­¨§ã, ¢ áâப¥ '˜ £®¢:'");
con_printf("\n\n„«ï ­ ç «  ­ ¦¬¨â¥ «î¡ãî ª« ¢¨èã....\n\n");
key=con_getch();

newlab:
for (x=0;x<20;x++)
    for (y=0;y<20;y++)
        lab[x] [y]=1+rand()%9;
lab[10] [10]=0;

x=0;y=0;
nextstep:
kolvo++;
for (a=0;a<20;a++)
    {for (b=0;b<20;b++)
         if (a==y && b==x) con_printf("* ");
         else if (lab[b] [a]==0)
                  con_printf("  ");
              else {c=lab[b] [a];
                    con_printf("%d ",c);
                   }
    con_printf("\n");
    }
a=lab [x] [y];
con_printf("\n˜ £®¢: %d \n", a);
if (lab [x] [y]==0)
   {
   con_printf("‘çñâ: %d ®çª®¢.",1000/kolvo);
   con_printf("\n‚ᥣ® 室®¢: %d \n",kolvo);
   con_printf("\n\n„«ï § ¯ã᪠ ­ ¦¬¨â¥ «î¡ãî ª« ¢¨èã....\n");

   key = con_getch();
   kolvo=0;
   goto newlab;
   }
getkey:
key=con_getch();

if (key=='a')
   if (x-lab[x] [y]>=0)
      x=x-lab[x] [y];
   else goto getkey;
if (key=='d')
   if (x+lab[x] [y]<=19)
      x=x+lab[x] [y];
   else goto getkey;
if (key=='w')
   if (y-lab[x] [y]>=0)
      y=y-lab[x] [y];
   else goto getkey;
if (key=='s')
   if (y+lab[x] [y]<=19)
      y=y+lab[x] [y];
   else goto getkey;
if (key==27)
   return 0;
goto nextstep;

con_exit(0);
debug_out_str("all right's ;)\n");

return 0;

}

Программа откомпилировалась, но при работе:
1) выдаёт на функцию getch() сообщение "Ошибка: неподдерживаемая инструкция процесора";
2) зависает (скорей всего при обращении к многомерному массиву) с выводом на доску сообщения
Code:
K : Process - forced terminate PID: 00000019 [matlab]
K : Undefined Exception
K : EAX : 00000028 EBX : 0000000B ECX : 7002C845
K : EDX : 7002D767 ESI : 00000902 EDI : 00000000
K : EBP : 00002360 EIP : 00000284 ESP : 0000219C
K : Flags : 00011216 CS : 0000001B (application)
K : Stack dump:
K : [ESP+00]: 00000287 [ESP+04]: 00000000 [ESP+08]: 00000000
K : [ESP+12]: 00000000 [ESP+16]: 00000000 [ESP+20]: 00000000
K : [ESP+24]: 00000000 [ESP+28]: 00000000 [ESP+32]: 00000000


Тот же код компилируется и работает как в винде (tcc version 0.9.25), так и в линуксе (tcc version 0.9.24)... Как можно добиться компиляции в колибри?

Attachment:
File comment: Исходники и бинарники для kos, win и lin...
MATLAB.zip [8.08 KiB]
Downloaded 291 times

Attachment:
BOARDLOG.TXT [2.81 KiB]
Downloaded 287 times


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 1 post ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited