• Можете посоветовать список учебников по ассемблеру для микроконтроллеров AVR, чтобы стать гуру в этой области?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    не повторяйте вопросы
    https://ww1.microchip.com/downloads/en/DeviceDoc/4...
    Ответ написан
    Комментировать
  • Не получается вернуть строку. Как исправить?

    @res2001
    Developer, ex-admin
    1. Лучше бы вы использовали std::string, а не нативные ("сырые") строки.
    2. Нативные строки - это не строки в привычном для С++ смысле (и в смысле интерпретируемых ЯП). У них нет встроенных операций типа конкатенации, выделения подстрок и т.п. Все это реализуется функциями в стиле Си str*
    3. Если вы хотите вернуть сырую строку, то надо:
    3.1. Массив под строку выделять в динамической памяти (или передавать его как параметр в функцию и его заполнять). Сейчас у вас автоматический массив, а он исчезнет, как только отработает оператор return и строка по факту не вернется (хотя вернется указатель, но он будет указывать в место на стеке, в котором уже нет вашей строки).
    3.2. Возвращать char*. Сейчас тип возвращаемого значения в вашей функции char - а это один символ, а не строка.
    4. Размер строки явно будет больше, чем size байт. На сколько больше - нельзя сказать заранее. Поэтому обычно выделяют достаточно большой буфер с запасом, чтоб покрыть все возможные варианты и при добавлении в буфер очередной подстроки контролируют размер буфера - чтоб оставалось место для очередной добавляемого куска и завершающего нулевого символа. Строка может быть равна size только в случае, если все числа в массиве будут состоять из одной десятичной цифры. Да и в этом случае требуется дополнительный байт на нулевой символ. Так что минимальный размер буфера должен быть size+1, реально он должен быть еще больше.
    Ответ написан
    Комментировать
  • Почему программа не показывает данные из serial порта?

    @dima20155
    you don't choose c++. It chooses you
    могу посоветовать:
    печатать не так:
    rx = serial.readLine()
    rxs = str(rx, 'utf-8').strip()
    data = rxs.split(',')
    print(data)


    А сразу так:
    rx = serial.readLine()
    print(rx)

    Если не поможет обратить вниманеие на пример pyqt QSerialPort
    Ответ написан
    Комментировать
  • Что это за деталь на схеме электрической цепи?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Предохранитель (fuse)
    Ответ написан
    3 комментария
  • Как переписать функцию с C на JS?

    Комментировать
  • Можно ли заменить разъём MicroUSB на USB Type-C?

    Ocelot
    @Ocelot
    1. Просто так снять micro и впаять на его место typeC не получится — посадочные площадки у этих разъёмов не совпадают.
    2. Нужно будет добавить резистор на линию CC, чтобы устройство определялось как slave и могло получать питание через typeC
    Ответ написан
    Комментировать
  • Как выводить русские символы в си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как это работает

    Поскольку русский -- не часть ASCII, работает это по-разному в зависимости от кодировки. Если предположить, что исходник в UTF-8, то русские символы закодированы двумя байтами, а %c выводит только один. Если на одном выведенном байте остановиться -- получится фигня с вопросом. Но если вывести подряд все байты многобайтового символа -- получится этот символ.

    как исправить

    вариантов несколько. Самый простой -- выводить строки целиком. Если надо выводить посимвольно, можно узнавать количество байт в представлении одного символа функцией mblen, типа того:
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
      char *a = "Привет, мир";
      int s;
      setlocale(LC_ALL, "");
      for (; *a != '\0'; a+=s) {
        s = mblen(a, strlen(a));
        printf("%.*s-", s, a);
        }
        return 0;
    }

    Здесь setlocale нужен для того, чтобы mblen понял, в какой кодировке символы на входе. Локаль в момент выполнения должна быть совместимой с кодировкой исходника в момент компиляции, если это условие не выполняется, работать будет неправильно.

    Ещё вариант -- работать не с многобайтовой кодировкой а с wchar_t:
    #include <locale.h>
    #include <stdio.h>
    #include <stddef.h>
    
    int main() {
      wchar_t *a = L"Привет, мир";
      setlocale(LC_ALL, "");
      for (; *a != '\0'; a++) {
        printf("%lc-", *a);
        }
        return 0;
    }

    Здесь setlocale нужен для другого: он говорит внутренностям printf в какую локаль выполняется вывод чтобы в неё конвертировать wchar_t. Если локаль во время выполнения не будет соответствовать кодировке исходника, код всё равно будет работать.
    Ответ написан
    2 комментария
  • Как подключить еще несколько words к GForth?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Скорее всего надо просто заинклюдить файл с определениями либо подключить словарь с этим словами, если они в отдельном словаре.
    Ответ написан
    4 комментария
  • Не могу вывести Hello в консоль?

    @dima20155
    you don't choose c++. It chooses you
    Вы работаете в VS IDE и у вас, видимо, в другом файле в вашем проекте уже определена функция main.
    Самый простой выход - создайте пустой проект (а не консольный) и напишите ваш код
    Ответ написан
    Комментировать
  • Существуют логические элементы электроники в типовых корпусах?

    @pfg21
    ex-турист
    КАНЕЧНА !!
    176 серия логических элементов на КМОП-транзисторах, а также ее последователи 561 564 и т.д.
    аналог западная серия 4000

    155 серия логических элементов на ТТЛ и ее последователи 531 533 555 и т.д.
    аналог западная серия микросхем 7400
    Ответ написан
    Комментировать
  • Какую выбрать СУБД, если в день может быть более 11млн записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    11 миллионов inserts в день - это 127 в секунду. При такой нагрузке справится любая современная БД. Ну я не знаю таких чтоб не справлялись. Делайте только короткую буферизацию и batch-insert пачками по 100 - 1000 чтобы оптимизировать сетевой roundtrip.

    Есть специализированные NoSQL системы такие как RocksDb, Tarantool в которых именно много оптимизаций сделано было для быстрой вставки. Они выдерживают и во много раз быстрее.

    И в данной задаче нужно также спросить бизнес - как быстро данные нужны к чтению пользователя. Нужно сию секунду чтоб они отобразились на UI или можно подождать пару минут или часов.
    Ответ написан
    1 комментарий
  • Как нарисовать конус в opengl?

    Посмотрите этот пример.
    Ответ написан
    Комментировать
  • Как переделать код под ООП?

    sheerluck
    @sheerluck
    #include <iostream>
    #include <vector>
    
    class Data
    {
        private:
            std::vector<int> elements;
            std::size_t N;
    
        public:
            explicit Data(const std::size_t size)
                : N{size}
            {
                elements.reserve(size);
                elements.resize(size);
            }
            void fill()
            {
                std::cout << "Enter elements of array:" << std::endl;
                auto index = std::size_t{};
                for (auto &elem : elements)
                    std::cin >> elements.at(index++);
            }
            void process(const int x)
            {
                if (x == elements.at(0))
                {
                    elements.at(0) = elements.at(N - 1);
                    elements.at(N - 1) = x;
                    std::cout << "Array after swapping first and last elements: ";
                    for (const auto &elem : elements)
                        std::cout << elem << " ";
                }
                else
                    std::cout << "Error";
            }
    };
    
    int main()
    {
        auto x = int{};
        auto n = std::size_t{};
        std::cout << "Enter x: ";
        std::cin >> x;
        std::cout << "Enter Number of array elements: ";
        std::cin >> n;
        auto data = Data{n};
        data.fill();
        data.process(x);
        return 0;
    }
    Ответ написан
    2 комментария
  • Почему условие работает не правильно?

    @kalapanga
    = это оператор присваивания, а оператор проверки на равенство ==
    Ответ написан
    2 комментария
  • Как в структуре обьявить ссылку на структуру в С arduino?

    RiseOfDeath
    @RiseOfDeath
    Диванный эксперт.
    Так у вас в структуре две переменные с одинаковым именем, на что компилятор и ругается.
    bool submenu;  
    struct menu *submenu;
    Ответ написан
    1 комментарий
  • Указатели в языке Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Вмешалась ОС? Но если так, то почему?

    Потому что классическая ошибка - использование неинициализированного указателя. Ты обьявил a указателем на целое, но не присвоил ему никакого значения (через malloc(), calloc() или функции, возвращающие указатель). Обьявленная переменная была выделена в куче и получила какое-то мусорное значение, доступное твоей программе (вполне может быть указатель на часть кода, например, на ядро, на общие функции). Ты его прочитал.
    При попытке записать по данному адресу поймал SIGSEGV, потому что данный адрес твоей программе по записи недоступен. Все, как должно быть.
    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Теоретически можешь, но практически ось тебе сразу выдаст SIGSEGV, потому что писать ты можешь только в те области памяти, которые тебе доступны по записи.
    warning: initialization of 'int *' from 'int' makes pointer from integer without a cast

    Ну правильно говорит - инициализация делается без приведения типа. Такой финт ушами часто делают со строками - по умолчанию выставляя там указатель на NULL (что обычно означает, что строке еще не выделялась память), напрмер
    char *str = (char *) NULL;
    Ответ написан
    Комментировать
  • Указатели в языке Си?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему программа завершилась? Вмешалась ОС? Но если так, то почему?

    Потому что у тебя был неинициализированный указатель, который по стечению обстоятельств указывал в область памяти которую можно читать (мы это знаем, поскольку ты смог оттуда прочитать значение) но нельзя изменять (поскольку ну ты понял).

    Почему я не могу поменять значение самого указателя (ведь указатель - это всего лишь ссылка на адрес памяти, а не на значение).

    Значение указателя ты поменять можешь, но это не то, что было написано в коде. В коде было написано поменять значение на которое указатель указывает. Поменять указатель было бы a = (int *)10;

    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Можешь, но под ОС с виртуальной памятью это в большинстве случаев не имеет смысла. API в таких ОС обычно устроены так, что ты просишь выделить область памяти с заданными характеристиками, а ОС выполняет выделение и возвращает тебе адрес выделенного участка.

    получаю ошибку, ведь вряд ли адрес памяти у указателя хранится в виде 16-ричного целочисленного литерала.

    В памяти всё хранится как последовательность байтов. Любую последовательность байтов можно проинтерпретировать как указатель. Но чтобы компилятор С понял что ты имеешь в виду, ему надо явно сказать, что ты хочешь проинтерпретировать целое число как адрес: int *a = (int *)0x0061FF18;
    Ответ написан
    Комментировать
  • Как при http запросе curl не выводить ничего в консоль?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    как выполнить запрос и не выводить ничего в консоль?

    Если результат запроса надо сохранить -- то открыть файл на запись и передать полученный указатель в CURLOPT_WRITEDATA. Если сохранять не надо -- установить функцию, которая будет игнорировать передаваемые ей для записи данные в CURLOPT_WRITEFUNCTION.
    Ответ написан
    Комментировать
  • Как сделать, чтобы при нажатии кнопки выводился текст на дисплей?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Откройте пример для работы с дисплеем. Останется только добавить один if для обработки кнопки.
    Ответ написан
    Комментировать