Перейти к содержанию

Язык Си в примерах/XCC C

Материал из Викиучебника — открытых книг для открытого мира

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Библиотека complex
  16. Сортировка на основе qsort
  17. RPN-калькулятор
  18. RPN-калькулятор на Bison
  19. Простая грамматика
  20. Задача «Расчёт сопротивления схемы»
  21. Простая реализация конечного автомата
  22. Использование аргументов командной строки
  23. Чтение и печать без использования stdio
  24. Декодирование звукозаписи в формате ADX
  25. Другие примеры
  26. XCC C

XCC C — это диалект языка Си.[1] У него есть свои преимущества и недостатки:

  1. вариативные функции, union, double и float, не поддерживаются; никогда не инициализируйте двумерные массивы
  2. printf() и pow() — встроенные функции
  3. возможность написания программ на Си под iiixmish2
  4. простая реализация многопоточности
  5. вместо Стандартной библиотеки Си предлагается библиотека XmConC плюс useful.h, assert.h и др.
  6. глобальные переменные автоматически не инициализируются

Примеры программ

[править]
int fib(int n) {
    if(n < 2)
        return n;
    else
        return fib(n - 1) + fib(n - 2);
}

int main() {
    for(int i = 0; i < 21; i++)
        printf("%d\n", fib(i));
    
}
#include <useful.h>

char block = '@';
char map[1024];
#define WIDTH     41

int p = 0;

void move(int n, int c) {
    if(map[p + n] == '.') {
        map[p + n] = '+';
        map[p] = c;
        p += n;
    }
}

void boom() {
    if(map[p + WIDTH] == block) map[p + WIDTH] = '.';
    if(map[p - WIDTH] == block) map[p - WIDTH] = '.';
    if(map[p + 1] == block)     map[p + 1] = '.';
    if(map[p - 1] == block)     map[p - 1] = '.';
}

int main() {
    char *new_map = "\
+....................................... \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................ \
........................................";
    
    memcpy(map, new_map, strlen(new_map) + 1);
    int map_length = strlen(map);
    
    while(true) {
        /* вывод карты */
        clear_output();
        for(int i = 0; i < map_length; i++) {
            if(map[i] == ' ')
                printf("\n");
            else
                putchar(map[i]);
        }
        /***************/
        
        int c = getchar();
        
        switch(c) {
            case 'w': move(-WIDTH, '.'); break;
            case 's': move(WIDTH, '.'); break;
            case 'a': move(-1, '.'); break;
            case 'd': move(1, '.'); break;
            
            case 'W': move(-WIDTH, block); break;
            case 'S': move(WIDTH, block); break;
            case 'A': move(-1, block); break;
            case 'D': move(1, block); break;
            
            case ' ': boom(); break;
            
            case 033: exit(EXIT_SUCCESS); break;
            
            default: if(c < 127) block = c;
        }
    }
}

stack_machine.c

[править]
#include <useful.h>
#include <gets.h>

int stack[100];
int stackptr = 0;

void execute(char *command) {
    char buf[64];
    memset(buf, '\0', sizeof(buf));
    
    if(stackptr < 0 || stackptr >= 100)
        exit(1);
    
    memcpy(buf, command, strlen(command) + 1);
    
    // clear stackptr
    if(strlen(buf) == 0)
        stackptr = 0;
    // character
    else if(buf[0] == '\'')
        stack[stackptr++] = buf[1];
    // number
    else if((buf[0] >= (int)'0' && buf[0] <= (int)'9') || (buf[1] >= (int)'0' && buf[1] <= (int)'9'))
        stack[stackptr++] = atoi(buf);
    // print number
    else if(strcmp(buf, ".")) {
        printf("%d\n", stack[--stackptr]);
        //getchar();
    }
    // print character
    else if(strcmp(buf, "emit")) {
        printf("%c\n", stack[--stackptr]);
        //getchar();
    }
    // addition...
    else if(strcmp(buf, "+")) {
        stackptr -= 2;
        stack[stackptr] = stack[stackptr] + stack[stackptr + 1];
        
        stackptr++;
    }
    else if(strcmp(buf, "-")) {
        stackptr -= 2;
        stack[stackptr] = stack[stackptr] - stack[stackptr + 1];
        
        stackptr++;
    }
    else if(strcmp(buf, "*")) {
        stackptr -= 2;
        stack[stackptr] = stack[stackptr] * stack[stackptr + 1];
        
        stackptr++;
    }
    else if(strcmp(buf, "/")) {
        stackptr -= 2;
        stack[stackptr] = stack[stackptr] / stack[stackptr + 1];
        
        stackptr++;
    }
    else if(strcmp(buf, "mod")) {
        stackptr -= 2;
        stack[stackptr] = stack[stackptr] % stack[stackptr + 1];
        
        stackptr++;
    }
    /* quit */
    else if(strcmp(buf, "bye"))
        exit(0);
    /* unknown command */
    else {
        printf("?\n");
        //sleep(1);
    }
}

int main(int argc, char *argv[]) {
    memset(stack, '\0', sizeof(stack));
    
    for(int i = 1; i < argc; i++)
        execute(argv[i]);
    
}
#include <misc.h>

int counter_active;

__thread1_t counter() {
    /* 1) в новом потоке нельзя вызывать
          пользовательские функции
       2) все переменные здесь должны быть статическими */
    
    counter_active = 1;
    
    thrd1_int i;
    for(i = 0; counter_active; i++) {
        printf("\r%d", i);
        sleep(1);
    }
    
    halt();
}

int main() {
    counter();
    
    getc();
    
    counter_active = 0;
    sleep(1);
    exit(0);
}

thm.c (для Xmtwolime, нужен root)

[править]
#include <xmtwolime.h>
#include <useful.h>

main(int argc, char *argv[])
{
    if (argc < 3) {
        puts ("usage: thm BGCOLOR TEXTCOLOR");
        exit (EXIT_FAILURE);
    }
    
    mem[__extern_label("_main_bgColor")]    =  atoi (argv[1]);
    mem[__extern_label("_main_otherColor")] =  atoi (argv[2]);
    
    exit (EXIT_SUCCESS);
}

Примечания

[править]