C--

High-level languages programming questions
  • Это из-за того, что при использовании элемента окно становится неактивным, а потом полностью перерисовывается.
  • Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
    Может кто может помочь? Может есть у кого-то идеи?
    Из хаоса в космос
  • Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
    Может кто может помочь? Может есть у кого-то идеи?
    Ты про editbox?
    to infinity and beyond
  • Например, в Eolite Ctrl+C / Ctrl+V не работает при именовании нового файла.
  • Да, про editbox.
    Из хаоса в космос
  • Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
    Может кто может помочь? Может есть у кого-то идеи?
    editbox работает только в ASCII mode, соответственно ждет коды 46, 47
    Last edited by Siemargl on Mon Oct 31, 2016 10:46 am, edited 1 time in total.
  • Leency wrote: Ctrl+C / Ctrl+V
    Ну ты хоть бы код привёл тогда.
  • Я нашел проблему.
    Из хаоса в космос
  • Leency wrote:Я нашел проблему.
    Ждемс описания :) Я вчера пытался разобраться с этим, но не преуспел пока.
    to infinity and beyond
  • Суть
    serwerge.png
    serwerge.png (25.04 KiB)
    Viewed 12984 times
    В программах использовать или так:

    Code: Select all

    GetKeys();
    edit_box_key stdcall(#edit1);	
    или так

    Code: Select all

    GetKeys();
    SomeCodeBlaBlaBla();
    SomeCodeBlaBlaBla();
    EAX = key_editbox;
    edit_box_key stdcall(#edit1);	
    Из хаоса в космос
  • Исправлено для всех программ С--.
    Из хаоса в космос
  • Устав заново изобретать элемент список, сделал его паттерном SelectList.
    cmm/lib/patterns/select_list.h

    Теперь запилить любую программу со списком на С-- проще простого. :D
    Attachments
    Screenshot_1.png
    Screenshot_1.png (62.79 KiB)
    Viewed 12910 times
    Из хаоса в космос
  • Решил попробовать использовать вместе с С-- KolibriOS.lib(её можно взять из темы "Delphi7 examples"), а заодно и статическую libc.

    Оказалось, что С-- не делает COFF, хотя
    вон там http://masm32.com/board/index.php?&topi ... 9#msg66479
    товарищ Emil_halim пишет
    So SphinxC-- ,HJWasm , fasm always compile to Coff object file
    C-- делает OMF, действительно, это можно посмотроеть, например, с помощью TDUMP.
    Но сконвертировть OMF->COFF это не проблема.

    Есть вот эти ключи:

    Code: Select all

    /SOBJ       создать ведомый OBJ файл (slave)
    /OBJ        создать основной модуль (master)
    Но при использовании /OBJ при попытке сконвертровать ругается вот так:
    fatal error LNK1178: missing MODEND record; file is invalid or corrupt
    Наверное, С-- сделал кривой объектник.
    Однако, другой ключ /SOBJ вполне работает.
    То есть, получается, что вместе с С-- можно использовать и KolibriOS.lib, и libc, ну и что-нибудь другое тоже.

    Вот некоторые примеры:
    Spoiler:

    Code: Select all

    /* Event Constants */
    #define REDRAW_EVENT 1
    #define KEY_EVENT    2
    #define BUTTON_EVENT 3
    
    /* Window Style Constants */
    #define WS_SKINNED_FIXED 0x4000000
    #define WS_COORD_CLIENT  0x20000000
    #define WS_CAPTION       0x10000000
    
    /* Caption Style Constants */
    #define CS_MOVABLE 0
    
    struct TButtonInput{
      byte MouseButton;
      word ID;
      byte HiID;
    };
    
    // Import from KolibriOS.lib:
    extern dword stdcall GetButton();
    extern dword stdcall GetKey();
    extern dword stdcall WaitEvent();
    extern void  stdcall BeginDraw();
    extern void  stdcall EndDraw();
    extern void  stdcall DrawWindow(int Left, Top, Right, Bottom; char* Caption; dword BackColor, Style, CapStyle);
    extern void  stdcall ThreadTerminate();
    
    void Main(){
      TButtonInput Button;
      while(){
        switch (WaitEvent()){
        case BUTTON_EVENT:
          Button = GetButton();
          if (Button.ID == 1) ThreadTerminate();
        break;
        case KEY_EVENT:
          GetKey();
        break;
        case REDRAW_EVENT:
          BeginDraw();
          DrawWindow(300, 200, 400, 250, "C-- with KolibriOS.lib", 0x00C0DDEE, WS_SKINNED_FIXED | WS_COORD_CLIENT | WS_CAPTION, CS_MOVABLE);
          EndDraw();
        break;
        }
      }
    }
    Spoiler:

    Code: Select all

    // Import from libc:
    extern char* cdecl   _strcpy(char* dst, char* src);
    extern char* cdecl   _strupr(char* str);
    extern char* cdecl   _strlwr(char* str);
    // Import from KolibriOS.lib:
    extern void  stdcall ThreadTerminate();
    extern int   stdcall RunFile(char* Path, CmdLine);
    
    #define NOTIFY_APP "/sys/@notify"
    
    void Main(){
      char* Str0 = "The String For a Testing!";
      char  Str1[30];
      char  Str2[30];
    
      _strcpy(#Str1, Str0);
      _strcpy(#Str2, Str0);
    
      _strlwr(#Str1);
      _strupr(#Str2);
    
      RunFile(NOTIFY_APP, Str0);
      RunFile(NOTIFY_APP, #Str1);
      RunFile(NOTIFY_APP, #Str2);
    
      ThreadTerminate();
    }
    Spoiler:

    Code: Select all

    // Import from libc:
    extern int   cdecl   _atoi(char* str);
    // Import from KolibriOS.lib:
    extern void  stdcall ThreadTerminate();
    extern int   stdcall CreateFile(char* Path);
    extern int   stdcall WriteFile(char* Path, Buffer; dword Count, LoPos, HiPos; dword* BytesWritten);
    extern int   stdcall RunFile(char* Path, CmdLine);
    
    #define STR_EQUAL "Equal"
    #define STR_NOT_EQUAL "Not equal"
    #define FILE_PATH "/sys/!test.txt"
    
    void Main(){
      dword BytesWritten;
      char* StrResult;
      dword SizeOfStrResult;
    
      CreateFile(FILE_PATH);
      if (_atoi("  -100500  ") == -100500)
      {
        StrResult = STR_EQUAL;
        SizeOfStrResult = sizeof(STR_EQUAL);
      }
      else
      {
        StrResult = STR_NOT_EQUAL;
        SizeOfStrResult = sizeof(STR_NOT_EQUAL);
      }
      WriteFile(FILE_PATH, StrResult, SizeOfStrResult - 1, 0, 0, #BytesWritten);
      RunFile("/sys/txtread", FILE_PATH);
    
      ThreadTerminate();
    }
    Spoiler:

    Code: Select all

    // Import from libc:
    extern int   cdecl   _snprintf(char* s; dword n; char* format, ... );
    // Import from KolibriOS.lib:
    extern void  stdcall ThreadTerminate();
    extern dword stdcall LoadLibrary(char* Path);
    extern dword stdcall GetProcAddress(dword hLib; char* ProcName);
    
    dword hConsole;
    
    void stdcall (*ConsoleInit)(dword WndWidth, WndHeight, ScrWidth, ScrHeight; char* Caption);    
    void stdcall (*ConsoleExit)(dword bCloseWindow);      
    void stdcall (*WriteN)(char* string, dword length);   
    
    void Main(){
      char buffer[60];
      
      hConsole    = LoadLibrary("/sys/lib/console.obj");
      ConsoleInit = GetProcAddress(hConsole, "con_init");
      ConsoleExit = GetProcAddress(hConsole, "con_exit");
      WriteN      = GetProcAddress(hConsole, "con_write_string");  
      
      ConsoleInit(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, "Test");
    
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "test\n"));                       // no specifier          
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "d = %d\n", 100500));             // decimal signed        
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "u = %u\n", -1));                 // desimal unsigned      
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "s = %s\n", "string"));           // character string      
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "c = %c\n", 'h'));                // single character      
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "x = %x\n", 0x1a3b5c7d));         // hexadecimal lower case
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "X = %X\n", 0x1A3B5C7D));         // hexadecimal upper case
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "o = %o\n", 0o1234567));          // octal number          
      WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "f = %f\n", (double)1234.56789)); // floating-point number 
          
      ConsoleExit(0);      
      ThreadTerminate();
    }
    Собирается это вот так:
    Spoiler:

    Code: Select all

    Set NAME=test
    C-- %NAME%.c-- /w32 /sobj
    LINK -edit %NAME%.obj
    LD -T LScript.x %NAME%.obj -o %NAME%.kex -L %LIBC% -l libc -L %KolibriOS% -l KolibriOS
    OBJCOPY -O binary -j .all %NAME%.kex
    Del %NAME%.obj
    Pause
    
    %LIBC% директория, в которой находится libc
    %KolibriOS% директория, в которой находится KolibriOS.lib
    LScript линкер-скрипт для GNU-линкера LD
    Думаю, можно вынести константы и определения в отдельный файл.
    Downloaded 353 times
    Попробовал таким способом(LD+OBJCOPY) собрать Eolite:

    Пришлось закомментировать

    Code: Select all

    //#startaddress 0
    А то ругалось
    this option only for COM output files.
    Думаю, надо было ещё поправить размер памяти в линкер-скрипте (исправить на MEMSIZE)
    наверное, из-за этого некоторые надписи и цвета были неправильные, но кое-что работало.
    Spoiler:
    eolite_16_07.PNG
    eolite_16_07.PNG (42.92 KiB)
    Viewed 10814 times
    И ещё #param и #program_path, может ещё что-то.
    Почему-то размер программы получился аж целых 564 КБ, зато сжатый KPACK-ом 28 КБ.

    Вот так собирал:
    Spoiler:

    Code: Select all

    Set NAME=eolite
    @echo #define LANG_ENG 1 >lang.h--
    C-- %NAME%.c /w32 /sobj
    LINK -edit %NAME%.obj
    LD -T LScript.x %NAME%.obj -o %NAME%.kex
    OBJCOPY -O binary -j .all %NAME%.kex
    Del %NAME%.obj
    Pause
    
    Линкер-скрипт:
    Spoiler:

    Code: Select all

    PATH_SIZE    =  1024;
    PARAMS_SIZE  =   256;
    STACK_SIZE   =  1024;
    
    SECTIONS{
      .all : AT(0){
        LONG(0x554e454D);
        LONG(0x31305445);
        LONG(1);
        LONG("main");
        LONG(end);
        LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
        LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
        LONG(end + PATH_SIZE);
        LONG(end);
        *(.text) *(.text$*)
        *(.rdata) *(.rdata$*)
        *(.data) *(.data$*)
        *(.bss)
        end = .;
      } 
      /DISCARD/ : {*(.eh_frame)}  
    }
  • Нулевые данные в конце не вставляются в бинарник, но если расположить после них переменные со значениями, размер бинарника резко увеличится. Вопрос только в том, как на С-- контролировать расположение переменных.
  • Who is online

    Users browsing this forum: No registered users and 1 guest