Сап /b/, помоги овощу разобраться с Си. Как блять работают эти указатели? Не ебу вообще пиздец. Как я понимаю, wrk означает получить значение (операция разыменования), но это if(wrk) меня убивает. Реквестирую разбор данной функции для долбоебов т.е. для меня желательно в стиле /b/
Бля, тут звездочка курсивный текст делает. звездочка wrk означает получить значение (операция разыменования), вот что я имел ввиду
звездочка wrk++ в while означает, что с каждой итерацией будет сдвигаться в строке на одно значение вправо?
>>192872466Мы в школе 21 проходим такое на первой недели бассейна, а сейчас уже третья идет и мы занимаемся более важными делами.
>>192872182 (OP)На связи, почитай про разыменовыние указателя раздел и поймёшьпро & и * Я даже не знаю, то есть есть адрес где ты живёшь , а есть ты который там живёт, по этому адресу живёшь ток ты, сосед уже жить там не может, ибо тогда он соседом не будет... ну или ебнет тебя и пропишется в твоей хате...я не знаю как тебе пояснить, общем всё очень легко. просто берёшь и понимаешь
>>192872820Можешь хотя бы объяснить по функции, как конкретно она работает? Я на примерах обычно хорошо понимаю. Вот это if(*wtr) меня вообще убило.
>>192872182 (OP)Охуенная функция2 пробела - збс1 пробел - пустая строка0 пробелов - зависли.Не учись по такой хуйне.
>>192872926Препод - старпер 50+, он так сука пишет. Я подобной хуйней не занимаюсь операторные скобки - мое все и правило 4 пробелов
>>192872182 (OP)читай предусловие, синим шрифтом, там объяснение по функциипостусловия нету, но если написавший его оставил, то он молодец. Я обычно по мимо предусловий, писал постусловия, обычно в коде там же где и предусловие функции
>>192872182 (OP)IF ( )то что в скобках приведётся к значению Булевому, то есть двоичному. Так вот если там 0 то это FALSE любое другое значение TRUE
Ну пока я наткнулся на твой тред, тебе повезло... Я реально по С++ отвечу тебе и пойду в дота2 стримы катать, да, гг
>>192872984>скобкиИнкремент выполняется раньше разыменовования. Это терпимо, и, вроде, часто используется сам не смотрел, где-то читал.
Я хочу понять блять но не понимаю, от препода помощи - хуй с маслом, если и объясняет, то заученными фразами-понятиями, шаг влево от них - какая-то псевдоумная околесица.
>>192873346Ну там смысл вернуть указатель на подстрочку, НО Я НЕ ПОНИМАЮ, КАК ОНИ РАБОТАЮТ точнее представляю это кое-как, но точно как - нет
>>192872984у препода походу деменция развивается, если он вам такую лажу выдает, поищи нормальную литературу и учись по ней.
>>192873484У меня завтра кр, задачи будут подобные. Раз тридцать подходил за объяснениями по поводу этих указателей и каждый раз слышал одно и то же. Литература это хорошо конечно, но мне сейчас нужно понять хотя бы это.
>>192873484Ну и про деменцию - это да, хз, почему они так долго остаются в вузах, когда могут съебать на пенсию наверное
ОП ты хочешь понять что такое указатели?А листинг кода тут просто как пример, того, что ты не понимаешь?
>>192873693>>192873872Мудила, где стримы?Давай пиздуй стримить дотку или я вызову отряд полиции к тебе домой.
>>192874009Про инкремент я уже и так догадался. Как я понял, указатель - это как палец, который указывает на какой-то элемент (если брать пример на строке). Допустим строка p="abc", то p будет "a", а p+1 - "b". Верно же мыслю?
>>192873401>НО Я НЕ ПОНИМАЮ, КАК ОНИ РАБОТАЮТЧто именно? Что чар - это чар. А звёздочка чар - это указатель?
>>192872182 (OP)Когда пишешь со звёздочкой - работаешь со значением, на которое указывает указатель.Без звёздочки - с самим указателем.if (∗wrk) - проверка, не является ли символ по указателю нулевым.>>192872295Указатель будет сдвигаться на одну ячейку вправо. Размер ячейки зависит от типа указателя, в данном случае char - 1 символ, указатель будет увеличиваться на 1.
>>192874269Да я как пример же, ну. если строка p это массив символов abc, то указатель на p - символ a
>>192874365>то указатель на p - символ aУказатель - это указатель. А вот когда ты разыменовываешь указатель (в том же условии if (∗wrk) ... ) - ты получаешь значение, на которое указывает указатель, и с ним работаешь.
>>192874222IF() писал же выше>>192873073этот цикл у тебя работает со строкой, когда он натыкается на конец строки, он заканчивает свою работу(про ошибки пока ничего не пишу, пока не важно)
>>192874428Черт. Да я знаю, что строк нет, и что объявление массива само по себе объявление указателя на первый элемент типа, но я же блин на примере строки попытался объяснить, что я понимаю.
>>192874428Массива - как структуры, которой ты можешь управлять. Только указатели.так то массив есть, но у тебя на него есть только указательфикс
>>192874475Как я понимаю запись со звездочкой и есть операция разыменования, поэтому и написал, что *p есть символ "а".
>>192874428>Массива нетЕсть string literal, который где-то в памяти сидит. И есть переменная p, которая является указателем и при инициализации char ∗p = "abc" содержит адрес первого символа строкового литерала "abc".>>192874547>запись со звездочкой и есть операция разыменованияДа.>поэтому и написал, что *p есть символ "а".Сейчас ты написал правильно, а до этого написал "указатель на p - символ a" - это неправильно.
>>192874550Саму работу с ними. Сейчас потихоньку вроде как вкатился, спасибо. Но вот вопрос еще - *wrk=str-1 - это он как бы образует пробел перед строкой?
>>192874695wrk = str;wrk--;Отступает на один чар назад, чтобы потом было удобнее итерироваться.>это он как бы образует пробел перед строкойЧто?
>>192874695>*wrk=str-1 - это он как бы образует пробел перед строкой?Нет, это он так через жопу обходит то, что дальше в цикле у него wrk++.Причём, по-моему, там баг, потому что используется пост-инкремент и код при первом выполнении цикла будет пытаться проверить символ за пределами строки, а это undefined behaviour.Вообще на будущее - такие задачи надо задрочить до автоматизма, но писать так никогда ни в коем случае не надо, есть stl.
>>192874860>Причём, по-моему, там баг, потому что используется пост-инкремент и код при первом выполнении цикла будет пытаться проверить символ за пределами строки, а это undefined behaviour.Бляяя, я это не заметил. Стыд и срам мне.В своё оправдание там баг на баге и багом погоняет.мимо неОП
>>192874868Неужто программисты в 2к19 сидят и всю эту ебалу вручную пишут? Сейчас наверняка нейросети все это делают
>>192875001Я себя бы даже близко погромистом не назвал бы. Второй семестр начали только строки насиловать.
>>192875144> понять.В этом твоя проблема. "Понять" это не про математику или программирование. "Понять" это для теоретиков, а на практике нет никакого "понять". Когда ты пишешь код, ты сталкиваешься именно с практикой, и пытаешься "понять".
>>192875232Да я уже столько раз пожалел, что поступил на техническую специальность, не сосчитать. Лучше бы на филолога пошел, ей богу.
>>192875306Да тут не в специальности дело, а в том, что очень хуёво преподают, очень хуёво объясняют. Причём объяснить по-нормальному не могут в принципе, ни за какие деньги. Мой тебе совет: возьми бумажку и нарисуй на ней, что должно происходить, что происходит. Не пиши словами, именно нарисуй, и нет, не в виде таблички или блок-схемы, потому что табличка или блок схема это по сути текст.
>>192875051ОП, где учишься? Я в своей шараге в 1 семестре щас весь С прошел, но кстати с указателями так и не смог разобраться в полной мере.
>>192875144Да всё норм, тут же никто никого не заставляет отвечать.while ((ins++ = SS++))По-порядку:1. сначала выполняются операторы ++ (см. c++ operator precedence). Результат постфикс ++ оператора - значение операнда ДО инкремента, т.е. в выражении будут использованы не инкрементированные значения указателей, а инкремент произойдёт после вычисления выражения.2. Выполняются разыменования3. Выполняется присваивание (в память по указателю ins (ДО инкремента, не забываем)) записывается значение, взятое по указателю SS4. Результатом оператора = является ссылка на левый операнд. Эта ссылка будет использована в условии while, т.е. в конечном итоге значение по указателю ins будет приведено к bool и, пока там будет не 0, цикл будет продолжаться.В итоге имеем эдакое копирование строки с одновременной проверкой на конец строки, и всё это в одном условии.В молодости меня такие конструкции восхищали, но сейчас мне после овер 15 лет опыта с С++ пришлось гуглить, чтобы сообразить, как оно должно работать. И не факт ещё, что я ничего не упустил. Именно поэтому так писать не нужно.
>>192875425Годный совет, взял на заметку. По поводу преподавания - соглашусь отчасти. По мат. логике и теории алгоритмов нам годно все объясняют, включая примеры из современных игр про детроит, например. По проге да, жесть. Объясненией толком нет.
>>192875559Ахуеть, в него за полгода (1 семестр) при желании можно вкатиться. Ну одну книжку прочитать, как минимум. Че там целый год изучается я хз, тем более вы, как я понял, только указатели дрочите
>>192875656Дрочим их третью практику, с разной степенью успешности. Препод - совок эдишн, думаю, такая медлительность растет ногами отсюда.
>>192875537>По проге да, жесть. Объясненией толком нет.Что мешает скачать какой-то годный курс по програмированию на С или даже просто в ютубчике посмотреть?
А вообще, ОП, смотри сюда. Каждая переменная в C состоит из 2-х частей: r-value и l-value. L-value - это location-value, адрес. R-value - это read-value, то, что в этой переменной записано. Звёздочка (астериск по-умному) заставляет условного гномика, который бегает по твоему коду от команды к команде, выполняя их, обращаться к r-value.
>>192875919Потому что заинтересованности в образовании толком нет. Пока что уровень, на котором я хочу барахтаться - то, что даст вуз. Будет интерес - тогда и возьмусь.мимоОП
>>192875960>Потому что это ничего не даёт. Что не дает то? Что оно должно тебе дать? Покурить видосики с указателями. Поделать примеры. Разобраться. Попытаться понять говнокод препода.
>>192876021Я сомневаюсь, что у ОПа стоит задача научиться именно чистому C без плюсов. Куда вероятнее, у него просто программа вуза так построена.
>>192876092Будет так, что теорию знаешь аж от зубов отскакивает (если ОП старательный), а как до практики дойдёт, то делаешь как взбредёт в голову, индус-стайл.
>>192876017>Пока что уровень, на котором я хочу барахтаться - то, что даст вуз.Бле. Сам же на двощ пришел с вопросами. Если ты не понимаешь то что объясняет припод то ты не будешь барахтаться, ты просто утонешь. Но дело твое конечно. Ты поступил в вуз. Учишь програмирование. Нихуя не понимаешь. Проебываешь время...
>>192876284Да, все именно так. По сути, мне оттуда нужна только корка - не вижу я себя в программировании.
>>192876178>а как до практики дойдёт, то делаешь как взбредёт в головуНу это лечится практикой. Или работой с толковым программистом конечно если есть желание. Если нет то велком в макакинг.
>>192876507Очень нелегко порой соединить теорию с практикой. Именно на этом обламывается большинство технарей, не только программистов.
>>192876446Я студент-погромист.>>192876507Чувствую, что мак - мое призвание ну или покупать седло для более удобного сидения на шее у родителей
>>192876507>это лечится практикойНет, это лечится толковыми книжками по code style, best practices и design patterns. Иначе очень большая вероятность так и застрять на каком-то начальном уровне, пытаясь вручную расставлять нули в строках.
>>192875994Так так и есть.Он какую-то хуйню написал про location и read.>The name of this value category ("left value") is historic and reflects the use of lvalue expressions as the left-hand operand of the assignment operator in the CPL programming language.https://en.cppreference.com/w/c/language/value_categoryпро right сказано только в документации к с++.>an rvalue (so-called, historically, because rvalues could appear on the right-hand side of an assignment expression) is a prvalue or an xvalue.
>>192876335> По сути, мне оттуда нужна только корка - не вижу я себя в программировании.Так тем более. Зачем тебе ломать голову над невнятными объяснениями препода. Сам говорил что 30 раз спрашивал. В разы проще наверное разобраться по видосикам, примерам. Поделать что-то, понять. Или ты хочешь зафейлить вуз? Тогда совсем не понимаю.
>>192876780У меня просто еще были надежды, что он что-то способен объяснить. К егэ я готовился исключительно по видосам с тубчика, поступил на бюджет. Видимо, придется возвращаться к нему снова.
>>1928754964. Во-первых, в си нет понятия "ссылка". Во вторых, в условии будет проверяться не адрес, а значение по адресу. В-третьих, никаких преобразований к bool в си не приводится
>>192876821Ну так бы и писал, потому что практика не всегда подразумевает работу с толковым программистом, который тебе код поревьювит, даст по рукам за говнокод, и скажет, какие книжки прочитать.
Я пойду пожалуй с песиком прогуляюсь, потом все увижу и на все отвечу. Спасибо большое за объяснения, советы, без вас навряд ли бы понял.
>>192876967Ну внезапно если ты написал говнокод, а потом надо его расширять, добавлять функционал и обнаруживаешь, что для того чтобы это сделать надо нахуй все переписывать с нуля то если не совсем дурак начинаешь думать об оптимизации.
>>192877200А вот ВНЕЗАПНО многие (особенно индусы этим страдают) вместо рефакторинга и оптимизации начинают городить костыли, копипаст и говнокод, потому что это на первый взгляд проще, чем переписывать уже работающую, с таким трудом высранную программу.
>>192876836>У меня просто еще были надежды, что он что-то способен объяснитьДа на этих старых пней которые толком нихуя не объяссняют вообще надежды ноль. Я еще в школе от таких настрадался.
>>192877333Работает- не трогай. Хороший код никому не выгоден. Заказчик один хуй не понимает, а твой работодатель заинтересован лишь в получении денег. Переписывать в любом случае будешь не ты.мимо 80к жс макака
>>192877449К сожалению, это та философия, которой следуют очень многие. И вновь пилятся велосипеды, и вновь летят дедлайны.
>>192872182 (OP)Крч, передал в функцию указатель на строку str (строка где-то лежит в памяти на начало которой указывает str (гугли организацию Си массивов), копировать всю строку не продуктивно.1. Определяешь указатель на строку ptr (это предписание компилятору выбрать тип, который может хранить значение указывающее на начало Си строки) и указатель wrk указывающий на 1 элемент char(байт) перед началом строки str. (Если str не инициализированно или NULL, то риск получить в колено из-за нарушений доступа к памяти).2. Цикл, пока текущий элемент char (символ) на который указывает wrk не равен пробелу, ты перемещаешь указатель wrk на один элемент вперед (да ты переходишь на след символ, грубо говоря). 3. Устанавливаешь ptr на тот же элемент, что остановился wrk после завершения цикла. Это или пробел или какой-нибудь потенциальный краш, ничто не мешает вылезти тебе за пределы массива строкового, если нет пробела.4. Пока wrk не равен 0 (конец Си строки) и не равен пробелу ты так же лазаешь по строковому массиву. Тебе уже сложнее выйти за пределы строки, но если ты в первом цикле вышел - то пизда.5. За пределами пробела ставишь конец строки, затирая исходную строку! Иначе ты затираешь концом строки первый пробел.
>>1928748681. ins у тебя указывает на 1 элемент подстроки в твоем строковом массиве.2. SS указывает на смещение с 1 элемента подстроки на длину этой подстроки. Т.е. на 1 элемент ЗА подстрокой искомой.3. Ты берешь ins (первое значение подстроки) и записываешь на его место SS (первое значение за подстрокой). Далее смещаешь ins на 1 элемент вперед и SS на 1 элемент вперед (++) и копируешь следующий. Формально посимвольное копирование. До символа \0 (значение 0, условие цикла станет не действительным и он прервется. Все значения отличные от 0 продолжат копирование/выполнение цикла).
>>192877449Хороший код выгоден тебе. С хорошим кодом ты проестимейтишь задачу на неделю, сделаешь за 2 дня и будешь спокойно двач скроллить в оставшееся время. С плохим кодом ты через неделю поймёшь, что тут ещё на две недели работы, а тимлид уже косо смотрит, потому что ты проёбываешь сроки не в первый раз.
>>192878607Хаха, влажные мрии. Твой код всегда хуёвый, это аксиома. Или иначе можно сказать "твой код хорош лишь до какого-то определённого момента, а после него - он уже хуёвый".
>>192877449Если тебе не поддерживать и не расширять свой код. Мне по работе часто приходится доделывать функционал. Так как заказчики часто изначально не понимают что им конкретно надо и какие возможности предоставляет готовый продукт. Плюс зачастую в процессе эксплуатации появляются у них куча пожеланий и идей.
>>192878685Нихуя не влажные. Простой пример: мне надо было запилить систему учёта лицензий для проекта, чтобы лицензия бралась из пула и освобождалась после закрытия соответствующего окна в программе. Я заебашил класс, унаследовал его от QObject, в конструкторе забирал лицензию из пула, в деструкторе отдавал. Привязал его к нужным окнам через QObject(parent), и всё автоматом работало, привязка любого нового окна к лицензии в одну строку делалась, легко и просто. Само собой, случай, когда софтина закрашилась, отдельно обрабатывался.А если бы городил копипаст с вызом освобождения лицензии вручную во всех нужных местах - заебался бы баги разгребать.Так что не прав ты.
>>192878753>Так как заказчики часто изначально не понимают что им конкретно надо и какие возможности предоставляет готовый продукт. Плюс зачастую в процессе эксплуатации появляются у них куча пожеланий и идей.Ты только что agile.
>>192877017Смысл пиздеть? Направление - Информатика и вычислительная техника. Мб у вас на программной инженерии было иначе или еще на каких направлениях, у нас - так.>>192877424В моем мани-мирке вуз должен был отличаться от школы как раз этим. Отчасти правда, конечно, но мани-мирок уже дал трещину.>>192877658По поводу второго пункта. Разве цикл не должен сразу же дропнуться, ведь wrk изначально задан пробел (str-1)>>192878560Тут все понял, спасибо!
>>192879078ты только что ООП>>192879190>Информатика и вычислительная техникасцука, наёбываешь же? я там учился. кто препод по матеше? если бабка старая нахарчи ей в ебало. общага 4?
>>192879190>ведь wrk изначально задан пробел (str-1)С чего ты взял, что в str-1 пробел?Если str - начало строки, то по адресу str-1 может находится всё что угодно, в том числе неинициализированная или не выделенная память. Я про это писал - будет undefined behaviour. Пока str-1 попадает в адресное пространство процесса и там случайно оказывается что-то, кроме пробела - будет работать как задумано. Случайно попадётся пробел - цикл будет сразу завершаться.Случайно str-1 выйдет за пределы адресного пространства процесса - крашнется. Не будет пробелов в строке - undefined behaviour, выйдет за пределы строки (потому что проверки на ноль нет) и будет выполнять цикл, пока не найдёт пробел дальше в памяти, или не крашнется.
>>192879324ААХХААХХАХААХ. Не, у нас не Павлова. У меня подруга на РТФ учится, она с ней страдает. Нас ведет Магазинников, пиздатый преподаватель. >>192879360Пока писал ответ понял, о чем ты. Спасибо второй раз! :D
>>192879707Там очень важное, анон. Если не перечитаешь - ты будешь потом жалеть всю свою жизнь, что не перепрочитал.
>>192879733>>192879820Спасибо, анончики! Прочитал двадцатый пост, моя жизнь поменялась к лучшему, все баги исправились сами собой, брат воскрес, хуй на 5 см увеличился.Абу благословил этот пост.
>>192880203Черт, как жалко, что ты не составляешь программу вузов по подготовке бакалавров, уж с тобой то мы плюсы за семестр выучили.
>>192880276На втором курсе универа в 2012 году, когда нам сказали, что мы будем учить си следующие 5 лет, я сказал преподу, что рот ебал это старье и он разрешил мне выбрать любой другой, и делать задания и лабы на нем. Так я пересел на питон, синтаксис учил дома, а в универе занимался логикой вместе со всеми
>>192879445Тут вся программа работает на честном слове, что в явно заданном строковом массиве хотя бы 1 пробел есть. Вся суть древних преподов. Хотя нас учили еще круче, мы с преподом лабу мою на сях запустить даже не смогли, лол
>>192882694А выход за пределы массива/выделенной динамически(или статически в случае с константами) памяти не является UB?Ну-ка найди мне определение такого поведения в стандарте си.Можешь даже в с++ поискать.
>>192884673Видимо я написал как ебаклак>UB>выйдет за пределы строки (потому что проверки на ноль нет) и будет выполнять цикл, пока не найдёт пробел дальше в памяти, или не крашнется.UB - это UB, адекватного поведения программы можешь не ожидать, твои предположения оправдаться не обязаны.Я вот что имел ввиду.