• Можно ли в python читать файл через строку?

    @abcd0x00
    stamdyscias: если в список заносишь, то можешь сделать срез с шагом
    >>> ['a', 'b', 'c', 'd', 'e'][::2]
    ['a', 'c', 'e']
    >>>

    но в список не принято заносить файл, так как файл может оказаться огромным и оперативной памяти не хватит на него, он начнёт свопиться на диск и в итоге всё замедлится и повиснет.
  • Как решать олимпиадные задачи по программированию?

    @abcd0x00
    Ilias: ты её переносишь на потом, чтобы потом с ней разобраться. Если ты её не перенесёшь, то она будет тормозить решение остальных задач, которые вполне решаются без проблем и добавляют опыт. Но ты её и не выкидываешь, потому что если ты её решить не можешь, значит не умеешь в её области, а если не умеешь, то надо учиться, иначе потом опять с этим столкнёшься, только уже не в учебных задачах, а в реальной.
  • Как решать олимпиадные задачи по программированию?

    @abcd0x00
    Ilias: и тогда у тебя не будет вопросов бросать всё сейчас и читать теорию или задачу бросать, а потом не вспомнить, где она.
  • Как решать олимпиадные задачи по программированию?

    @abcd0x00
    Ilias: у тебя должен быть локальный учёт задач, которые ты проходишь. Ты туда переносишь информацию по каждой задаче. А потом если ты её не можешь решить, ты себе пишешь туда, что ты её не решил и почему ты её не решил и на какое время ты хочешь её вперёд перенести (на пять дней, например). А потом ты должен всегда видеть, какие задачи у тебя получились и какие у тебя не получились.
  • Что означает char **s на языке Си?

    @abcd0x00
    slavapegaskin: в идеале, если он хочет сделать абстрактную функцию вывода, которая как-то выводит структуру, то он вообще должен подавать не строку формата, а вообще функцию форматирования. И вот в ней уже можно сидеть, ковырять там эту структуру, как хочешь. Но у него нету ничего такого, просто какой-то шлак несуразный.
  • Что означает char **s на языке Си?

    @abcd0x00
    slavapegaskin: ну, тебе и говорят, что там это преобразование нафиг не нужно. Ты спрашиваешь про функцию, которая по-тупому сделана. Зачем тебе это выяснять? Можно много всего тупого написать и кучу загадок из этого сделать.

    Сама функция сделана для того, чтобы выводить значения из струкуры в определённом виде отформатированном. Форматирование вида проводится через строку символов всегда (общепринято так). Тогда какой смысл там делать общий указатель, если всегда строка будет передаваться?

    Допустим, он передаёт не строку, а какой-нибудь другой объект, типа умную структуру какую-то, которая знает о каком-то форматировании. Но это тогда противоречит обычным принципам сцепления модулей. То есть он усложнил то, что должно быть просто (он должен достать значения из этой структуры снаружи, сделать из них простую строку форматирования и её подать).

    Так что в любом случае это хрень.
  • Как передать int/float через recv?

    @abcd0x00
    15432: я встречал разные int'ы (16, 32, 64), нельзя вообще на его размер полагаться (стандарт о размерах ничего не пишет, у него относительный размер, сравнимый с размерами других типов только). Но даже если немножко полагаться на какой-то конкретный размер, нельзя представлять его равным long int, потому что он колеблется между short int и long int равнозначно и запросто может оказаться short int, коим он и принимается, когда пишешь программу (держи в голове short int). А чему равен short int, когда long int равен 64 бита? Вот ты и не знаешь - толи 32 толи 16.
  • Как передать int/float через recv?

    @abcd0x00
    Можно и свою сериализацию придумать. Главное, чтобы оно точно преобразовывалось туда и обратно.
  • Как передать int/float через recv?

    @abcd0x00
    Не, это неправильно, потому что размер int на разных компах может быть разный. А есть ещё эндианство, которое так же может различаться. Но при одинаковом эндианстве уже на размере можешь получить ошибку.
  • Что означает char **s на языке Си?

    @abcd0x00
    slavapegaskin: первую функцию какой-то тупень написал. Там не нужно передавать указатель на void, потому что там передаётся форматная строка одного и того же типа при любом вызове, поэтому должно стоять (const char *).
  • Что означает char **s на языке Си?

    @abcd0x00
    slavapegaskin: code ставь в угловых скобках, а не квадратных.

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

    В частности функция scmp(), которую ты привёл, - это классический вариант функции сравнения, пригодной для подачи в стандартную функцию qsort() языка C. Функция qsort() сделана в общем виде, поэтому может сортировать любые объекты (строки, числа, структуры, указатели и другие вещи). Но чтобы сортировать эти объекты, ей нужна функция сравнения, которая знает, как определить какой объект больше какого, какой объект меньше какого и какие объекты вообще считаются равными. Поэтому пишется такая функция сравнения, которая подаётся (указатель на функцию) в функцию qsort(), которая уже внутри в эту функцию сравнения подаёт каждые два объекта, чтобы сравнить их. Но так как объекты неизвестные, то подаёт она просто указатели на них в виде указателей на void, а дальше функция сравнения внутри себя уже превращает их из неизвестных объектов в известные, сравнивает между собой и возвращает обратно в qsort() результат этого сравнения, по которому qsort() понимает, нужно ли переставлять эти неизвестные для неё объекты (у них известны только адреса и размер).

    Так вот смотри, почему двойной указатель там - потому что так эти объекты устроены, она сортирует указатели на указатели на строки, но сравнивает для этого она не указатели на указатели на строки, а сами строки. Такое часто делают, когда у тебя указатели на строки сохраняются в массив указателей, а потом ты этот массив сортируешь. То есть строки где-то хранятся, на них устанавливаются указатели. Потом эти указатели записываются в массив. А потом этот массив указателей сортируется (переставляются указатели в массиве относительно друг друга). И получается, что у тебя строки лежат там же, где и лежали (не нужно тратить на них время по их перемещению), но при этом у тебя есть отсортированный массив указателей на эти строки и ты можешь эти строки вывести в алфавитном порядке, хотя лежат они в памяти в разбросанном виде. Вот потому он двойной там: чтобы сравнить строки, нужно от этих указателей спуститься к этим строкам.
  • Как UTF-8 помещается в char?

    @abcd0x00
    Дмитрий:
    // вот вам пример крутой поддержки юникода от авторов самого посещаемого ИТ ресурса рунета, очень смешно

    Да что тут, что на Хабре очень много косяков алгоритмических, что говорит о том, что они сами мало что пишут, а если и пишут, то пишут безграмотно. Например, в теге code вырезаются лишние пробелы и другие замены происходят, что является существенным косяком, так как тег code для того и существует на всех форумах, чтобы точно передавать содержимое, защитив его от какой-либо обработки. Вот статьи на Хабре так и пишутся: чтобы точно передать содержимое, нельзя его просто вставить в тег code или source, надо сидеть и xmlcharref'ы вставлять (чуть ли не 90-е вспоминаются, когда ручное редактирование html было основным занятием). Но они web-программисты, им можно не шарить в алгоритмах глубоко и интуитивно.

    Вот я сейчас набираю это сообщение думаешь где? Прямо здесь? Хрен там, сижу в соседнем вопросе (вообще левом) и там в неотвеченном месте набираю сообщение по одной простой причине - там есть кнопка "предпросмотр" и кнопки тегов кода и квотирования, хотя это всё должно быть в этих маленьких ответах, а нету их, а чтобы поставить кнопки, надо мозгами пораскинуть, а мозги думать не привыкли. Web-программирование - оно и есть web-программирование. То же самое со спойлерами: если в ответах они работают (хотя кнопки нет и многие вообще не знают, что спойлеры можно делать на тостере), то в маленьких ответах они даже не сворачиваются по дефолту, но их можно нажимать и они сворачиваются тогда. И такие мелкие косяки, неудобные для общения, их дофига здесь, но никто их не исправляет, потому что это сложно, это нельзя просто взять, что-то доустановить на движок и чтобы оно работало. Вот и всё.

    ВНЕЗАПНО, VS выдаст 8(восемь!)

    VS - это не полноценный компилятор, он может нарушать стандарт и он не поддерживает даже уже ставшие старыми стандарты, например C99, а о C11 вообще речи не идёт. Мало того, он пытается пользователей пересадить на свои якобы безопасные функции вывода, что очень сбивает людей, которые плохо знают суть C. Сам же компилятор имеет ошибки ещё. Я одну нашёл - это разделение пространств для названий меток структур и имён переменных внутри структур. Она не давала скомпилировать то, что должно компилироваться по стандарту C89 (хотя официально поддерживает его). Если метка структуры называлась так же, как и переменная в структуре, там была коллизия, которой не должно быть, так как в стандарте эти пространства имён разделены и метки никак не сталкиваются с именами переменных.
    Это должно работать по стандарту:
    struct x { int x; } x;
    Там же оно не компилировалось, говорило мол ошибка. Пришлось тогда полпрограммы переименовывать, которая была нормально написана, просто из-за этого бага не хотела под винду компилиться (там GUI использовался, поэтому VS была компилятором).

    Так что, если в VS что-то не работает, я на это внимание не обращаю. Не велика птица.

    а гцц и клэнг верно выдают 4.

    Ну, выдают, потому что правильные компиляторы - соблюдающие стандарт.

    Даже если в C что-то не реализовано, это можно дописать, скорее всего. Не так уж это сложно сделать, особенно тогда, когда не нужен полный функционал. Пишется просто подмножество преобразований, ты потом ставишь это в программу, а потом даже не помнишь, что писал что-то сам, что оно неполное и так далее.
  • Как UTF-8 помещается в char?

    @abcd0x00
    Дмитрий:
    Определить — символ это или цифра, думаю, Си в состоянии, но не более того.

    Ты говорил, что невозможно найти длину строки в UTF-8. Возможно найти длину строки. Надо просто перегнать байтовые в ширкосимвольные и применить wcslen().
    #include <wchar.h>
    
    size_t wcslen(const wchar_t *s);


    Да, пример достаточно надуманный просто для стёба. Понятно, что в ненормализованной форме никто юникод не сравнивает, и в базах обычно хранится какой-нибудь NFC, но весь к этому NFC ещё как-то надо привести? Либо писать свой костыль на тысячи строк, либо брать готовую библиотеку, которые пишут уже не один десяток лет.

    По твоему примеру ясно, что ты просто (по-простому) писать не умеешь ничего. Что ты пытаешься показать, что "й" невозможно сравнить с "й"? Возможно их сравнить. И с чего ты взял, что прямая "й" и составная "й" должны быть равными? Если ты не в курсе, они даже выглядят по-разному, когда их делаешь. Просто человеку нужно сообщить типа "смотри, это буква "й", а не какая-то другая". Так что я думаю, ты просто придумываешь какую-то хрень, потому что не хочешь разбираться точно, так как со своей C++-фанатичностью ты не привык к ясным и понятным материалам, так как для C++ это не свойственно, там везде бардак и куча ненужного.
  • Как UTF-8 помещается в char?

    @abcd0x00
    Дмитрий:
    Локали прописать? Что-то я не помню адекватной поддержки нормализации юникода в STL.

    В каком STL, ты не видишь, что мы в разделе по C находимся? А ты их не разделяешь, потому что ты знаток "языка" C/C++. Поэтому я тебе и говорю "раздели эти языки для себя, пока не поздно, иначе случится непоправимое". У них разная разработка и разные люди ими занимаются.

    Можно ссылочки на гитхаб, пожалуйста?

    https://github.com
    https://github.com
    https://github.com
    Не благодари.

    #include <stdio.h>
    #include <locale.h>
    #include <wchar.h>
    #include <wctype.h>
    
    int main(void)
    {
        wint_t wc;
    
        setlocale(LC_ALL, "ru_RU.UTF-8");
    
    #if 1
        wc = L'ẞ';
        wprintf(L"Проверка показывает, что символ <%lc>:\n", wc);
        wprintf(L"Алфавитный: %ls\n", iswalpha(wc) ? L"да" : L"нет");
        wprintf(L"  Цифровой: %ls\n", iswdigit(wc) ? L"да" : L"нет");
        wprintf(L"    Нижний: %ls\n", iswlower(wc) ? L"да" : L"нет");
        wprintf(L"   Верхний: %ls\n", iswupper(wc) ? L"да" : L"нет");
        wprintf(L"Преобразование регистра <%lc>:\n", wc);
        wprintf(L"  В нижний: <%lc>\n", towlower(wc));
        wprintf(L" В верхний: <%lc>\n", towupper(wc));
    #endif
    
        return 0;
    }


    [guest@localhost wchar]$ gcc -std=c99 -Wall utf8.c -o utf8 
    [guest@localhost wchar]$ ./utf8 
    Проверка показывает, что символ <ẞ>:
    Алфавитный: да
      Цифровой: нет
        Нижний: нет
       Верхний: да
    Преобразование регистра <ẞ>:
      В нижний: <ß>
     В верхний: <ẞ>
    [guest@localhost wchar]$


    Вы в курсе, что реализация wchar_t у винды не соответствует стандарту ISO/IEC 10646 с бородатейших времён и до сих пор

    У винды что-то не соответствует стандарту? У компилятора может не соответствовать, но это вообще не аргумент, чтобы продолжать им пользоваться. Если он нарушает стандарт языка, нафиг он нужен тогда вообще. Вот у тебя вторая смесь - винда/компилятор винды.

    соответственно, ни о какой переносимости кода речи быть не может

    Ты, походу, вообще не понимаешь, для чего стандартизируются языки (и не только языки, а вообще всё). Объекты стандартизуются для того, чтобы быть одинаковыми при любом анализе или синтезе. Поэтому, если кто-то нарушает стандарт, то он реализует язык не в полной мере, потому полноценным компилятором языка его считать нельзя.

    А авторов, в своё время, да, читал, никому неизвестного фреймворка Qt, твиттера, Trello, ICU, Boost и прочих неизвестных вещей.

    Не надо читать блоги, в них никто не несёт ответственности за слова. Ошибётся или бла-бла-бла какое-то будет, он тебе скажет "а это же просто блог, я там могу и ошибаться".

    www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (6.10.8, _ _STDC_ISO_10646_ _)

    wiki. что такое 10646
    И вообще, с чего ты взял, что этот стандарт (C99) относится к C++ как-то? Ты, наверное, не в курсе, но C++ был связан с C только до стандарта ANSI C89. Дальше там всё по-разному идёт. А у тебя из-за каши и получается, что C++ какие-то свои особенности переносит в C99.

    В общем, по ссылкам на списки расссылок, где один говорит одно, а другой - другое, я понял, откуда у тебя каша в голове. И хочу тебе сказать: не слушай, что говорят люди, читай официальные документы.
  • Что означает char **s на языке Си?

    @abcd0x00
    Антон Жилин: то, что он указывает на символ в строке, заканчивающейся нулём, - это очень сильно притянуто за уши, даже если рассматривать с практической стороны (типа как это чаще всего бывает на практике). Да и массив указателей - это тоже далеко не всегда. Бывает такое, что надо в функцию передать указатель таким образом, чтобы его можно было в её вызове заменить и это сохранилось после её вызова. Такое часто бывает, когда ты делаешь функцию для выделения памяти через malloc(), но сама функция должна возвращать какую-то информацию (код ошибки в виде целого числа), а не выделенную память или NULL. В общем, он спрашивает (значит, не знает ничего) - надо говорить конкретно, что это указатель на указатель и всё, иначе он неправильно запомнит.
  • Как UTF-8 помещается в char?

    @abcd0x00
    Дмитрий:
    Ну, вы можете, конечно, запихнуть UTF-8 поток в массив char'ов, но ни одна нативная функция для работы со строками не будет с ним работать правильно. Даже длину строки никогда не сможет посчитать.

    Там надо правильно локаль привязать и всё будет работать.

    А учитывая, что язык Си изначально разрабатывался учёными для учёных

    Это ты где начитался? Си разрабатывался для переносимости UNIX между разными аппаратными архитектурами.

    Поэтому, ответ прост: в C/C++ для работы с UTF8 используйте стороннюю библиотеку.

    Для начала раздели у себя в голове C и C++ - это два разных языка, смесь из которых обычно превращается в кашу, далёкую от реальности.

    wchar_t это тупо костыль в дизайне языка, который признали даже создатели этих языков.

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

    Кириллица занимает 16-битный диапазон, в 8 бит она не поместится.

    Во-во, ты совсем не ориентируешь, где и что. Какой-то набор слов, далёкий от реальности.

    Просто, однажды приняли, что он подходит для хранения позиций однобайтовых кодировок типа ASCII, ибо других на то время просто не существовало.

    Тогда существовало много чего.

    Алан Кабисов: в общем он тебе втирает изрядно, не понимая конкретно, где и что. Где-то чего-то начитался, то пишет нормально, то туфту какую-то выдаёт из непонятно откуда, требуй с него ссылки, иначе он тебе инфой из блогостатей от неизвестных авторов засрёт мозг.
  • Что означает char **s на языке Си?

    @abcd0x00
    char* - это по соглашению Си-строка, то есть указатель на буфер символов, оканчивающийся нулевым байтом '\0'.

    Это неверно. char * - это просто указатель на значение типа char и больше ничего.
  • Какие программисты мне нужны?

    @abcd0x00
    Олег:
    Касаемо языков, то прежде чем написать вопрос, самостоятельно его проробатывал и пришёл к выводу что вариантов для одной задачи масса.

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

    Пока я не понял каких приглашать программистов, что от них требовать.

    У тебя должно быть видение всех частей по отдельности. Потом каждую часть ты даёшь на реализацию отдельной команде специалистов. Для этого такой команде нужно дать техническое задание (ТЗ), в котором всё точно указано, что команда должна вернуть на выходе. И потом эти части, отдельные и независимые (команды могут не знать друг про друга даже), ты соединяешь в единую систему. Естественно, чтобы не делать это всё самому, у тебя должен быть специальный человек, который имеет опыт в такой работе (почему тебе и советуют найти директора). А пока что ты выполняешь эту функцию сам, но ТЗ ты не напишешь, так как в этом опыт надо иметь, иначе если неправильно его напишешь, то в конце тебе именно это и выдадут.

    Представь, что ты подключаешь принтер к компьютеру: компьютер сделан одними специалистами и у него есть аппаратный порт для подключения; принтер сделан другими специалистами и у него есть свой аппаратный порт для подключения (интерфейс); операционная система, которая понимает, как туда сюда сигналы передавать, сделана третьими специалистами; драйвер, который добавляется в операционную систему для правильного кодирования сигналов, сделан пятымыми специалистами. Все они друг друга не знают, просто каждый сделал своё дело. И потом сисадмин это всё соединяет, хотя сам не умеет ни принтеры делать, ни программы писать.
  • Что написано в строке указатель или ссылка?

    @abcd0x00
    Mercury13: что-то ты понаписал ерунды всякой. Почитай, как в лине работают с сетевыми адресами и почему так сделано.
  • Cron, wget и отгрызание части файла - почему опять стэк может не работать?

    @abcd0x00
    Крон работает под другим пользователем с собственными переменными среды. И даже PATH там свой. Поэтому если что-то не работает в кроне, то можно посмотреть его сообщения в /var/log, там обычно пишется статус команд.

    Но если совсем всё запущено, то можно выводить диагностику в файл /tmp/file.log (/tmp - это директория, к которой все имеют полный доступ). То есть делаешь копию скрипта, но в которой после каждого действия пишется инфа в этот файл, что действие выполнено.