Ответы пользователя по тегу C
  • Как завершить все потоки сразу после завершения одного из потоков в си, используя толлько pthread_detach и pthread_join?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вызвать exit какой-нибудь, то программа завершится и система прибъет все потоки.
    Ответ написан
  • Как сделать сортировку двухмерного массива по столбцам?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Работайте с массивом как с одномерным. Занумеруйте его так: первые индексы - это первый столбец сверху вниз. Потом идут индексы с ячейками второго столбца и т.д.

    Вам осталось по одному числу - индексу в этом виртуальном одномерном массиве получать индексы исходного двумерного массива.

    Номер столбца будет i / M, Где M - количество строк. Номер строки будет i % M.

    Вам надо только написать алгоритм сортировки одномерного массива и везде, где там идет обращение к [i], вам надо сделать [i % M][i / M].
    Ответ написан
  • Как использовать socket в gcc на windows?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы используете cygwin для компиляции, то можно и линуксовый socket использовать. Будет чуть менее эффективно из-за фактически эмуляции posix api.

    Ну или, если через visual studio компилируете, то используйте winsocket API
    Ответ написан
    Комментировать
  • Почему после вызова Message Box, GetKeyState() не считывает состояние клавиши?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Диалоговое окно-то появляется?

    Я подозреваю, что MessageBox возвращает 0, что происходит происходит при ошибке:
    If the function fails, the return value is zero.


    Поэтому цикл while завершается. Т.е. проблема не с GetKeyState, а логикой программы.
    Ответ написан
  • Как копировать список в си (C)?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Пройтись по списку, добавляя элементы в конец нового списка.
    Только не надо использовать вашу функцию add - она каждый раз проходится по всему списку. Заведите отдельную переменную, которая будет указывать на конец создаваемого списка и добавляйте новый элемент к ней.
    Ответ написан
    Комментировать
  • Что делать если при отладке сработала точка останова по исключению?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    char str = 0, *pStr = &str;

    Очень, очень не правильно так делать. Строка - это массив char в памяти. Указатель указывает на начало этого куска в пямяти. Вы же берете одну переменную, и потом работаете с ней как с массивом.

    Надо выделять память под строку. Или статический массив, или malloc.
    Ответ написан
    Комментировать
  • Почему при копировании файлов получаются битые файлы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Аккуратно выведите куда-нибудь параметры, которые вы передаете в функцию создания symlink.

    Похоже, проблема в том, что вы передаете относительные, а не абсолютные пути в качестве цели для линка.
    При использовании функции копирования это, возможно, и не будет проблемой.
    Ответ написан
    8 комментариев
  • Как занести в char int?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Используйте sprintf. Только сначала выделите достаточно памяти под строку.

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

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Да, конечно. Начиная от wingdi и заканчивая directx - Это все стандартные виндовые библиотеки.
    Ответ написан
    3 комментария
  • Имитация ООП в C, где ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    int self_addr = here-2*int_size;
    point *self = self_addr;


    Это что вообще такое?! Объясните, что вы пытались тут сделать вообще.

    Для имитации ООП надо в структуре иметь указатель на функцию, который надо инициализировать, внезапно, указателем на функцию, например, вот так:
    ret.tochar = &ToCharFunc.

    Сама функция должна помимо обычных параметров еще и принимать указатель на объект, с которым вы хотите работать.
    Ответ написан
  • Какой получится результат псевдокода на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Переведите это, допустим, на C++ и скормите любому онлайн компилятору, если у вас на компе ничего не установлено.
    Ответ написан
    Комментировать
  • Как будет выглядеть данный псевдокод в коде на языке Си?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вижу несколько проблем. Во-первых, проставьте фигурные скобки ко всем циклам. И отступы поставьте аккуратно (открывающая скобка - +отступ, закрывающяя - -отступ). У вас сейчас инструкции, которые вы думаете в цикле - они вне его.

    Во-вторых, вот это что такое вообще? return flag=1;
    Ответ написан
    3 комментария
  • Как написать на СИ программу, которая выделяет числа из строк?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Напишите функцию, которая начиная с заданного индекса выделяет в строке число и возвращает индекс конца числа. Эта функция состоит из тупо одного while, который проверяет, а не символ или конце строки текущий символ.

    Сама программа идет по строке, если видит, что текущий символ - цифра, то запускает функцию выше. Потом выводит от текущего до найденного символа, потом сдвигает текущий индекс на конец числа. Лучше делать while. Внутри вы или увеличиваете индекс на 1, если текущий символ - не цифра, или сдвигаете его на конец найденного числа.
    Ответ написан
    Комментировать
  • Segmentation fault (core dumped) как пофиксить?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Пройдитесь по коду отладчиком. Ну, или добавьте отладочный вывод: например, в начале цикла while и цикла for выводите, что происходит итерация цикла и переменные c,i такие-то.

    Вы быстро заметите, что у вас цикл по for выполняется на первом же символе более 100 раз. Посмотрите в свой код, подумайте, почему так происходит.
    Ответ написан
    Комментировать
  • В чем ошибка в написанном коде, в 5 строке?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Воткните эту фразу в гугл транслейт. Там все понятно написано. Нельзя объявлять переменную прямо в цикле (int i) в том режиме, в котором у вас работает компилятор. Надо что-то в свойствах IDE поковырять и включить режим C99.

    Ну, или объявляйте переменную i до цикла.
    Ответ написан
    2 комментария
  • Самый эффективный способ поиска последовательности нулевых байт?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Самый эффективный способ - использовать SIMD инструкции (какой-нибудь _mm256_cmpeq_epi8 и хитрую битовую арифметику вроде _mm256_movemask_epi8 и подобных над результатом).

    Надо считать длину последовательности из нулей в начале и в конце блока и помнить длину последовательности заканчивающейся в конце предыдущего блока и продолжать ее в текущий блок.

    Если вы ищите короткую последовательность, то еще нужно прверить, что в текущем болке она встречается. Например, чтобы проверить, что в битовой маске М есть последовательность из 5 бит, можно проверить, что (M & M >> 1) && ((M & M >> 1) >> 2) & M >> 4 имеет ненулевые биты. Достаточно log k сдвигов и битовых И для поиска последовательности из K ненулевых бит.

    Но вряд ли вы будете с этим возиться. Следующий вариант - эмулировать SIMD руками в int64. Читайте из памяти по 8 байт (через memcpy в int64) и там уже проверяйте через LSB/MSB сколько нулевых байт на конце, в начале. Чуть сложнее, если вам надо искать последовательность короче восьми байт. Тогда надо еще отдельно проверить через битовые сдвиги, есть ли она внутри блока из 8 байт.

    Дальше, есть какой-то ненулевой шанс, что memmem именно вариант выше и реализует, но это вряд ли. Я думаю ваш случай достаточно частен и ручная реализация будет быстрее.
    Ответ написан
    Комментировать
  • Почему не читаются данные при вводе из файла?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Скорее всего ошибка в файлах. Они наывазются не так, как вы передаете в параметрах, или находятся в другой директории, или пусты. А правильный текст вы видите в другом файле. Перепроверьте еще раз все названия. Или там первая строчка пустая.
    Ответ написан
    2 комментария
  • На чём написан язык программирования C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Учтите, что язык программирования - это просто набор спецификаций и правил. Он написан на английском языке.

    Если же вас интересует на чем запрограммированы компиляторы языка С, то самые популярные нынче развивающиеся компиляторы написаны на C и C++ соответственно:
    gcc: https://github.com/gcc-mirror/gcc
    clang: https://github.com/llvm/llvm-project/tree/main/clang

    Вы спросите, а как компилятор языка Си написали на самом Си? Ответ прост - первые компиляторы были написаны на ассемблере. Они были очень простыми и тупыми, возможно не умели понимать все тонкости языка. Когда появился достаточно работающий компилятор с минимальным набором функций, можно было переписать его на Cи и скомпилировать первым компилятором. После этого стало можно компилировать компилятор на Си самим собой.

    Точно также в компиляторы добавляют новые возможности языка - реализуют код компиляции этих вещей без их использования в исходниках и получают компилятор, который умеет их компилировать. Потом можно исходный код компилятора переписать с использованием этих новых функций, используя полученный ранее исполняемый файл компилятора.

    А так, наверно, есть куча неподдерживаемых устаревших компиляторов Си на всевозможных языках.
    Ответ написан
    2 комментария
  • Как удалить из предложения слова, в которых нет указанной буквы?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если бы вы использовали нормальные имена переменных, то вам бы сразу стало очевидно, какую одну строчку (даже один символ!) надо изменить, чтобы стали удалятся слова без буквы, вместо слов с буквами.

    Подумайте, что хранится в переменной g - что она означает, какой ее физический смысл, какие значения и при каких условиях она принимает?
    Ответ написан
    Комментировать
  • Как сделать компилятор СИ на джаве?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Вы уверены? Создать компилятор Си с нуля, даже очень тривиальный, даже используя всякие генераторы парсеров - это несколько месяцев работы целой команды специалистов.

    Нужно понимать ассемблер, иметь знания по теории компиляторов (есть много книг), теории языков.

    Если же вам надо просто прикрутить компиляцию к вашему редактору, то, как многие другие IDE, вам надо будет лишь запускать сторонний компилятор (будь то gcc, clang, visual studio или что-то другое).

    У всех них есть консольное приложение которому можно передать файлы в качестве аргументов в коммандной строке. Вам остается лишь разобраться, как запускать приложения на Java.
    Ответ написан
    3 комментария