Задать вопрос
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    Потому они и живы.

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

    @abcd0x00
    redakoc:
    Если ты проводишь над КОПИЕЙ то где твоя хваленая эффективность.

    Так копия там ТОЛЬКО тогда, когда это необходимо.
    В частности, при применении strtok(), которая вставляет нули вместо разделителей (ты бы хоть узнал, что это за функция, чтобы не спрашивать одно и то же по 500 раз), копия может и не создаваться.
    Есть работа с копией, есть работа без копии.

    Командная строка уже много лет как прекрасно нарезается готовыми библиотеками

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

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

    Ну, ты вообще никогда ничего не писал. Мышление, как у препода-теоретика обычного. Всё, что я тебе объясняю, я объясняю тебе потому, что ты этого не видишь. А не видишь, потому что не практикующий. В том же примере касаемо сети ты просто никогда не писал сетевых программ, иначе хорошо бы представлял протоколы, в которые паскалевские строки никак не вписываются. Там максимум похожее есть при передаче бинарных данных, но это не строки.
  • Что значит ошибка сегментирования при запуске qutim?

    @abcd0x00
    exXtaZzy: ну, ты поищи способ, лучше kopete мессенджеров под линь не найдёшь. qutim написан каким-то школьником.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc: я не терял символы, такие операции проводятся над копией строки либо строка уже использована и не нужна. Очень часто аргументы командной строки используют один раз за всё выполнение и вот их запросто так можно нарезать.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc: не, я просто прочитал это первее того, так как у тебя по двадцать ответов каждый раз и они в почте перемешиваются. CR и LF из другой оперы, текстовый файл ты с ними не сохранишь в память, а с нуль-символом сохранишь, потому что нуль-символ - бинарная тема. А если надо бинарник в памяти сохранять, то там уже размер используется. Так вот можно посчитать сколько сохраняется текстовых файлов и сколько бинарников. Тот же html весь текстовый.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    То есть ты даже НЕ ПОНИМАЕШЬ, что твой алгоритм нарезания строк вставкой 0 в середину подразумевает 2 операции, существенно снижающих производительность:

    А я не буду их сдвигать.

    Приведи здесь пример своего кода, реализующего твой "эффективный простой безсдвиговый" алгоритм:

    А ты не врубаешься, что мне строка de нафиг не нужна?
    Нужны только abc и ghi.
    Вот подумай сам, как из этого получить эти две подстроки.
    abcdefghij

    Я ставлю два указателя (да, ты не знал, что можно два ставить) на a и g.
    a + 3 = 0
    g + 3 = 0
    И всё. У меня теперь в этих указателях подстроки.
    Какой Паскаль там.
    А дальше я могу из них брать что? Правильно, я могу из них взять подстроки bc и gh.
    А вот ты будешь на Паскале очень долго там лазить, потому что тебе надо будет всегда помнить всю эту строку, где у ней там что начинается, какого она там размера и всё время что-то высчитывать в численном виде, чтобы в этих подстрочных размерах не ошибиться.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    2. Если вам нужно ОДИН раз УЗНАТЬ, но чтобы 100 раз ИСПОЛЬЗОВАТЬ, то все равно нужно ХРАНИТЬ то, что вы уже узнали.

    Я могу хранить это, пока это нужно. А когда это не нужно, я могу это удалить и сохранить туда что-нибудь другое. Так что это не одно и то же. Оно может и вообще мне не понадобиться. А у тебя оно будет всегда читать эту длину, потому что без неё нельзя понять, где строка заканчивается. И читать ты будешь по четыре байта всегда.

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

    2. Программа с строками стиля Паскаль, если ей по алгоритму этого не нужно, может прекрасно также НЕ ЧИТАТЬ уже определенную длину.

    Но хранить-то она его будет, и с каждой строкой, а строк - миллиард. То есть четыре гигабайта уйдёт только на размеры. Так что ты просто не видишь всей картины. За деревьями не видишь леса.
  • Администрирование Linux - актуально ли?

    @abcd0x00
    Владимир Олохтонов: статитка, не статика - неважно. Возьми Facebook, Instagram, любые неправительственные живые сайты, там баги редко найдёшь. Но когда ты не можешь пользоваться сайтом, потому что сломано что-то, - это халтура обычная.
    Вон опять новость, запретили рутрекер, министр говорит "мы запретили рутрекер", Медведев берёт и входит на рутрекер со своего телефона. Вот с таким вот министром такие же и менеджеры, которые отвечают за разработку электронного правительства. У них там только один там нормальный есть (Герман), который хотя бы что-то понимает.
  • Администрирование Linux - актуально ли?

    @abcd0x00
    Владимир Олохтонов:
    Вот ты дал мне ссылку на вики. Вот, знаешь, у меня не возникает вопроса, смогу ли я её прочитать. Почему? Потому что сайт вики сделан хорошо.
    А когда вот этот сайт выпустили и отчитались ещё перед Медведевым, что всё готово, тот сразу решил проверить, но оказалось, что сайт вообще не работает.
    Это называется как?
  • Администрирование Linux - актуально ли?

    @abcd0x00
    Владимир Олохтонов:
    Над ним работало и работает очень много народу

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

    основаны на незнании предметной области

    Давай тебя будем штрафовать за каждую ошибку, из-за которой пострадал какой-нибудь пенсионер, который не смог взять талон куда-нибудь. Ты же знаешь предметную область, значит должен отвечать.
  • Администрирование Linux - актуально ли?

    @abcd0x00
    Владимир Олохтонов: ты можешь, конечно, читать википедию, вместо того чтобы пользоваться сайтом. Но у меня множество примеров обычных пользователей, у которых сайт "выдаёт какую-то ошибку". Что это за сайт, на котором обычный пользователь может легко ошибку получить?
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    Просто прочитать длину строки (1-2-4 байта)
    Просто найти конец строки 0 в строке "hello, world" = прочитать 15 байт, дурачина.

    И когда ты прочитал длину строки, ты радостный остался с этим знанием длины, а строку читать не стал?
    Проталкиваешь фуфло. Ты точно так же будешь читать свою строку.

    Длина строки (или другим способом определить ее окончание) нужна в подавляющем большинстве случаев:

    Читать/писать надо строку в подавляющем большинстве случаев.

    Вставка в середину (чтобы быть уверенным что не выходишь за пределы строки),

    Вставка - не такая уж частая операция. Но длину можно узнать ОДИН раз, а потом сто раз использовать, а не хранить её ВСЕГДА рядом, занимая память под это.

    Поиск в строке,

    Что поиск в строке? Поиск с конца только различается, если по маркеру или по известной длине сравнивать.

    Не надо. В Паскале также передается ТОЛЬКО адрес начала.

    Ну, достижение, значит. Это огромный плюс, что он передаёт только адрес (ссылку), а потом 100500 раз читает размер.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    0 в конце подразумевает линейный перебор в поисках конца.

    То есть, по-твоему, кто сделал такие строки, - это просто дебилы. Один ты умник.
    Да, оно подразумевает линейный перебор, и все это знают и всегда знали.

    В БД и файловой системы индексы используются, иначе они работают неприемлимо долго.

    Речь про хранение идёт. Ты предлагаешь хранить длину рядом с каждой строкой, потому что другого варианта нет.
    То есть к индексами добавляется и длина эта.
    Или ты ещё пуще пошёл и длину сохранил в индекс, чтобы ещё веселее было.

    А при наличие индекса ноль в конце уже не нужен.

    Да, походу, так и есть, ты предлагаешь индексировать на пустом месте. То есть жрать память попусту.

    Все эти вещи давно уже в библиотеках да в компилятор встроены.

    Какие вещи? Определение длины строки?

    А как ты там файлы искать будешь?

    По адресу в адресном пространстве.

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

    А кто тебе сказал, что на любой файловой системе должен быть каталог?
    Узлы должны быть, каталоги - если нужно только.

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

    Там же маркер в конце, забыл? Дурилка ты картонная.
    Что ты хочешь сказать, что я не могу для строки правильно выделить память до сохранения?

    Как раз наборот, дурачок.

    Дурачок-то пока что ты здесь тут.

    При разрезании строки твоим методом вставки нуля в середину - нужно СДВИГАТЬ всю последующую часть строки на один байт.

    Епать, а strtok() что делает? Значит, ты просто не знаешь, как работает strtok(), раз такую ахинею пронёс.
    Строка меняется, цель - получить подстроку.

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

    Позволяет, конечно, но нахрен нужны эти размеры в памяти? При нарезке на подстроки нужно просто расставить маркеры, а длина всего массива известна заранее. Потом эти подстроки ещё можно нарезать, никаких длин не надо знать.

    4. Самый быстрый метод разрезания строк (без сдвигов) - гигантская (без 0) строка. И отдельный каталог, содержащий определения (адреса и размеры) виртуально порезанных подстрок.

    В C делаешь структуру (указатель, длина), если нужно исходную строку сохранить. Если же это нафиг не надо, то просто нарезаешь её без всяких структур и заморочек с ними. А сдвиги, ну это ты сам придумал себе и героически победил у себя в голове.

    Методом добавления 0 разрезать строку на подстроки, сохраняя указатели на них, невозможно.

    Ну да, я понял, что ты пропёрся из-за своего тупого паскалевского мышления. Не в том смысле, что ты тупой, а в том, что Паскаль притупляет мышление и у паскалистов всё сводится к одному способу всегда, потому что язык большего не позволяет. В C же гибкость - обычное дело. Ты можешь и хранить длину, и не хранить длину.

    Ты бы ещё подучился, как сайт работает. Ты когда пишешь по сто сообщений, мне приходит по сто уведомлений. Не будь столь расточительным, делай как я - сначала в редакторе набираешь, а потом отправляешь один раз.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    redakoc:
    1. С помощью указателя можно гулять по ЛЮБОЙ строке.

    С помощью указателя можно гулять по нескольким строкам, сложенным друг за другом.
    В Паскале это всё будет снова молиться на размер одной строки.

    2. Зачем вам на практике 4204067..... ? Если речь идет о текстовом редакторе, то там совсем по другому организовано хранение. Не в одной строке.

    Да базу данных можно хранить так, файловую систему, много чего.

    3. Разве что в примитивных текстовых редакторах можно все запихнуть в одну строку.

    Я бы не стал так делать, потому что оно не пройдёт тест на огромный файл.

    4. Если тебе нужно работать со строками такой длины 4204067..., то для строки типа Паскаль никто не мешает использовать не 1 (ограничение на максимальную длину 255), а 4 байта для хранения длины.

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

    5. Что? В строка типа Паскаль можно хранить на 3 полезных байта меньше? При длине строки 4204067... ты считаешь это важным?

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

    А если действительно используются возможности по максимуму, то есть работаем с гигантскими строками 4204067..., то искать конец строки в такой строке - просто глупо.

    Конечно, проходить по всей строке с проверками на нуль-символ, - способ неправильный. Зато можно работать с данными напрямую, без заморочек с размером. Можно нарезать их прямо с середины. В любом месте можно встать и поставить начало внутренней строки (подстроки). Вот там есть пример в библиотеке - strtok() - когда строку можно нарезать на слова, сохраняя указатели на них. Можно и интереснее операции делать - ограничений нет. С размером этой возможности нет, там всё тупо и ограничено.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Александр Ручкин:
    тот же std::string вполне себе хранит размер

    std::string - это надстройка над строками C, а сейчас как раз речь про них.
    Чистая строка C не занимает в памяти ничего, кроме себя, и не требует операций.

    Станислав Макаров:
    Ну этот же size_t и поместите в качестве первого байта. Почему вы не говорите, что возвращаемый strlen результат "слишком большой"?

    Потому что он никак не используется, когда используется строка. Только когда ты хочешь получить длину строки, это имеет значение, но для операций со строкой (чтения/записи) её длина не нужна.
    Но даже он не ограничен 4-мя гигабайтами, потому что я привёл размерность, распространённую сегодня. Но size_t может быть и 64-битным и более-битным.
    Если же ещё секретнее говорить, то строки можно и длиннее size_t хранить, просто тогда нельзя strlen() вызывать для них.
    В этом мощь C, это не Паскаль какой-то там.

    redakoc:
    А для строки типа Pascal затраты на хранение длины составляют на 3 байта больше.

    Речь-то идёт не только об этих затратах памяти, речь идёт об операциях, которые потом используют этот размер повсеместно по 100500 раз, потому что всё сделано потом с учётом этого размера. Просто прочитать до нуль-символа такую строку нельзя.

    А на длинных строках операция проверки заранее известной длины занимает меньше времени, чем операция поиска конца строки.

    И что она даёт, эта ненужная проверка длины, когда не нужна длина?
    Я передаю строку в функцию - передаётся адрес начала. Я так могу передавать много раз, при этом передаётся только адрес начала.
    А тут как минимум надо передать адрес И ДЛИНУ.
    Умножаем на миллиард - получаем общее замедление.

    То есть ты считаешь, что перебор строки в поисках концевого нуля - это быстрее?????

    Передача быстрее.

    Если не память не изменяет такие строки там называются PChar.

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

    Торможение TheBat!, да и другой программы подобной сложности, вызвано вовсе использованием строк того или иного типа. А общей неэффективностью алгоритмов более высокого уровня, построенных поверх строк.

    Не, не обязательно строки (там ещё много чего интересного есть), но строки туда тоже вносят свой вклад.

    На каком компьютере TheBat! тормозит? На Pentium-I, II, III?

    Я тебе из памяти пишу, я уже не юзаю её давно. У меня своя прога, плюс Emacs есть, если что подробнее делать.

    То что тормозят и требуют специального Runtime программы на C# не напрягает?

    Я не юзаю это непереносимое, привязывающее к винде, ну и медленное к тому же.
    Речь о C, даже не о C++.

    Станислав Макаров:
    Я вам сразу сказал - меня не особо интересуют остальные достижения этого человека

    Ну, потому ты и читаешь его. Ты ещё кого-нибудь почитай. Такого материала в интернете тонны. Когда человек не может писать программы, он начинает писать статьи. Это известная тема.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Александр Ручкин:
    Кто хранит строки миллиардного размера в C-string literals?

    Так можно хранить их в памяти преспокойно. Главное, чтобы оно в size_t помещалось, так как strlen() требует не больше size_t.

    Ты можешь взять файл, сохранить его в память (выделенную) и занулить его в конце - и всё.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    В памяти такая строка занимает те же что и С = число символов в строке + 1 байт в начале, хранящий её длину.

    Максимальная длина - 255 символов.
    А в C максимальная длина - 4294967295 символов (вместимость size_t).

    К тому же, благодаря такому устройству, в C-строках можно гулять туда-сюда с помощью указателя.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Станислав Макаров: этот чел за всю свою прискорбную жизнь не сделал и сотой части того, что сделали те, кого он там критикует. Что он реализовал, md5 и кое-что ещё? Это такие мелочи по сравнению с языком, который преодолел 40 лет, сохранившись в первозданном виде (отменили только gets() ).

    asd111:
    Дельфи программы тормозят

    Они не только тормозят, но и весят слишком много. Это не из-за оптимизаций, а потому что он спроектирован так, чтобы особо не заморачиваться в плане ресурсов окружения.
  • Почему char занимает 1 байт, а строка с одним символом - 2 байта?

    @abcd0x00
    Александр Ручкин:
    строке на миллиард символов достаточно 4 байт для записи размера
    если мало, можно взять 8

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

    зато, чтобы вычислить длину строки - надо пройти её от начала и до конца

    Да можешь отдельно себе сделать структуру без всякого нуль-символа и хранить там всё.
    Но когда ты через printf() или cout<< выводишь "hello", то слишком жирно для этого hello выделять 8 байт.

    Станислав Макаров:
    Хорошее чтиво:

    Вот он пишет:
    "To a lot of people, C is a dead language"
    "When your Java, Python, Ruby, or Haskell program opens a file"
    Ты нашёл что читать.
    https://en.wikipedia.org/wiki/Poul-Henning_Kamp
  • Непонятная ситуация с iostream!?

    @abcd0x00
    BB8: если выпадает на этом коде, то дело вообще не в коде, который ты привёл.