• Как clangd установить стандарт C++?

    includedlibrary
    @includedlibrary
    Попробуйте так

    nvim_lsp['clangd'].setup {
        on_attach = on_attach,
        cmd = { 'clangd', '--background-index', '-std=c++17' },
        flags = {
          debounce_text_changes = 150,
        }
    }
    Ответ написан
  • Как решить задачу на Python?

    includedlibrary
    @includedlibrary
    Вы аргументы не правильно разбираете. Например,

    if len(sys.argv) <= 3 and sys.argv[1] == '--key':
            if sys.argv[2] not in storage:


    Если аргументов меньше или три, вы обращаетесь ко второму и третьему аргументу. Ноль аргументов под это условие подходит, поэтому у вас программа и крашится.

    Ещё пример,
    if sys.argv[2] in storage:
        with open(storage_path, 'w') as f:
            storage.get(key[sys.argv[2]])


    Если в хранилище есть ключ, открываем файл и достаём из хранилища значение. Во-первых на данный момент, этот файл уже открыт, во-вторых вы не считываете значения из него в переменную storage, в-третьих вы достаёте значение из storage, но не выводите его в консоль.

    Ещё неверный кусок:
    def key_and_value(dictionary, key, value):
        dictionary.update(key, value)


    Вам по условию нужно собирать список всех значений, а не только последнее.
    Ответ написан
  • Как поменять порядок списка на Haskell?

    includedlibrary
    @includedlibrary
    error здесь лишний, если перевернуть список из нуля элементов, получится список из нуля элемеентов. Ваш код неправильно работает, потому что в последней строчке вы переворачиваете хвост списка, а первые два элемента теряются.

    Получаем:
    mylast :: [a]->[a]
    mylast [] = []
    mylast [z] = [z]
    mylast [z,y] = [y, z]
    mylast [z, y, m] = [m,y,z]
    mylast (z:y:m) = mylast m ++ [y,z]


    Также можно сократить количество паттерн матчинга:
    mylast :: [a]->[a]
    mylast (x:xs) = mylast xs ++ [x]
    mylast [] = []
    Ответ написан
    2 комментария
  • Гайд по дериктивам assembler'a?

    includedlibrary
    @includedlibrary
    Первый мой ответ был ошибочным. Для какого ассемблера вам нужен список директив?
    Ответ написан
  • С чего начять новичку в СИ?

    includedlibrary
    @includedlibrary
    Си можно начать изучать с книги "Язык программирования Си" Кернигана и Ритчи. Или с "Head First C" (я начинал с неё). Потом можно почитать про новые фичи стандарта c11.
    Если вы хотите низкоуровневым программированием заниматься, то для начала нужно прочитать "Архитектура Компьютера" Таненбаума. Ещё есть очень хорошая книга "Цифровая схемотехника и архитектура компьютера" от Сары и Дэвида Харрис.
    Потом читать спецификации на железки, под которые вы хотите писать код.
    Ответ написан
    1 комментарий
  • Как структурировать JSON объект?

    includedlibrary
    @includedlibrary
    Можно использовать Indent
    package main
    
    import (
    	"bytes"
    	"encoding/json"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    )
    
    func main() {
    	artist := "Madonna"
    	token := "5936fb55e90cdd9938f8e7086c783c40"
    	url := fmt.Sprintf(
    		"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=%s&api_key=%s&format=json", artist, token)
    	res, err := http.Get(url)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer res.Body.Close()
    
    	body, err := ioutil.ReadAll(res.Body)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	var pretty bytes.Buffer
    	err = json.Indent(&pretty, body, "", "\t")
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Printf("%v\n", string(pretty.Bytes()))
    }
    Ответ написан
    2 комментария
  • Почему в выводе такие значки?

    includedlibrary
    @includedlibrary
    Изменить тип символа в функции InputSymbol с char* на char.

    Сделать нормальное считывание, потому что считывание символа сейчас реализовано плохо.
    "%s" означает считать массив непробельных символов. Если я введу два символа вместо одного, то перезапишется не только значение переменной symbl.
    char symbl=0;
        char* Symb = &symbl;
        printf("Input = \n");
        scanf("%s", Symb);


    Сделать нормальное считывание строки. В scanf нужно передавать буфер, а не указатель на переменную char.
    char ss = 0;
       char* S = &ss;
       scanf("%s", S);
    Ответ написан
  • Почему окно сразу закрывается?

    includedlibrary
    @includedlibrary
    if (!glfwWindowShouldClose(pWindow))
      {
        isClosed = true;
        glfwTerminate();
        return;
      }


    Если не было события о закрытии окна, то завершить glfw. Почему же окно закрывается?
    Ответ написан
    1 комментарий
  • Почему видит только последнее значение?

    includedlibrary
    @includedlibrary
    Вынесите эту строчку за цикл.
    smax = xmax = 0;
    Ответ написан
    Комментировать
  • Как происходит считывание в Haskell?

    includedlibrary
    @includedlibrary
    Список считать можно вот так. На входе ожидается строка, в которой все числа разделены пробелом:
    readIntList :: IO [Int]
    readIntList = do
    	line <- getLine
    	let ws = words line
    	    ints = map read ws
    	return ints


    Или более короткий вариант:
    readIntList :: IO [Int]
    readIntList = fmap (map read . words) getLine


    Для матриц пока код написать не могу, т.к. не знаю, как вы будете их представлять
    Ответ написан
  • Как сохранять значение переменных в input stream?

    includedlibrary
    @includedlibrary
    Я написал простой пример. Для объявления переменной нужно ввести строку символов формата: varname = number. Для вывода значения переменной - строку формата: print varname. Файл htable.c с реализацией хэш-таблицы в вопрос не влез, если его содержимое будет нужным могу сделать гисту.

    #include <stdio.h>
    #include <stdint.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <string.h>
    #include "htable.h"
    
    typedef struct {
        uint32_t hash;
        char    *var;
        int      val;
    } varnode_t;
    
    uint32_t varnode_hash(hnode_t *_node) {
        varnode_t *node = (varnode_t*)_node;
        return default_hash_func((uint8_t*)node->var, strlen(node->var));
    }
    
    bool varnode_keyeq(hnode_t *_node1, hnode_t *_node2) {
        varnode_t *node1 = (varnode_t*)_node1;
        varnode_t *node2 = (varnode_t*)_node2;
        return !strcmp(node1->var, node2->var);
    }
    
    void varnode_free(hnode_t *_node) {
        varnode_t *node = (varnode_t*)_node;
        free(node->var);
    }
    
    typedef struct {
        char   *input;
        size_t input_size;
        size_t offset;
        char *var;
        int   val;
    } parser_t;
    
    void rollback(parser_t *p) {
        if(p->var) {
            free(p->var);
            p->var = NULL;
        }
    }
    
    bool get_var(parser_t *p) {
        size_t init_offset = p->offset;
        while(p->offset++ < p->input_size) {
            if(p->input[p->offset] == ' ') {
                p->input[p->offset] = '\0';
                p->var = strdup(p->input + init_offset);
                if(!p->var) {
                    perror("failed to allocate memory");
                    return false;
                }
                p->input[p->offset] = ' ';
                while(p->input[p->offset] == ' ' && p->offset < p->input_size)
                    p->offset++;
                return true;
            } else if(p->input[p->offset] < 'a' || p->input[p->offset] > 'z') {
                fputs("error: non-letter character in variable name\n", stderr);
                return false;
            }
        }
        return false;
    }
    
    bool check_eq(parser_t *p) {
        if(p->input[p->offset++] != '=') {
            fputs("error: expected '=' sign\n", stderr);
            return false;
        }
        while(p->input[p->offset] == ' ' && p->offset < p->input_size)
            p->offset++;
        return true;
    }
    
    bool get_val(parser_t *p) {
        if(p->input[p->offset] == '-')
            p->offset++;
        size_t init_offset = p->offset;
        while(p->offset < p->input_size) {
            if(p->input[p->offset] < '0' || p->input[p->offset] > '9') {
                fputs("error: non-digital character in expression\n", stderr);
                return false;
            }
            p->offset++;
        }
    
        p->val = atoi(p->input + init_offset);
    
        return true;
    }
    
    int main() {
        char buf[256];
        parser_t parser = {
            .input = buf,
            .var = NULL
        };
    
        htable_t *vars = htable_create(sizeof(varnode_t), 8,
                                       varnode_hash,
                                       varnode_keyeq,
                                       varnode_free);
        if(!vars)
            return 2;
    
        while(fgets(buf, sizeof(buf)-1, stdin)) {
            parser.offset = 0;
            parser.input_size = strlen(buf);
    
            if(buf[parser.input_size-1] == '\n') {
                buf[parser.input_size-1] = '\0';
                parser.input_size--;
            }
    
            if(strstr(buf, "print")) {
                size_t off = 5;
                while(buf[off] == ' ' && off < parser.input_size)
                    off++;
    
                varnode_t findvar = {
                    .var = buf + off
                };
    
                varnode_t *var = (varnode_t*)htable_lookup(vars, (hnode_t*)&findvar);
                if(!var) {
                    fprintf(stderr, "error: undefined variable %s\n", findvar.var);
                    continue;
                }
    
                printf("%s = %d\n", var->var, var->val);
                continue;
            }
    
            if(!get_var(&parser)  ||
               !check_eq(&parser) ||
               !get_val(&parser)) {
                rollback(&parser);
                continue;
            }
    
            varnode_t *newvar = malloc(sizeof(varnode_t));
            if(!newvar) {
                perror("failed to allocate memory");
                rollback(&parser);
                continue;
            }
    
            newvar->var = parser.var;
            newvar->val = parser.val;
    
            if(!htable_insert(vars, (hnode_t*)newvar)) {
                fprintf(stderr, "error: failed to insert var %s\n", newvar->var);
                rollback(&parser);
                free(newvar);
            }
        }
    
        htable_free(vars);
    }


    htable.h

    #pragma once
    
    #include <stdint.h>
    #include <stdbool.h>
    #include <stddef.h>
    
    typedef struct {
        uint32_t hash;
    } hnode_t;
    
    typedef uint32_t (*htable_hash_func)(hnode_t*);
    typedef bool (*htable_keyeq_func)(hnode_t*, hnode_t*);
    typedef void (*htable_free_func)(hnode_t*);
    typedef struct {
        hnode_t **nodes;
        size_t  node_size;
        size_t  num_nodes;
        size_t  max_nodes;
        int     size_ind;
    
        htable_hash_func  hash_func;
        htable_keyeq_func keyeq_func;
        htable_free_func  free_func;
    } htable_t;
    
    uint32_t default_hash_func(const uint8_t *key, size_t length);
    
    htable_t* htable_create(size_t node_size, size_t max_nodes, htable_hash_func hash_func, htable_keyeq_func keyeq_func, htable_free_func free_func);
    bool htable_insert(htable_t *htable, hnode_t *node);
    hnode_t* htable_lookup(htable_t *htable, hnode_t *node);
    void htable_free(htable_t *htable);

    Ответ написан
    Комментировать
  • Как вывести сумму итераций цикла?

    includedlibrary
    @includedlibrary
    Небольшая рекомендация - указывайте типы аргументов в функциях и сами аргументы в прототипах:
    int start_int();
    int end_int(int start_int);
    int calculate(int start_int, int end_int);


    Решение - нужно переписать функцию calculate следующим образом:
    1. n++ нужно перенести в while, чтобы переменная n увеличивалась каждую итерацию.
    2. Установить начальное значение k в start_int, так как k - текущий размер популяции.
    3. Вместо start_int для обновления k использовать само значение k, по правилам обновления размера популяции
    4. Убрать printf, так как функция calculate должна находить количество итераций, его вывод лучше переместить в main.
    5. Убрать скобки вокруг return, оборачивать return в блок нет никакого смысла.
    6. Вернуть n вместо start_int.


    int calculate(int start_int, int end_int) {
        int k = start_int; //текущий размер популяции
        int n = 0; //счетчик
    
        do {
            k = k + (k / 3) - (k / 4);
            n++;           //инкремент счетчика
        } while (k < end_int);
    
        return n; //возврат количества итераций
    }
    Ответ написан
    7 комментариев
  • Как вывести значения функции, которые лежат в промежутке a>b>c и подсчитать их количество?

    includedlibrary
    @includedlibrary
    #include <stdio.h>
    #include <math.h>
    #define a 5.5
    #define c 2.8
    #define z 4.21
    #define y 28.3
    #define X1 3.4
    #define X2 6.6
    #define DX 0.11
    
    int main() {
        int count = 0;
        for(float x=X1; x<=X2; x+=DX) {
            float b=5*((y-x)*sqrt(y-z*x))/(1+(y+pow(x,2))*log(z));
            if (a > b && b > c) {
                count++;
                printf("b = %f\n", b);
            }
        }
        printf("Количество: %d\n", count);
    }
    Ответ написан
    1 комментарий
  • Как создать двумерный массив указателей на функции Си?

    includedlibrary
    @includedlibrary
    Массив функций можно инициализировать и без амперсанда:
    int test() {
        pn[0]=f1;
        pn[1]=f2;
        return 0;
    }


    Вот так можно создать двумерный массив функций:
    #include <stdio.h>
    
    void p1() { puts("p1"); }
    void p2() { puts("p2"); }
    void p3() { puts("p3"); }
    void p4() { puts("p4"); }
    
    int main() {
    	void (*pn[2][2])() = {
    		{p1, p2},
    		{p3, p4},
    	};
    	
    	for(int i = 0; i < 2; i++)
    	    for(int j = 0; j < 2; j++)
    	        pn[i][j]();
    }
    Ответ написан
  • Как получить числовой хеш заданной длины?

    includedlibrary
    @includedlibrary
    Берите любую хэш-функцию. Например, хэш-функцию Дженкинса.

    uint32_t jenkins_one_at_a_time_hash(char *key, size_t len)
    {
        uint32_t hash, i;
        for(hash = i = 0; i < len; ++i)
        {
            hash += key[i];
            hash += (hash << 10);
            hash ^= (hash >> 6);
        }
        hash += (hash << 3);
        hash ^= (hash >> 11);
        hash += (hash << 15);
        return hash;
    }
    Ответ написан
  • Как избавиться от скобок в Haskell'е?

    includedlibrary
    @includedlibrary
    Можно вручную определить show для ExE.

    instance Show ExE where
      show exe = case exe of
          ExData i -> "ExData " ++ show i
          e1 :$: e2 -> show e1 ++ " :$: " ++ show e2
    Ответ написан
  • Почему не работает вывод значения переменной в цикле for?

    includedlibrary
    @includedlibrary
    Всё правильно работает, просто нужно добавить в конец вводимого текста символ конца файла. В linux это делается нажатием Ctrl-D, в windows - Ctrl-Z
    Ответ написан
    Комментировать
  • Как исправить проблему с поворотом спрайта?

    includedlibrary
    @includedlibrary
    У вас в методе Sprite::SetTransformation обновляется матрица, но вы не применяете её к вашему спрайту. Скорее всего нужно сделать так.
    void Sprite::SetTransformation()
    {
        D3DXVECTOR2 spriteCenter = center;
        D3DXVECTOR2 trans = pos;
        D3DXVECTOR2 scaling = scale;
        D3DXMatrixTransformation2D(&mat, NULL, 0.0, &scaling, &spriteCenter, rotation, &trans);
        sprite->SetTransform(&mat);
    }
    Ответ написан
    Комментировать
  • Можно ли компилировать программы для ПК на виртуальной машине?

    includedlibrary
    @includedlibrary
    Можно пользоваться chroot.

    1) создать образ диска для chroot системы.
    dd if=/dev/zero of=hdd.iso bs=1M count=4096
    losetup /dev/loop0 hdd.iso
    mkfs.ext4 /dev/loop0
    2) установить систему на этот диск с помощью debootstrap, pacstrap, других похожих утилит
    mount /dev/loop0 /mnt
    debootstrap --arch i386 jessie /mnt ftp://ftp.de.debian.org/debian
    3)примонтировать /sys /proc /dev к chroot системе
    mount -o bind /sys /mnt/sys
    mount -o bind /proc /mnt/proc
    mount -o bind /dev /mnt/dev
    4) сделать chroot
    chroot /mnt
    5) по окончании работы выйти из chroot и отсортировать всё обратно.
    exit
    umount /mnt/dev
    umount /mnt/proc
    umount /mnt/sys
    umount /mnt
    losetup -d /dev/loop0
    Ответ написан