Это копия, сохраненная 8 января 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
на степике лучше пройти курс от cs center, чем аналогичный от mail.ru, это
https://stepik.org/course/7
и его продолжение
https://stepik.org/course/3206
этот курс бесплатный
второй курс от ребят из яндекса и физтеха на платформе cousera:
https://ru.coursera.org/specializations/c-plus-plus-modern-development
учтите, что он платный, но, в принципе, если вы готовы платить за обучение, лучше взять этот курс, а не другие которые есть на рынке, imho
базовые знания с которыми вы должны выйти на собес можно взять из
мейерс "эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14"
джосаттис "шаблоны C++: справочник разработчика" второе издание
обе на русском, обе есть в цифре в сети
видео с конференций и митапов, надеюсь кого-то они развлекут:
cppcon russia
https://www.youtube.com/channel/UCJ9v015sPgEi0jJXe_zanjA/featured
corehard братишек-белорусов
https://www.youtube.com/channel/UCifgOu6ARWbZ_dV29gss8xw
cpp-party от ребят из яндекса
https://events.yandex.ru/events/cpp-party/
cppcon
https://www.youtube.com/user/CppCon
boostcon
https://www.youtube.com/user/BoostCon/featured
meeting c++ от дойчей
https://www.youtube.com/user/MeetingCPP/featured
старички accu
https://www.youtube.com/channel/UCJhay24LTpO1s4bIZxuIqKw/featured
питерский митап по с++
https://www.youtube.com/playlist?list=PLtDc3cNvuhAIU_LRYg6xFaJV_95Kkt79n
Чуть ли не каждый день попадается что-то новое.
Допустим я хочу вернуть строку:
char GetStr() { char cStr[1024]; /initialization / return cStr; } — ТАК ДЕЛАТЬ НЕЛЬЗЯ
char GetStr() { char cStr = new char[1024]; /initialization / return cStr; } — И ПОЛУЧАЕТСЯ ТАК ТИПА ТОЖЕ НЕЛЬЗЯ (хз почему)
А как тогда правильно возвращать сишную строку?
А если хочу вернуть string:
string& GetStr() { string str; /initialization / return str; } — ТАК НЕЛЬЗЯ (ССЫЛКА ЖЕ)
string GetStr() { string str; /initialization */ return str; }— А ДЕЛАТЬ НАДО ТАК
хотя в последнем случае по логике самого же языка я возвращаю строку по значению, но дохуя умный компилятор все равно возвращает ссылку. Дак в чем же тогда проблема если я буду сам писать string&. СЛОЖНО.
конкретно к плюсам? в базе ты должен таки знать алгоритмы-структуры, сишку на уровне книги K&R, ну и кресты на уровне онлайн курсов из шапки
дальнейшие знания уже будут зависеть от специализации: современные кресты раскидываются по все более узкоспециализированным нишам со своей спецификой
https://codeshare.io/register?saveCodeshare=amDWx0
По идее в этом говнокоде сортировка RadixSort
сишную строку возвращают через параметр функции, при этом требуется соглашение (не выражаемое семантикой языка) кто будет удалять эту строку
std::string можно возвращать из функции
чаще всего это еще и относительно быстро, так как делается rvo
хотя можно и через возвращаемое значение функции отдавать строку
только, опять же, требуется соглашение о том как вызывающий код будет удалять эту строку
как минимум надо знать при помощи чего выделялась память под строку - new или malloc
потом еще нужно учитывать, что разные рантаймы могут быть, например, в вызываемой библиотеке свой рантайм будет, а у вызывающего кода - свой
тут вообще множество проблем возникают
которые решаются старыми сишными методиками
типа предоставления функции, которая будет освобождать ресурсы, выделенные в библиотеке
либо способом, когда вызывающий код сам выделяет память, в которую уже вызываемый код разместит эту строку
в общем, это не крестовый подход
>требуется соглашение о том как вызывающий код будет удалять эту строку
>это не крестовый подход
да как-то вообще тупо, заебался с этими выделениями памяти.
Стоит заменить все char'ы на vector<char> как на оверфлове советуют, или есть лучше подход?
Ты понимаешь что под ссылкой или указателем на локальную переменную имеется ввиду конкретно адресс переменной созданной в этой области видимости.
Ну к примеру:
int(звездочка) ReturnTmp() {
int a = 5;
int(звездочка) b = &a;
return b;
}
При попытке в дальнейшем использовать адрес возвращенный такой функцией ты получишь ошибку, ибо при выходе за пределы области видимости переменная "a" будет уничтожена и указатель "b" будет указывать хуй знает куда, т.к "а" хранится в стеке и уничтожается при выходе за область видимости.
А вот что касаемо такого варианта:
char(звездочка) GetStr() {
char(звездочка) a = new char[10];
return a;
}
То адрес полученный через такую функцию будет действителен даже после выхода за область видимости функции, т.к все что выделено через "new" никак автоматически не освобождается, ибо находится в куче, а не в стеке.
> Аноны, в общем недавно в одной книге прочитал, что НЕЛЬЗЯ возвращать из функции ссылку или указатель на локальную переменную и сразу затупил.
Хуевая и устаревшая книга, не читай ее. НЕЛЬЗЯ использовать new не в конструкторе и без соответствующего ему delete в деструкторе. Вот это нельзя. И из этого будет следовать все остальное. Если в книге используют голый new в коде - не читай ее.
>char GetStr() { char cStr = new char[1024]; /initialization / return cStr; } — И ПОЛУЧАЕТСЯ ТАК ТИПА ТОЖЕ НЕЛЬЗЯ (хз почему)
Потому что память будет течь как твоя мамка при виде большого черного хуя.
>Дак в чем же тогда проблема если я буду сам писать string&. СЛОЖНО.
Конечно сложно, если ты берешься за С++, не зная сишки. Возвращать указатель на временный объект очень хуевая идея.
Теперь да, понимаю, но тогда другой вопрос. В какой момент переменная становится недействительной.
допустим:
int(звездочка) ReturnTemp(){
int a = 5;
int(звездочка) b = &a;
return b;
//уничтожение переменной тут или нет?
}
int value = ReturnTemp();
переменная гарантированно уничтожится сразу после 'return b', но до присваивания, и в value уже будет лежать мусор? или это неопределенное поведение? или так будет работать?
>Конечно сложно, если ты берешься за С++, не зная сишки.
Два чаю, тут даже не только в этом дело, у него нет понимания что такое стек и что такое куча, в чем разница между ними и что собственно делает оператор new, как работают указатели и ссылки и в чем между ними разница, области видимости мимо него тоже видимо прошли.
Случайно саганул, звиняюсь.
Не, книга норм Andrei Alexandrescu C++ Coding Standards, там как раз и советуют избегать выделения и освобождения памяти в разных местах.
Это тупой пример от меня, просто я знаю что он точно работает, но почему-то противоречит написанному “Не возвращайте указатель/ссылку на локальную переменную”
или может когда выделяешь память в куче переменная уже не считается локальной. короче СЛОЖНО.
>Возвращать указатель на временный объект очень хуевая идея.
Ну теперь понятно что хуевая. Просто я в тот момент думал что компилятор сам оптимизирует и возвращает ссылку на временный объект и у меня диссонанс возник от того что компилятор может, а я не могу, а там оказывается так http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html
>компилятор может не создавать временный объект и сразу же создать строку в возвращаемом объекте
>>296232
Ну давай, объясни мне на пальцах разницу между кучей и стеком (а то я действительно не понимаю)
допустим:
int(звездочка) ReturnTemp() {
int a = 5;
int(звездочка) b = &a;
return b;
} < Тут.
Если верить дебагеру, конечно, ради интереса создай класс с деструктором, создай переменную этого класса в main и пройдись дебагером по коду нажимая F11, деструктор будет вызываться именно на этом месте.
>Ну давай, объясни мне на пальцах разницу между кучей и стеком (а то я действительно не понимаю)
За бесплатно? Хуй тебе, иди гугли, смотри видео на ютубе, или в книжке прочитай какой-нибудь, если и так не поймешь, то увы.
>Это тупой пример от меня, просто я знаю что он точно работает
Он работает. Ровно по такому принципе работает функция fopen - она выделяет память под структуру типа FILE и возвращает указатель, и надеется, что ты вызовешь fclose, в котором память освободится. Эта книжка не про то, работает или нет, а про то, как надо делать.
Есть такой язык Си, и в нем нужно выделять буферы внутри функций. Так как сборки мусора нет никакой, то нужно соглашение о том, кто будет выделять, вызывающий (как работает например strcpy - выделяешь снаружи буферы под результирующую строку, вызываешь) или сама функция (так работает fopen). Первый способ считается получше для авторов библиотек, потому что считается, что выделевший память под буфер точно не забудет ее освободить, а вот если функция сама выделяет память, заставлять юзера ее освобождать - это он должен документацию читать, бе.
В С++ оба этих способа являются неправильными. Буферы должны выделяться в конструкторах, а освобождаться в деструкторах. Не потому что по-другому не работает, на С++ можно писать так же, как на С, а потому что это будет не С++, а С или крестосуржик.
>когда выделяешь память в куче переменная уже не считается локальной
Конечно нет. Локальной переменной будет указатель на буфер, а не сам буфер.
> Просто я в тот момент думал что компилятор сам оптимизирует и возвращает ссылку на временный объект и у меня диссонанс возник от того что компилятор может, а я не могу,
Пиздец у тебя каша. Вот посмотри внимательно на код из статьи Алены
A MyMethod(A &_hiddenArg, B &var)
{
_hiddenArg.A::A();
_hiddenArg.member = var.value + bar(var);
Return
}
И скажи, где ты тут увидел, что компилятор возвращает ссылку на временный объект? Наоборот, он принимает ссылку на область памяти hiddenArg и создает объект сразу в ней, избегая лишнего копирования. А ссылку на временный не возвращает никто, потому что по выходу из функции стек чистится и что там будет никто не знает (самое мерзкое, что в 90% случаев все будет работать нормально, так как стек чистится просто смещением указателя, сами данные не трогаются и временный объект немного повисит незатертым новыми данными, поэтому такие ошибки ловятся тяжело).
>Это тупой пример от меня, просто я знаю что он точно работает
Он работает. Ровно по такому принципе работает функция fopen - она выделяет память под структуру типа FILE и возвращает указатель, и надеется, что ты вызовешь fclose, в котором память освободится. Эта книжка не про то, работает или нет, а про то, как надо делать.
Есть такой язык Си, и в нем нужно выделять буферы внутри функций. Так как сборки мусора нет никакой, то нужно соглашение о том, кто будет выделять, вызывающий (как работает например strcpy - выделяешь снаружи буферы под результирующую строку, вызываешь) или сама функция (так работает fopen). Первый способ считается получше для авторов библиотек, потому что считается, что выделевший память под буфер точно не забудет ее освободить, а вот если функция сама выделяет память, заставлять юзера ее освобождать - это он должен документацию читать, бе.
В С++ оба этих способа являются неправильными. Буферы должны выделяться в конструкторах, а освобождаться в деструкторах. Не потому что по-другому не работает, на С++ можно писать так же, как на С, а потому что это будет не С++, а С или крестосуржик.
>когда выделяешь память в куче переменная уже не считается локальной
Конечно нет. Локальной переменной будет указатель на буфер, а не сам буфер.
> Просто я в тот момент думал что компилятор сам оптимизирует и возвращает ссылку на временный объект и у меня диссонанс возник от того что компилятор может, а я не могу,
Пиздец у тебя каша. Вот посмотри внимательно на код из статьи Алены
A MyMethod(A &_hiddenArg, B &var)
{
_hiddenArg.A::A();
_hiddenArg.member = var.value + bar(var);
Return
}
И скажи, где ты тут увидел, что компилятор возвращает ссылку на временный объект? Наоборот, он принимает ссылку на область памяти hiddenArg и создает объект сразу в ней, избегая лишнего копирования. А ссылку на временный не возвращает никто, потому что по выходу из функции стек чистится и что там будет никто не знает (самое мерзкое, что в 90% случаев все будет работать нормально, так как стек чистится просто смещением указателя, сами данные не трогаются и временный объект немного повисит незатертым новыми данными, поэтому такие ошибки ловятся тяжело).
>(самое мерзкое, что в 90% случаев все будет работать нормально, так как стек чистится просто смещением указателя, сами данные не трогаются и временный объект немного повисит незатертым новыми данными, поэтому такие ошибки ловятся тяжело).
Прога все равно вылетит при обращении к нему, один раз по глупости допустил такую ошибку и прога тупо вылетала.
Чего ты агришься? Таблетки забыл выпить? Я вообще другой анон.
Проиграл всей вирусной сценой с неосилятора.
>Наоборот, он принимает ссылку на область памяти hiddenArg и создает объект сразу в ней, избегая лишнего копирования
то есть при таком вызове val = MyFunc(); в функцию неявно еще передается ссылка на val?
Но вообще я тебя понял, возможно я действительно кодил в стиле C и только сложности себе создавал. Ну значит теперь буду использовать обёртки вокруг new/delete.
Еще нагуглил make_unique, который видимо все и используют, чтобы не утруждаться с освобождением памяти.
Так, посоны, поясните мне за эту хуйню.
struct S
{
std::forward_list<S> fl;
};
int main()
{
S s;
s.fl.push_front(s);
s.fl.front().fl.push_front(s);
s.fl.front().fl.front().fl.push_front(s);
}
Чё это за хуйня и почему это вообще работает. У меня мозг взрывается уже.
Ну объясни же? Такая хуйня ведь не должна работать, но работает, я не могу представить себе эту структуру даже, она сама себя включает сук.а
Блять, я вот просто не понимаю, ну объясни внятно что по твоему мнению не так? Почему это не должно работать?
Ну там в объект c вкладывается объект с Причем не один, сколько угодно можно так делать. Это не нормально я считаю.
c php/1C тредами спутал?
> содержится s
А в самом первом сверху s содержится сам этот вектор! Схуяли! Ну я правда не понимаю, бля. Правда размер 10.
std::cout<<s.vec.back().vec.size()<<std::endl;
Ну а дальше 9, 8, 7. Как это работает бля. А?
std::cout<<s.vec.back().vec.back().vec.size()<<std::endl;
Если ты, долбоебушка, думаешь что это один и тот же объект вложенный в себя же несколько раз, то ты ошибаешься, хотя бы проверил бы - https://ideone.com/xlpi2c
Но даже если и не так, то я вообще не вижу смысла в твоём негодовании. Ну что так? АЛЛО!!!?!?!!? Объясни внятно, блять.
Блять, я тебе что-то должен? Хули я тебе должен что-то "сразу сказать"? Я за свое образование платил бабки, между прочим.
Ну ты мог бы сразу сказать, а не выёбываться. Не должен, конечно, но мог бы. Выебоны не красят человека.
Ну возможно, но у меня пригорело просто. Да и я сначала не понял что именно тебя смущает, на самом деле.
Ты концентрируешь свое внимание не на тех вещах, лучше уж разберись что такое стек и куча, что значит передавать объект в функцию по ссылке или по значению, в чем разница, базовые принципы языка пойми, вместо этого.
Даже если и объект может хранить ссылку на самого себя, то что с этого?
Даже если сделать так чтобы в этом примере это все был бы один объект, то что с того?
https://ideone.com/0RNfi0
Ну есть такая возможность в языке, что дальше?
>Ты концентрируешь свое внимание не на тех вещах, лучше уж разберись что такое стек и куча, что значит передавать объект в функцию по ссылке или по значению, в чем разница, базовые принципы языка пойми, вместо этого.
Я всё это знаю, я так-то уже полтора года как работаю, просто у меня случился смысловой глюк, вот эта очевидная мысль что там просто копирование происходит с каждым разом никак не хотела приходить в голову, я понимаю, что это какой-то бред, но не понимаю, почему так. Поэтому и скинул, чтобы кто-нибудь тыкнул. Спасибо ещё раз.
Ну неловко вышло, сорри за сломанный детектор, не за что.
с твоими исходными данными и установками на жизнь лучше, наверное в веб податься
там и заработаешь денежку на свою самореализацию
кресты это не лучший способ по быстрому срубить бабла
Как вернуть ошибку из конструктора без throw catch?
Есть способ, но для этого нужна ещё одна переменная.
В конструктор передаешь какую-либо локальную переменную по ссылке, например bool, внутри присваиваешь ей какое-либо значение нужное тебе, например true если ошибки нет или false если есть какая-то ошибка, в зависимости от того какое значение уже в main обрабатываешь ошибку, если она есть, если нет то просто продолжаешь работу. Это как пример, но я думаю это не самый лучший вариант, т.к это сферический костыльный-велосипед в вакууме и лучше кинуть исключение.
Алсо, насколько мне известно, так деды делали когда в плюсах ещё не было исключений.
>как в крестах срубить бабла?
пишешь софт на заказ: фрилансерские биржи либо находишь людей кому нужно сделать
плюс часть людей работают в блеке, либо серый софт
либо shareware - пишешь софт, потом его продаешь, как то еще монетизируешь
но большинство предпочитают просто устроится на работу в офис либо удаленно и работать за зарплату и премии
кто-то идет в стартапы в надежде получить опционы сверху
ну, как раз это и был один из мотивирующих факторов, почему страуструп сделал в с++ исключения
в языке ведь еще есть и перегрузка операторов, из оператора тоже ведь ошибку можно вернуть только исключением
если же coding styles проекта предполагает полный отказ от использования исключений, используется методика двух этапной инициализации объекта, с функцией init() и остальными костылями в придачу
лучше в таких проектах не полностью отказываться от использования исключений в конструкторах, а использовать фабрики классов, либо более сложные порождающие паттерны, но отлавливаеть все исключения в самой фабрике
Я что-то упускаю, и все эти конструкторы копий и перемещения, перегруженные операторы присваивания, умные указатели и виртуальные деструкторы всё же нужны, или и без них норм?
Вот здесь посмотри, в djvu:
https://vk.com/wall-54530371_146817
Вероятно тот же файл, но я не проверял:
https://rutracker.org/forum/viewtopic.php?t=3847786
№33819, выберешь только его в списке закачке.
https://j00ru.vexillium.org/syscalls/nt/64/
Как обращаться к апи я знаю, но как мне использовать эти системные вызовы напрямую? Что мне делать то с этими байтоёбскими значениями, чтобы получить желаемый результат, без вызова native/win api. С меня тонны нефти.
В контейнеры в STL это и так динамика, просто они изначально сделаны так, чтобы пользователь не волновался о памяти, она выделяется в методах/конструкторах и чистится в деструкторе, как это и должно быть в плюсах. Ты этого не видишь, но это есть.
Динамика нужна в любом случае, ибо стек содержит в себе места всего под 1 МБ памяти с оговоркой на то что можно увеличить до двух и если тебе нужно хранить какие-то большие объекты во время работы программы ты нигде как кроме в куче их не вместишь.
все что знаю по програмированию это паскаль на школьном уровне(до двойных массивов) и сейчас вот до самостоятельного написания функций с процедурами в институте дошел.
Нет, ты ничего не упускаешь. Явно используют new в своем коде только долбоебы-деды, которые уверены, что vector - это медленна, unique_ptr - это сложна, ну и те, кого эти деды научили говну.
>Я что-то упускаю, и все эти конструкторы копий и перемещения, перегруженные операторы присваивания, умные указатели и виртуальные деструкторы всё же нужны, или и без них норм?
Это нужно дизайнерам классов. А дизайнить рано или поздно придется. Но, опять же, если твои классы будут содержать готовые классы типа векторов, то пилить вручную все эти конструкторы тоже не придется. Но, тем не менее, нужно знать, как это работает.
Иди в геймдев. Быстро бабла не срубишь, но если проект выстрелит - станешь миллионером.
Короче говоря, квадратный корень так и остался тормозной операцией от которой надо бежать как от ёбаного огня или эта такая же примитивщина стала теперь как перемножение даблов?
Область применения игоры, так что критично только время, ну и чтобы алгоритм не сильно (%15 максимум) пиздел.
Не заморачивайся. У процов есть SIMD инструкции для вычисления корня, это теперь быстро
угу
плюс всегда можно глянуть ассемблерный выхлоп компилятора, чтобы точно знать, что будут использоваться нужные инструкции
Можно их просто взять и вызвать самому (если не сталкивался, то нужно искать SIMD intrisics).
Если делается много вычислений в цикле, можно очень большой прирост получить если самому все на интринсиках написать.
Вот сам посмотри:
https://godbolt.org/z/ZgTiWr
С ffast-math компилятор делает rsqrtss и один шаг Ньютоном. Без ffast-math делает дополнительную проверку на отрицательный операнд.
>Область применения игоры, так что критично только время, ну и чтобы алгоритм не сильно (%15 максимум) пиздел.
Что у тебя там за игры такие
>и все эти конструкторы копий и перемещения, перегруженные операторы присваивания, умные указатели и виртуальные деструкторы всё же нужны
Они нужны, если класс хранит данные в куче, а сам при этом ведет себя как value-тип (например строки или большинство коллекций из стандартной библиотеки). На практике в прикладных программах это редкость, а классы, которые управляют данными в куче в 99% случаев некопируемые, поэтому проще у класса удалить копирующий конструктор и оператор присваивания, и управлять указателями через unique_ptr или new/delete.
>Они нужны, если класс хранит данные в куче, а сам при этом ведет себя как value-тип
Смотри.
struct Yoba {
vector<Danniye> danniye;
};
Класс хранит данные в куче, а при этом сам ведет себя как value-тип. И никаких конструкторов копий и перемещения. Чудеса.
Скажу по своему опыту, я начинал освоение с книги: "с++ за 21 день", спустя пару дней я начал писать пакмана и даже в 2д неплохо вышло на винбги.
З.ы. это было первое моё программирование в жизни, а с, с++ стал любимым языком)))
просто я даже не знаю с чего начать, нигде не могу найти какие книги начать читать, ведь все с чего-то стартуют ибо не бывает такого чтобы кто-то взял, прочёл книгу и сразу всё понял. Так много вопросов и так мало ответов, спасибо за совет
от какого ещё автора, можешь подсказать?
Ну я вот вкатываюсь, тоже нуфаг, так что может подскажу. В предыдущих тредах в шапке давали ссылку, в этом вроде нет:
https://github.com/sosachbot/cppthreadhat/wiki
Для вкатывальщиков с нуля есть книга Страуструпа, там он всякие байки с историями и прибаутками на 2 тысячи страниц раскатывает. Я такое читать не смог, захотелось разъебать монитор, но может тебе зайдет. А вот книга Липпмана и Ко мне зашла прямо заебок. Но она предполагает, что ты уже немного шаришь в программировании. Третью книгу из рекомендованных для нафань (Прата) я не читал, не могу сказать что там.
Ну и в целом готовься, что вкат займет достаточно много времени. Концепции там после динамической скриптопараши могут показаться сложными, да и сам объем материала весьма большой. Даже вводные курсы больше тысячи страниц.
спасибо большое
липпман вообще то на оппике :;
g++, ясный павлик, он в линухе жи искаропки.
ХЗ
Я начинал кодить с варика 3. Сначала писал простые триггеры: пик 1
Потом немного осваивал Jass: пик 2
Ну а дальше купил какую-то книжку по с++ обложка была жёлтая с нарисованным человечком сидящим за столом, помню меня она очень бесила т.к. там автор (насколько я помню) довольно специфично обучал кодингу т.е. книжка явно была не для новичков в программировании вообще.
Хорошо, когда так просто можно сделать, но это возможно далеко не всегда. Типовой пример: pImpl с наследованием. То есть ты хочешь избавиться от лишних аллокаций, и сделать так, чтобы наследники и родитель использовали один приватный объект.
Да-да, убегай скорее из треда, пока тебя страшные байтики в жопу не выебали.
Нахуя вообще кресты изучать, если не хочешь знать, что там под капотом, и не умеешь этим пользоваться?
Воще молодец бротиш
Покажи пример, может соображу, как это сделать без конструкторов
Не слушай ебланов.
Пройди курс и напиши сетевую игру на буст асию и кокос2D под андроид (тупо танчики 2мерные). Еще желательно знать базовые алгоритмы и структуры данных (первые 3 курса специализации от вшэ и какой то забугорной шараги на курсере).
60-70 к на руки твои. Через полтора года проси 150.
А сори блять, я не дочитал про твою мотивацию про короткометражку.
С таким подходом рили нахуй иди, учи верстку и верстай на фрилансе странички с индусами.
>>297884
Вот этот совет мб кому то адекватному будет полезен.
Если переводить на 40ч/неделю думаю займет от полугода до 9 месяцев вся затея.
https://pastebin.com/zrZA9fBQ
Обходной костыль уже придумал, конечно, но все таки интересно
Дык ить как один символ читается же, вроде?
Алсо, какого хуя эти ебучие 15 строчек кода в виде .exe занимают 2 мегабайта?
>> noskipws
Идите вы нахуй эксперты хуевы, короче. Как байтоебство обсуждать так все молодцы, а как рассказать что >> пробелы сжирает так все в молчанку играют блять
Ну ты библиотек побольше наподключай и гавна прилинкуй. Будет все 5 весить.
> while (file >> a)
Это форматированный ввод (исключает space symbols). Тебе нужно file.get(a).
Режу прогру на составляющие кладу в разные .срр файлы, выношу объявления в .h заголовки. Но большинство функицй и классов используют одну и ту же библеотеку.
Мне в каждый заголовочник кидать инклюды?
Алсо, компиляю используя утилиту make. Допустим сначала я компилю все файлы в объектные, мои объектники будут излишне жирными из-за инклюдов? Или всё станет похуй на этапе линковки?
Спасибо, анон
>с++
>в 2018
>когда есть функциональные языки
>когда есть высокоуровневые языки аля С# или java
>когда даже жабаскриптер джуниор получает больше синиора крестовика
Ну вы и говноеды господа
Ой не туда, извините
В Е К Т О Р И З А Ц И Я
М Е М О И З А Ц И Я
Л У П А Н Р О Л Л И Н Г
К О Н С Т А Н Т П Р О П А Г Е Й Ш Н
Самое главное, чтобы послепрепроцессинга в единице компиляции у тебя были нужные декларации функций. Почитай про модель компиляции Си.
Тоже проиграл с манямирка.
Это в лучшем случае если повезет. И после 3х лет работы. И так и быть может дадут как жс-прогеру в москве
Компилируй сам с -O0
Аноны, как можно написать функцию, которая будет искать все возможные варианты сум какого-то числа? Как на пике. Пытался найти возможные суммы числа (пик 2),а после перетасовывать элементы в них, но выходила какая-то хуйня. Если менять элементы сравнивая с последним, то строки по типу 1 2 2 будут давать мало вариантов, а если с первым - то все остальные. Может кто подсказать примерный алгоритм? Инет обрыл, нашёл только варианты как для пик2. Уже 6 часов сижу думаю, и нихуя не придумал. Если кому нужно, функцию для поиска пик2 оставлю под спойлером cpp.sh/8554k
Тебе нужно найти все уникальные пермутации каждого уравнения твоего второго пика. Так как элементы повторяются, то тебе нужны именно уникальные пермутации. Быстрое гугление дало https://www.geeksforgeeks.org/distinct-permutations-string-set-2/ что, возможно, даст тебе ответа.
Пермутации ведь учитывают все элементы? То есть в строке 1 1 1 2 оно будет и еденицы с еденицами тасовать?
1 + 1 + 1 + 1 + 1 - это 0000
2 + 1 + 2 = ( 1 + 1 ) + 1 + ( 1 + 1 ) - это 1001
3 + 1 + 1 = ( 1 + 1 + 1 ) + 1 + 1 - будет 1100
И так далее.
Это ведь битмаски называется? Я с ними не работал еще просто, инфу бы какую-то почитать сначала.
Это тупо двоичные числа. Только тебе нужны уникальные комбинации, соответственно надо будет сортировать по длине последовательностей нулей и единиц, чтобы 1110 и 0111 учитывались один раз.
Как раз таки мне нужны не уникальные, если я тебя правильно понял. То есть 1 1 1 2 и 2 1 1 1 это разные строки.
>>298235
Ну я пробовал растосовать их обратно, методом свапа и потом возвращения. Если сравнивать все элементы с первым, то не выдаст всех комбинаций для строк типа 1 1 3, а если с последним - то для 1 2 2. Если же поставить два условия, то почему-то не меняются местами пары из 2 элементов. Остальные при этом работают. cpp.sh/4uwv7 - то, на чём остановился.
Решил я значит поучить мат. анализ, нашел учебник Фихтенгольца (вроде все хвалят) и чёт нихуя не могу понять, что за хуйня тут несется?
Допустим у меня есть число e=128, ведь оно может быть любым больше нуля. И есть два вещественных числа 1.7354 и 50.8458
Если я заключу из между 125 > 1.7354 > 1 и 125 > 50.8458 > 1, то они обязательно равны?
Как это вообще блять? Может быть кто-то тут сможет мне пояснить, ибо в тематике пусто
>Как раз таки мне нужны не уникальные
Ну тогда просто по возрастания берешь все числа от 0 до N-1, представляешь в двоичном виде и суммируешь последовательности единиц, и вместо них выводишь сумму + 1. Если два нуля подряд, выводишь + 1 + , если ноль между единиц, выводишь +. Еще надо учитываешь лишние единицы в начале и конце.
Сбило с толку "какое бы ни взять рациональное число". Спасибо, анон, так все ясно
А хотя нет, ты чёт хуйню какую-то пизданул
Какое угодно e. Ты взял одно. А возьми e=1. Возьми e=0.23131. Возьми e=0.0000007. Если какое e ты бы не взял, неравенства действуют - значит, они равны.
Спасибо за подробное объяснение, анон. Алсо, что посоветуешь по математической логике почитать?
Нам в универе читали по Введении в математическую логику Эллиота Мендельсона. Потом сам для себя дочитывал в оригинале. Как по мне, вполне хорошо объяснено всё про формальные логики, модели, теорию множеств, арифметику и тд. Больше не вникал в данный предмет.
Есть массив
int arr[2][3] {0};
Хочу вытащить из arr подмассив.
Почему это можно сделать только через пердолинг со сслыкой:
int (&sub)[3] = arr[1];
Почему нельзя пропустить ссылку и написать просто
int sub[3] = arr[1]; // ???
Тут дело только в том, что массивы нельзя присваивать, или есть что-то еще?
Не, вектор "нечестно". Именно на массивах надо.
Вообще вопрос возник в связи с range-based for - хрен пойми, чего он от меня ждет. То ли я тип в принципе неверно задаю, когда пишу без ссылки, то ли он (for) тупо не может инициализировать, а тип я угадал dthyj.
Ты бы Си подучил прежде чем в плюсы лезть. Почитай про массивы, про array decay и как вообще с массивами работать. Ты, по идее, хочешь скопировать arr в sub. Или чтобы sub указывал на подмассив. У массивов нет такой семантики, только лишь у указателей.
О, пошла стандартная мантра про неосиляторство. Как будто в устаревшем низкоуровневом говне есть что-то сложное, лол.
>С вышкой физика
просто на твоей фирме кто-то тащит за тебя
возникают сложные проблемы, которые ты не видишь, но скиловые трудяги (с кодерской вышечкой, да, да) просто вовремя их решают и все
ты этого просто не замечаешь, делаешь текучку
но когда вот такой челик свалит на другую работку, эти проблемы придется решать тебе
и тут ты обосрешся
это касается всех вкатывальщиков - пока нужно выполнять текучку, они справляются
но как только случился факап - проблему они решить не могут
Хуйню пизданул. У меня у самого прогерская вышка, но там ничему такому о чем ты говоришь не учат. Умение решать такие задачи только на практике и нарабатывается. А в универе нам вообще лекции Кнута читали. И это еще не самый плохой вариант. Лучше уж Кнут чем книги фимозных преподов застрявших в эпоху Дельфи.
лабы, курсачи сам писал? диплом сам делал? вот тебе и практика.
никто не запрещает это на современных технологиях делать
если ты ничему не научился в вузе, то это не "эпоха дельфи" виновата...
Я то как раз всему и научился потому что поменьше доверял вузу и сам учился. И поэтому собственно и съебал с Рашки и теперь в Ирландии работаю. И да ирландские вузы ничем не лучше в этом плане. Алсо про лабы посмеялся спасибо. Учитывая уровень их полезности который стремится к нулю.
Двачую. Вкатывальщик проштудировавший SICP + HDTP уже на голову выше студента среднего тех вуза.
>всему и научился
>теперь в Ирландии работаю
>посмеялся спасибо
и сидишь такой в рабочее время на ресурсе для даунов, студентов и студентов-даунов. освещаешь нам путь к Знанию.
Он у меня только 14 минут как начался. Но ты прав. Надо работу делать.
Вопрос: Как в char-массиве выполнять арифметические преобразования?
К примеру: char-массив - 7 + 3.
Как преобразовывать 7 и 3 из char в int? Как мне это посчитать? Без использования стринг.
Это тебе надо драконью книгу читать. Тут нужно пилить свой компилятор.
>+ 3.
>Как преобразовывать 7 и 3 из char в int? Как мне это посчитать? Без использования стринг.
Прибавь к каждому символу '0' и домножь на базу, балбес
>как можно написать функцию, которая будет искать все возможные варианты сум какого-то числа?
Я как-то такую прогу писал, но она на другом компе. Гугли производящие функции, короче, может где-то найдёшь задачу про варианты размена суммы определёнными монетами, а потом обобщишь, я сам уже не вспомню, что там было конкретно.
>Сколькими способами можно разменять доллар монетами в
1, 5, 10, 25, 50
центов?
https://www.mccme.ru/ium/postscript/s12/gasnikov-5.pdf Вот тут есть пример.
> которая будет искать все возможные варианты сум какого-то числа
А, жопочтец, думал считает их количество. Гугли алгоритм генерации разбиений, беглый гуглинг вот такое выдаёт, вроде подходит.
http://old.tusur.ru/filearchive/reports-magazine/2008-1/113-119.pdf
Да уже выше скинули пару ссылок. Я по одной из них решил. Сейчас над другой хуйнёй голову ломаю, но тут уже сам буду решать. За помощь кстати спасибо, всем ответившим.
Предыдущее издание лучше с точки зрения нуба, правда оно написано еще до с++11.
В пятом издании он очень часто, иногда по нескольку раз на одну страницу, прибегает к формулировке "будет объяснено позже страниц эдак через 500-800", отчего остается слишком много открытых вопросов. В четвертом же издании весь материал изложен вполне последовательно, после прочтения, например, главы, остается минимум неясностей.
Алсо, в пятом издании то ли Липпман разучился излагать мысль, то ли это просто перевод шакальный, но там есть места, которые вообще не поддаются никакой логике. Так же часто у задачек дибильные формулировки.
>Для вкатывальщиков с нуля
>книга Страуструпа
Это шутка, мем.
С первых же страниц идут классы, такие штуки как new и т. п. Короче чтоб это читать нужно уже знать язык в объеме той же книжки Липпмана, например.
Нуфаг прочитавший Прату репортинг. Книга хорошая, дня полных нуфагов самое оно. Даст неплохую базу, но при этом читается вполне легко. В конце каждой главы есть задачи и вопросы по теории. Мне книга понравилась, когда начинал читать Липпмана не понял что он хочет уже на 80 странице и забил хуй. С Пратой таких проблем не возникало
потому книга страуструпа для обучения возможностям конкретного языка, а не для обучения программированию
и это правильно
прочитал дейтела спп по диагонали , покопипастил примеры - вообще нихуя не понятно, в первый раз вижу столько воды, ебашит рекурсию в 4главе, новичкам с 0 наверное кайф вообще
посоветуйте книгу по составлению алгоритмов на примерах(не обязательно цпп, но желательно), может быть притянутое ближе к стм\ардуино, чтобы примеры были "а че так можно было?" , как можно больше примеров надо чтобы разбиралось
вообще не понимаю как обрабатывать большое количество исключений, начинаю пиздец путаться в алгоритмах, хочу понять как думают люди кто разрабатывает что то больше чем линейный скрипт с двумя исключениями и автозапуском лол
Грокаем алгоритмы?
Потому-что итератор это объект, который хранит в себе указатель на какой-либо объект в контейнере. Для него перегружена операция разыменования, чтобы можно было этот объект через итератор достать.
С++ язык высокого уровня. На нем ты можешь писать как легкие, так и сложные программы. Все зависит от твоего уровня знаний.
Cпасибо!
>прочитал дейтела спп по диагонали , покопипастил примеры - вообще нихуя не понятно, в первый раз вижу столько воды, ебашит рекурсию в 4главе, новичкам с 0 наверное кайф вообще
Книги для обучения с нуля на С++ все говно. Я учил С++ когда за плечами был бейсик и делфи, было более-менее, хотя глаза у меня на все открылись после прочтения K&R и Дизайна и эволюции. А с нуля утопнешь в деталях, не видя сути.
>посоветуйте книгу по составлению алгоритмов на примерах(не обязательно цпп, но желательно)
Кормен. Но вряд ли тебе нужны алгоритмы.
>может быть притянутое ближе к стм\ардуино
Во-во, тебе не алгоритмы нужны. В эмбеде же примитивная логике везде.
>вообще не понимаю как обрабатывать большое количество исключений, начинаю пиздец путаться в алгоритмах, хочу понять как думают люди кто разрабатывает что то больше чем линейный скрипт с двумя исключениями и автозапуском лол
Кратковременная память у всех людей это объектов 7, поэтому если у тебя в функции больше 20 строчек, дели ее на логические блоки и дальше мысли уже этим блоками.
На самом деле у меня без проблем мозг парсит функции и по 150 строчек, но я просто мысленно выхватываю эти блоки, обзываю их и "не вижу" внутреннее содержимое. Но книги научиться так делать не помогут, надо кодить. Попробуй задачки порешать а-ля олимпиадные, но не сильно сложные.
Как-то так
std::ifstream in("file.txt");
std::vector<char> yoba;
std::copy(std::istream_iterator<char>(in), std::istream_iterator<char>(), std::back_inserter(yoba));
Это несомненно так.Только вот для выосокуровневых задач проще использовать другие языки. Сишку в основном для низкоуровневого говна используют
Как проверить на вместимость два параллелепипеда?
Попытался сделать, но выходит какое-то говно (пикрил).
С меня три.чаю.
1. Не используй транслит
2. Инициаилизруй и объявляй переменные ближе к месту использования, greatSec тебе нужно объявить перед соответствующим if'ом, не раньше
3. Пиши по возможности чистые функции и отделяй обработку от ввода и вывода данных. Вообще странно что у тебя есть объект parallelepiped и вместо int yoba::vmestimost(yoba drugoy_object) ты используешь вот эту лапшу
4. int great = 0;
int (условие) great++;
if (great == 1) - можно переписать как
if (условие) {
int great = 1}
Вообще с таким количеством if'ов эта переменная лишняя, достаточно else
5. Алгоритм у тебя "первая сторона больше всех сторон, вторая больше всех сторон, третья больше всех сторон" - неправильный. Например кубик 5,4,3 и 4,3,2. Один друг в друга влезут, но 3<4, значит по твоему коду не влезут.
Насколько я понимаю, нужно отсортировать стороны по размеру и попарно сравнить. Можно отсортировать хардкоженными ифами типа как тут https://stackoverflow.com/questions/4793251/sorting-int-array-with-only-3-elements , но вообще
6. У тебя длина, ширина и высота - искусстенные понятия. Если бы ты задавал параллелепипед массивом из 3 чисел, пришел бы к более очевидному решению
vector<int> yoba1 = {p1.dlina, p1. shirina, p1.visota};
std::sort(yoba1...);
vector<int> yoba2 = {p2.dlina, p2. shirina, p2.visota};
std::sort(yoba2...);
int great = 0;
for (int i =0; i < 3; ++i) {
if (yoba1 <= yoba2) {great--;} else if (yoba1 >= yoba2) {great++};
}
if (great == 3) ...//если они равны он это не сдетектирует
if (great == -3) ...
1. Не используй транслит
2. Инициаилизруй и объявляй переменные ближе к месту использования, greatSec тебе нужно объявить перед соответствующим if'ом, не раньше
3. Пиши по возможности чистые функции и отделяй обработку от ввода и вывода данных. Вообще странно что у тебя есть объект parallelepiped и вместо int yoba::vmestimost(yoba drugoy_object) ты используешь вот эту лапшу
4. int great = 0;
int (условие) great++;
if (great == 1) - можно переписать как
if (условие) {
int great = 1}
Вообще с таким количеством if'ов эта переменная лишняя, достаточно else
5. Алгоритм у тебя "первая сторона больше всех сторон, вторая больше всех сторон, третья больше всех сторон" - неправильный. Например кубик 5,4,3 и 4,3,2. Один друг в друга влезут, но 3<4, значит по твоему коду не влезут.
Насколько я понимаю, нужно отсортировать стороны по размеру и попарно сравнить. Можно отсортировать хардкоженными ифами типа как тут https://stackoverflow.com/questions/4793251/sorting-int-array-with-only-3-elements , но вообще
6. У тебя длина, ширина и высота - искусстенные понятия. Если бы ты задавал параллелепипед массивом из 3 чисел, пришел бы к более очевидному решению
vector<int> yoba1 = {p1.dlina, p1. shirina, p1.visota};
std::sort(yoba1...);
vector<int> yoba2 = {p2.dlina, p2. shirina, p2.visota};
std::sort(yoba2...);
int great = 0;
for (int i =0; i < 3; ++i) {
if (yoba1 <= yoba2) {great--;} else if (yoba1 >= yoba2) {great++};
}
if (great == 3) ...//если они равны он это не сдетектирует
if (great == -3) ...
У gcc есть какой-нибудь ключ который проверяет пометил ли я в производном классе виртуальную функцию как override?
Спасибо
вкатывальщик - кун итт.
Что лучше для вката в с++, читать книги/смотреть курсы или делать небольшой проект?
Проект по моим прикидкам довольно простой и там не сколько сами плюсы, а больше использование библиотеки и готовых методов.
Поешь говна.)
ОПРЕДЕЛЯЕШЬ ШАБЛОН ОПЕРАТОР ВЫЗОВА ДЛЯ УДОБСТВА
@
ЧТОБЫ ПОТОМ ПИСАТЬ huy.template operator<ebat>(rot_straustrupa);
копируешь массив во временный массив
этот временный массив передаешь в функцию, она отрабатывает
дальше работаешь с измененными данными во временном массиве
удаляешь временный массив
все это можешь завернуть в собственную функцию-обертку
>вкатывальщик - кун
уже знаешь на что потратишь заработанные кучи бабла?
поездки на море неск раз в год, небодяженый кокс и 18ти летние шлюшки? да?
а если к тебе, положим, на улице подойдет незнакомый челик, и попросит метнуться ему в магаз за сигами? сделаешь?
Читай книги и смотри курсы. Причем с уклоном в байтоебство. Проект писать не советую, тк ты просто напишешь его слабо. Хотя можешь проделать следующую вещь. Написать небольшой проект с текущем уровнем знаний, прочитать тройку другую книг, пересмотреть еще несколько курсачей, подрочить на стаковерфлоу месяцок другой и потом написать тот же самый проект уже с новым багажом знаний. Сравнить свои работы.
Я думал один всегда бурчу на Страуструпа во время написания кода, лол.
В стандартной библиотеке, как раз все так и устроено, даже еще более кастыльней. На плюсах по-другому не сделать.
Аноны, разбирающиеся в матане, можете подсказать правильно ли я понял алгоритм?
Сначала мы имеем два многочлена какой-то степени. Далее мы расширяем их степень до 2n-1, и в первый мы записываем ну или принимаем как чётные части результируещего многочлена, а во второй - нечётные. Далее мы ищем узлы интерполяции которые равны корню из комплексной единицы в степени n, и после ищем значении A(x^2)+x*B(x^2)в этих точках, и поскольку поточечное умножение равно свёртке функций, то мы записываем его в результирующий массив. После интерполируем полученные значения и на выходе получаем многочлен-результат. Так, или где-то ошибки есть? Голова уже не варит пиздец
>Компик себе куплю, буду в игоря играт
ммм
то есть 8м часов отъебашишь в офисе за компом
придешь домой и будешь еще 4+ часа сидеть за компом но уже "разлекаться"?
меня так на 3 года хватило, потом я кончился как программист и как человек
>Сишку в основном для низкоуровневого говна используют
Ай да мудило, хуй тебе в стыек.
Все обстоит ровно наоборот. Сишку используют для души, для возвышенного. Сишка - это наивысший уровень блаженства.
А всякая ентерпрайз-хуита вроде джавы или ришотки - это бизнес-задачи, это приземленное, это низость.
Во первых если мы говорим о чистом Си без богомерзких плюсов то возможно. Во вторых, джава для высокоуровневых задач намного лучше. В третьих, твои возвышенные речи подошли бы лиспу. Вот он действительно возвышенный а богомерзкий си и его отроки для бизнеса и прочего говна
Блокнот
Ох ебать давай, чем твоя кодерская вышечка тебе так помогла прям?
Я если че и в ОС/алгоритмах[/сетях не хуже колег шарю, работаю в БОЛЬШОЙ ИЗВЕСТНОЙ КОМПАНИИ.
>или указатель на локальную переменную
Потому, что они находятся на стеке, а стек довольно быстро перезаписывается.
>А как тогда правильно возвращать сишную строку?
1. В теле функции выделить память каким-нибудь malloc-ом, запихать туда строку и вернуть указатель на память.
2. Передать в эту функцию указатель на память.
бамп
Быдловид.
для расширения функциональности классы стандартной библиотеки рекомендуют агрегировать, а не наследоваться от них, тому есть причины, которые нет желания здесь объяснять
также поведение стандартных контейнеров расширяется введением собственных шаблонных функций, принимающих итераторы, либо делают более специализированную функцию, принимающую конкретный контейнер, их еще называют "функции помощники"
в случае если функция-помощник делается для твоего класса, ее можно объединить в одно пространство имен, но засорять пространство имен std не рекомендуется
clion робит быстрее vs? да ладно
нет
Э, ты не путай уровень языка с уровнем задач.
Язык относят к высокому/низкому уровню исключительно по тому, насколько приходится иметь дело непосредственно с железом при написании программ, все остальное от лукавого.
А уровень задач, решаемых с помощью языков - это вообще в значительной мере субъективная штука. Софт для марсоходов, например, писался на С, и называть это задачей низкого уровня по меньшей мере странно. С другой стороны, задача запилить персональный хоум пейдж в интернетике, например. Решается задача при помощи языков высокого уровня. Однако, сама задача - плевое дело, высокой квалификации не требует, ну никак нельзя сказать, что это задача высокого уровня.
удачно вкаттился в кресты.
теперь думаю набираться знаний и пробовать через 1,5-2года вкатиться в геймдев.
что осваивать? опенгл? фреймворки для 2д игрушек для начала?
с чего начать и куда рыть?
заранее спасибо.
платформеры лучше клепать на %языкнейм
ангельский ? + еще полтора года
заходи на сайты уехавших компаний и смотри требования, дизайнить локации у них есть местные индусы, чтобы вкатиться нужно быть сеньером помидором с 6+лет стажем за 5-8к бачей, когда все другие отрасли на с++ уехавшие имеют ощутимо больше, линейная алгебра и спп эксперт кноулейдж
все валят на мобилки потому что деточки подрастают новые, и им уже нахуй не нужно пк, а если не для бизнеса можно долбиться куда хочешь
>удачно вкатился в кресты.
за 21 день ?
Удачно значит зарабатываю этим деньги теперь. Очевидно же
>на крестах
меинстрим это не >почти весь
как ты с такими формулировками своих вопросов докатился до работы на плюсах
определись с направлением и должностью, там видно будет
Sup
Вопрос по openmp
Если подрубаю распараллеливание, в X и Y часто оказываются одинаковые числа, если заполнять их нормальным распредлелением (пик 2, явно видна наклонная линия). Если заполнять их биномиальным, то проблема отсутствует (пик 3).
Если генератор случайных чисел не threadsafe, то почему нормально отрабатывает биномиальное распределение?
>Если генератор случайных чисел не threadsafe, то почему нормально отрабатывает биномиальное распределение?
Какая нахуй разница, как проявляется UB?
Спасибо!
Одновременное обращение к двум разным элементам одного массива это data race? Даже если оба потока, как в моём случае, пытают прибавить единицу?
Ой-вей... ГПСЧ имеет состояние. Которое он меняет при запросе следующего числа.
Использование не-потокобезопасных методов у объектов из разных потоков без синхронизации ведёт к data race и UB.
Да, это инициализация элемента типа VkPushConstatntRange.
Ебанутый синтаксис у этого вашего си++, вот и не понимаешь.
Это же надо додуматься, фигурными скобками обозначать кучу семантически разных вещей, таких как: операторные скобки/локальные скоупы, определение класса, определение структуры, тело функций/методов, определение перечислений и инициализация массива/структурытут вообще заебись: разделитель - запятая вместо точки с запятой. Но зато столько дрочева на cout << hui << endl и вырвиглазные лямбды, шо пиздец.
у тебя 3 вида скобочек в распоряжении, все заняты
альтернатива скобочкам - ключевые слова
но си проектировался в первую очередь с соображением лаконичности, чем синтактической чистоты
Если бы действительно делали упор на лаконичность, то получился бы форт. А так взяли алгол и заменили begin/end на {}
В лиспе скобочки только для одного - применение параметров к функции, или макросу.
си - структурная парадигма программирования, практичный алгол, в общем, а форт - стековый яп, сравнивать их вообще нельзя
Наверное, чтобы они могли конвертиться друг в друга, через конструктор преобразования или конвертирующий оператор
Ну то есть чтобы набил i++ + ++i, глянул подсказку как оно считаться собирается и сразу понел, что хуиту написал.
бля, возьми да распечатай себе табличку с приоритетом операторов и не еби вола. двадцать раз в неё посмотришь, на двадцатьпервый уже смотреть не будешь
Ахуеть, вот это ты ленивый. Не выебывайся и подрубай дебаг, если в уме просчитать не можешь.
ммо фармил во время пар по комбинаторике?
VS делает светлосерыми ненужные скобки когда видит что по порядку вычисления они не нужны.
Компиляторы же (гцц как минимум) в таких случаях справедливо информируют тебя о том, что ты мудак.
порядок вычисления выражений вообще то не определен :;
>Если бы действительно делали упор на лаконичность, то получился бы форт.
Ты бы ещё "брейнфак" вспомнил.
тулинг
Перестань стрелять себе в ногу. Сам потом нихуя не поймешь.
void vvod(double x)
{
cin>>x;
}
, но чтобы это работало?
Разрешаю.
ну бля я же не могу как со структурами массив объектов сделать автоматически, чтобы потом эта функция всё брала оттуда
всё я придумал как сделать спасибо
-функция-друг, позволяющая определить общую стоимость устройств, входящих в оборудование;
я придумал как реализовать это вне самого класса, а как так хз
тут тоже всё понял, но тогда следующий вопрос:
Вот создаю я массив объектов, но ведь тогда у меня по сути объекты без переменной, а просто arr[0], arr[100]. Можно ли их как-то обзывать?
И как задетектить все созданные объекты определённого класса (Если заранее не был предусмотрен массив)?
Создаешь массив указателей на объекты.
Аргументом конструктра суешь массив, this бушбэчишь.
Например.
А, или static член-массив.
Обоссыте но не бейте, алгоритм вроде бы правильно составил, но с массивами в с++ не получилось. Как сделать функцию которая принимает массив и возвращает тоже массив?
https://pastebin.com/QRKUjn60
>Как сделать функцию которая принимает массив и возвращает тоже массив?
Прочитать Кернигана и Ричи. Также прочитай вот это http://acm.mipt.ru/twiki/bin/view/Cintro/CfaqPointer , ты соснул на пункте 2.6
Твой вуз - говно, если учит тебя алгоритмизации с помощью сишки, которую еще к тому же называет с++.
В сишке массив - это только статический массив с известно заданным размером. То есть int arr[5]; это массив. В крайнем случае int arr[] = {1,2,3,4,5};, так как тут размер известен из присваивания и все. Это будет массив, который компилятор выделит тут же в текущем скоупе на стеке.
Когда ты пишешь int yoba[] в параметре функции, это полный эквивалент int@ yoba (@ - это звездочка) - то есть указатель на какой-то буфер с интами неизвестной длины. Соответственно не работает у тебя, потому что sizeof(nums) равен вовсе не тому, что ты думаешь, он равен будет размеру указателя на твоей системе. набери std::cout << sizeof(nums) << std::endl; и проверь.
Сделай вот так
yoba(int@ arr, int arr_length), а лучше yoba(int@ arr, size_t arr_length)
Возвращать тебе ничего не нужно, потому что ты передаешь указатель, и функция будет менять данные по этому указателю.
Если ты не хочешь менять входной массив, а хочешь иметь два массива, то нужно написать такую сигнатуру:
void yoba(int@ input, int@ output, size_t arr_length).
А вызывать так:
int input = {1,2,3,4,5};
int output[5];
yoba(input, output, 5)
С динамическими массивами yoba тоже будет работать:
int len = 5;
int@ input = (int@) malloc(len @ sizeof(int))
int@ output = (int@) malloc(len @ sizeof(int))
yoba(input, output, len);
И на будущее запомни: не вздумай никогда вызывать malloc внутри подобной функции, выделяй память всегда снаружи и там же освобождай.
vector<int> yoba(const vector<int>& yoba_input){}
А вызывай так:
vector<int> vec(5);
vec = yoba(vec);
Для экономии можно in-place обработку сделать:
void yoba(vector<int>@ yoba), но лучше не надо.
Тогда уж лучше сделать как-то так, чтобы не засорять логику маллоками и сайзофами:
typdef struct (
int@ items;
size_t len;
) moi_massiv;
moi_massiv@ create_moi_massiv(size_t len) ...
moi_massiv@ moi_massiv_from_array(int@ i, size_t len) ...
void delete_moi_massiv(moi_massiv@ m) ...
some yoba(moi_massiv@ massiv) ...
и использование:
int len = 5;
moi_massiv@ input = create_moi_massiv(size_t len);
moi_massiv@ output = create_moi_massiv(size_t len);
yoba(input, output);
delete_moi_massiv(moi_massiv@ input);
delete_moi_massiv(moi_massiv@ output);
Лучший вариант я предложил - использовать vector. А ему надо лабу сдать, а не велосипеды пилить.
Само придет
мимо-вкатился пол год назад
Плюсы -- язык, способствующий к спокойствию, умиротворению и полному безразличию к жизни.
Старые просто
Переполнения буффера попробуй. Разберешся как работает память, поймешь и указатели, и битовые операции, и заодно поймешь, что С строки не нужны.
>Переполнения буффера попробуй.
о, да
с сегодняшними механизмами защиты что стоят в операционках по умолчанию, заебешся воспроизводить типовой пример из какого-нибудь учебника по безопасность 15ти летней давности
тот еще челлендж
Не могу найти, писец у буста документация говно.
int a;
};
class B : public A {
int b;
};
int main() {
B b(8,9);
std::vector<A> v;
v.push_back(b); // crash
}
che delat
a ne, sore vse norm rabotaet, eto ya dolboeb
Что сказать-то хотел? Чтобы класс был без vtable, чтобы тривиально создавался/перемещался, чтобы был POD?
Блюди субботу.
>Вопросы по синтаксису идут на хуй
А можно спросить несколько тупых вопросов про перегрузку оператора присваивания, конструкторы копирования/перемещения, всё это с ссылками и без. Или посоветуйте книжку/статью, где это в подробностях описано - в моей про перегрузку почти ничего не было, описаны только простейшие штуки.
Вот что-то типа такого. Можно не отвечать (хотя я бы не отказался от некоторого внесения ясности), просто для примера.
Простейший класс, у него перегружено присваивания для int. Четыре варианта. Что я тут написал и какой вообще смысл у каждого, лол?
1. Вызывается пустой конструктор, потом операция присваивания, деструктор. this - указатель на реальную переменную a, всё это аналогично обычному вызову метода. return this нужен, только если я хочу написать конструкцию вида b=a=17. Верно?
2. Тут уже не слишком понятно, вызывается конструктор, оператор присваивания, и уже после него на строчке с return вылезает конструктор копирования для временного объекта и тут же деструктор для него. Походу, это итоговое значение выражения "a=17", которое просто генерируется и тут же исчезает? Зачем это нужно, если есть вариант с ссылкой? Кормить функцию, которая необратимо повреждает экземпляр класса, и потому нужно подобную копию?
3. ... Если у меня два вектора и я хочу реализовать сложение, мне приходится подобным образом создавать временный объект b и в конце функции его возвращать.
Почему тут не вызывается оператор копирования/переноса, как это вообще работает? b внутри функции просто априори совпадает с y, то есть return и b вижу только я - для программы его как будто не существует. Если я правильно это понимаю, должна выделится на стеке память под a и y, и ещё во время вызова функции/перегруженного оператора должна на том же стеке выделится память под b, которая в конце функции перемещается в y, после чего стек освобождается. Тем не менее, этого не происходит, этой b как будто просто нет, заместо неё сразу стоит y, для которой используется обычный конструктор по умолчанию и после применяется перегруженный оператор как метод.
А если возвращать значение по ссылке, то ide выдаёт предупреждение, что тут возникает ссылка на объект на стеке, что вызовет (и вызывает) падение программы.
4. Тут всё ясно, кажется.
-44 и +4 — указатели на a и второй экземпляр.
>Вопросы по синтаксису идут на хуй
А можно спросить несколько тупых вопросов про перегрузку оператора присваивания, конструкторы копирования/перемещения, всё это с ссылками и без. Или посоветуйте книжку/статью, где это в подробностях описано - в моей про перегрузку почти ничего не было, описаны только простейшие штуки.
Вот что-то типа такого. Можно не отвечать (хотя я бы не отказался от некоторого внесения ясности), просто для примера.
Простейший класс, у него перегружено присваивания для int. Четыре варианта. Что я тут написал и какой вообще смысл у каждого, лол?
1. Вызывается пустой конструктор, потом операция присваивания, деструктор. this - указатель на реальную переменную a, всё это аналогично обычному вызову метода. return this нужен, только если я хочу написать конструкцию вида b=a=17. Верно?
2. Тут уже не слишком понятно, вызывается конструктор, оператор присваивания, и уже после него на строчке с return вылезает конструктор копирования для временного объекта и тут же деструктор для него. Походу, это итоговое значение выражения "a=17", которое просто генерируется и тут же исчезает? Зачем это нужно, если есть вариант с ссылкой? Кормить функцию, которая необратимо повреждает экземпляр класса, и потому нужно подобную копию?
3. ... Если у меня два вектора и я хочу реализовать сложение, мне приходится подобным образом создавать временный объект b и в конце функции его возвращать.
Почему тут не вызывается оператор копирования/переноса, как это вообще работает? b внутри функции просто априори совпадает с y, то есть return и b вижу только я - для программы его как будто не существует. Если я правильно это понимаю, должна выделится на стеке память под a и y, и ещё во время вызова функции/перегруженного оператора должна на том же стеке выделится память под b, которая в конце функции перемещается в y, после чего стек освобождается. Тем не менее, этого не происходит, этой b как будто просто нет, заместо неё сразу стоит y, для которой используется обычный конструктор по умолчанию и после применяется перегруженный оператор как метод.
А если возвращать значение по ссылке, то ide выдаёт предупреждение, что тут возникает ссылка на объект на стеке, что вызовет (и вызывает) падение программы.
4. Тут всё ясно, кажется.
-44 и +4 — указатели на a и второй экземпляр.
Нахуя графика нужна? Она все равно нормально нигде работать не будет, и не будет совместима ни с одним фреймворком.
>1. Верно?
Да
>2. Зачем это нужно
Не нужно
>3.
Похоже тебя посетил RVO, это к удаче и богатству, попробуй скомпилировать без оптимизаций. Хотя наверно ты так и делаешь, а конпеляторы нынче дохуя умные.
Например. Есть две группы методов, работающие с double, но в этих методах эти double означают разные вещи и хочется, чтобы это было понятно из типов, и компилятор не позволил бы смешать их в одном выражении.
Одно из решений - сделать класс-обёртку, но так, чтобы в рантайме не создавались никакие объекты, и везде были чистые double.
Ты не boost units изобретаешь случайно?
Вообще это гуглится по "c++ strong typedef".
https://stackoverflow.com/questions/34287842/c-strongly-typed-using-and-typedef
https://www.fluentcpp.com/2017/05/05/news-strong-types-are-free/
>Ты не boost units изобретаешь случайно?
Нет. Помимо double это может быть вообще какой угодно тип/класс. Главное, чтобы машкод с этой абстракцией получался тот же самый, что и без.
>Вообще это гуглится по "c++ strong typedef".
Спасибо.
Недавно к ней запилили х64 поддержку добавив х64 либы оракла. Но это чудо работает лишь под винду, х86 линукс и бсд.
В чем могут быть косяки? Я хуй знает. Ошибки имеются в плане char, как я понял, как эту хуйню пофиксить? Статический анализатор говорит мне лишь о data loss в интах. Но там и не подаются значения больше обычного инта.
>попробуй скомпилировать без оптимизаций
Так и делал. Я нашёл - если компилировать return (b), заместо return b, то move-конструктор на месте. Что любопытно, даже -O3 не оптимизирует эту глупую скобочку, всё-равно вызывается дополнительный конструктор.
>Я нашёл - если компилировать return (b), заместо return b, то move-конструктор на месте
Пиши багрепорт, лол. Это пиздец, коли так
очевидно же что проблему могут решить люди более высокой квалификации чем ты, сладенький
нет, я Ленин
Но поскольку мне важны именно приоритеты, я не могу понять где именно они назначаются. И почему в данном коде нет операций со скобками, хотя в теории пишут также что в итоговом выражении скобок быть не должно? Может кто выделить часть где там назначаются приоритеты операциям?
Говорю наобум, как бы сам сделал.
Два треда. Первый принимает данные, записывает в буфер (размер - N страниц памяти, попрофилируй, как лучше). По заполнению ставит в очередь второму потоку (и дёргает кондвар какой-нибудь). Второй поток только и делает, что берёт буфер из очереди и записывает в файл (а если данных нет, крутится или спит на кондваре).
Оптимизации:
1) Пул буферов (то есть первый поток берёт оттуда свободные буферы, а второй отдаёт туда использованные).
2) Лок-фри очереди
3) Попробовать использовать OVERLAPPED/AIO вместо того, чтобы городить два треда. Но я с ними почти не работал и не знаю их оверхед.
Но ~65 мегабайт/с это приличная скорость, как бы у тебя писатель не был перегружен.
Спасибо большое, попробую что-нить сделать. В какой сфере работаешь и сколько лет опыта, если не секрет?
Задача про бассейн и две трубы из школы. Что мы имеем. Быстрый процессор, 500 мегабит в бассейн вливается, остается выяснить, с какой скоростью выливается. Если у тебя SSD, выливаться будет очень быстро. Поэтому просто берешь и делаешь и сохраняешь данные в файл стандартным ofstream'ом. Даже в память можешь не складывать. И асинхронности никакой не нужно.
Если же у тебя HDD и выливается не так быстро, то имеет смысл от mmap'ить файл и скидывать данные прямо туда. Получится многопоточное решение, где один поток это твоя прога, а второй - ядро ОС.
На крайняк буфер и два потока, один пишет, другой читает. Собственно, если у тебя данные с какого-то прибора, не сети, свой буфер понадрбится.
>>303877 - ебанутый оверинжинер и преждевремянный семяизвержитель оптимизатор. Всем KISS
Ты сказал ? Шилдт известный автор книг по программированию
А потом получить доступ?
Тебе именно в структуру записать, или считать структуру? Впрочем метод всё равно один будет .read((char *) &(хуйню в которую читаешь),&(размер хуйни в байтах)). Таким же способом можно считать и целую структуру в заранее созданный обьект. Про доступ не понял, у структуры все члены открытые по умолчанию.
Ой, блэд, хуйню написал. Тупой щито поделать.
Надо считать структуру, а потом как нибудь пользоваться данными из неё.
Чары отдельно, инты отдельно. И пользоваться данными их них
>>>1303877 - ебанутый оверинжинер
Уж расписал по полной. Я думал, что он самый простой вариант уже проверил и не сработало. А про mmap я и не подумал как-то. Самый лучший вариант будет, возможно.
Нихуя не понял опять. Берешь и считываешь целую структуру, в чём проблема? Скажем структура struct MyStruct. Создаешь обьект MyStruct first. Создаешь обьект офстрима и считываешь как я выше написал. Можно считать целую структуру, проблем нет
Ладно, пойду перечитаю лекцию. Я первокур который хуйнёй страдал на лекциях.
А надо делать индивидуальное задание. И хоть его через месяц сдавать, но жопа то подгорает от непонятности.
Реализуешь operator<< и operator>> примерно таким образом https://thispointer.com/c-how-to-read-or-write-objects-in-file-serializing-deserializing-objects/
friend std::ostream & operator << (std::ostream &out, const Student & obj)
{
out << obj.mId << "\n" <<obj.mName<<"\n"<<obj.mPhoneNumber<<std::endl;
return out;
}
Дальше просто открываешь файл через ifstream и читаешь ,через ofstream пишешь с помощью file << yoba;
Если нужно бинарно сохранять, то как-то так
std::ostream& operator<<(std::ostream& out, const MyClass& obj) {
out.write(reinterpret_cast<const char*>(&obj.field1),
sizeof(obj.field1)); // or something better defined
// ...
return out;
}
Самый кайф в таком подходе, что он может даже в рекурсию
Тебе там анон выше неплохую вещь советует.
Бтв чего непонятного? Структура в памяти хранит свои поля последовательно, в файле байты лежат в таком же порядке.
Пример: в .jpeg-файле сначала идёт хедер байта определенной длины. Просто байты. Ты считываешь их в нужную структуру и получается, что эти байты кладутся на твою структуру и ты теперь можешь обращаться к полям структуры. Так же с хедером изображения и самими данными изображения. Я вообще считывал весь _двумерный_ массив пикселей в char[height*(width+offset)] и с ним работал.
Как раз потому что все просто лежит последовательно.
Или вот так: представь себе слепого. Он умеет держать в правой руке члены, а в левой - анальные пробки с хвостами и прекрасно знает, какие они на ощупь и потому ругается, если ему их дают наоборот.
А рядом два ящика - один с членами, а второй с пробками. Этот несчастный слепец опускает руки в ящики и достает оттуда предметы. И, так как в правой руке у него только члены, а в левой только пробки, то они идеально сидят у него в руке. И теперь ты можешь у него спросить, какой длины член в правой руке и насколько пушистый хвост в левой.
Вот руки его - структура, а ящики - файл. Так понятно?
Ну и, если предметы в ящиках перепутаются, то он по-прежнему будет их считать правильными, но отзыв о них тебе даст уже ложный. Это уже если ты не знаешь о том, в каком порядке у тебя лежат байты в файле.
Хедер файла определенной длины*
быстрофикс
С jpeg сложнее должно быть, подробнее про .bmp:
То есть там сначала структура bitmapfileheader, структура bitmapinfoheader, а потом куча структур rbgtriple.
У каждой из них поля a, b, c, d и т.д.(чесслово, не помню наизусть) определенной длины в байтах - значит, в файле будут лежать длина_в_байтах(a) байт, длина_в_байтах(b) байт, длина_в_байтах(c) байт и т.д.
При объявлении переменной типа нужной тебе структуры, ты выделяешь память, равную сумме длине полей этой структуры с разделителями в порядке объявления. И просто байты из файла накладываются на неё.
Пускай более умный/шарящий анон меня поправит, если я где не совсем прав.
Разделители - очень образно, их на самом деле в памяти нет.
Да и программа не знает, что там и в каком порядке.
Считала 20 байт из файла - положила их в структуру длиной 20 байт.
И пускай структура вроде
struct myStruct{
int i,
int j,
int k,
int l
}.
И тогда, если ты не проебался и читаешь с нужного места, подряд идущие 1234 в твоём файле считаются побайтово и запишутся последовательно в структуру - i == 1, j == 2, k == 3, l == 4.
Да блядь, ну хули я такой невнимательный.
Там на одно интовое поле больше должно быть, чтобы все было правильно при 20 байтах.
Гугли универсальные ссылки, либо из шапки возьми эффективное программирование Скотт Мейерс 2014г если не ошибся, глава 5 практически полностью про это.
Да, я не смог в эмбед логику, минус проект минус жизнь(минус мотивация за неделю)
Как смочь в логику простую? особо тяжело даются ответвления(отработки исключений всякие логические) в коде, умл не осилил хотя думал что поможет разобраться
пикрандом
Благодарю, я почитаю, прям то что надо.
Дело было в том, что нужно было не просто универсальную ссылку, а ещё с перегрузкой, тому что функция имела схожий смысл для двух разных типов (код совпадал только для двух разных ссылок, но не типов), которые передавать не по ссылкам оче долго.
Там прям глава была:
>Избеrайте переrрузок дnя универсаnьных ссыnок
Теперь даже не знаю как лучше, лол. В реальном коде выглядит ещё хуже. Может быть я не привык просто, но нужен какой-то более вразумительный синтаксис для ограничения типов шаблонов, мне кажется.
И не совсем понятно зачем смешали синтаксис для универсальной и rvalue ссылки - не вижу никакой логики. Сделали бы что-то отдельное вроде T# или T@ - можно было бы применять в функциях без всяких угрёбищных шаблонов, смысл интуитивно понятен, да и компиляторам проще разбирать код.
>более умный/шарящий анон меня поправит
выравнивание структур
паковать их надо в данном случае
Там в конце 5 главы рассказывается как избежать этого. Тебе нужно перегрузить один шаблон чтобы он был универсальным, а внутри самой функции распределять нужные тебе операции с помощью std::forward. Диспетчеризация дескрипторов, вроде так называлось
Не надо надеяться на язык в данном случае. Пишешь вручную сериализатор и десериализатор и горя не знаешь.
std::getline(std::cin, title);
Но она срабатывает только для первого объекта, а для остальных пропускается. Почему?
Ты объебался с русским языком. "Необходимо равны" означает не "обязательно равны", а "настолько равны, что на разницу между ними можно забить".
По поводу примера: рабочий точит деталь с допуском +/-128 мм. На чертеже деталь имеет некий размер 1000 мм. Рабочий один раз выточил 951 мм, а второй раз 1050 мм. Ну и похуй, потому что в допуск он уложился. Результаты 951 мм и 1050 мм необходимо равны при заданном e = 128 мм.
Фихтенгольц конфетка, он объясняет для полных даунов, ты просто немного перемудрил, со всеми бывает. Сам сдавал по нему всякое дерьмо, готовясь за часы до экзамена.
>Ты объебался с русским языком
Ты тоже
> "Необходимо равны" означает не "обязательно равны", а "настолько равны, что на разницу между ними можно забить".
Нет. Это близко к выражению "необходимо и достаточно"
Если из A => B (и А следует B), то B необходимо, чтобы было A, а A достаточно, чтобы было B.
"то а и б необходимо равны" на современный русский язык переводится как "то следовательно, а и б равны". В твоем примере из
>Результаты 951 мм и 1050 мм необходимо равны при заданном e = 128 мм.
получается "мы задали e=128, следовательно 951=1050", что есть бред. 951 и 1050 не равны, потому что можно задать e=10
Мимопроходил
> B необходимо, чтобы было A, а A достаточно, чтобы было B
Наоборот же. Для A необходимо, чтобы было B. Ведь без B нет A. Для B достаточно, чтобы было A. Но не необходимо, ведь кроме А могут быть другие предпосылки. Посуди.
C => B, C |= C,B,
но
С => B, C |\= A
Подумай ещё раз.
И вообще в таком контексте "необходимость" напоминает скорее "необходимость/случайность - necessity/contingency" из модальной логики, чем "необходимость/достаточность - necessity/sufficiency". То есть НЕОБХОДИМО, чтобы они были равны - не существует такого варианта событий, при котором они не равны.
>Для A необходимо, чтобы было B
Я так и написал. Обрати внимание, что у меня нет "для", а просто "B необходимо, чтобы было A". Просто тебе падеж не очевиден. Если В - это Вася, то я сказал "Вася необходим, чтобы было А". А не "Васе необходимо, чтобы было A", как ты подумал.
>И вообще в таком контексте "необходимость" напоминает скорее "необходимость/случайность - necessity/contingency" из модальной логики, чем "необходимость/достаточность - necessity/sufficiency". То есть НЕОБХОДИМО, чтобы они были равны - не существует такого варианта событий, при котором они не равны.
Он-то написал '"Необходимо равны" означает не "обязательно равны", а "настолько равны, что на разницу между ними можно забить"', что прямо противоположно "не существует такого варианта событий, при котором они не равны".
> получается "мы задали e=128, следовательно 951=1050", что есть бред. 951 и 1050 не равны, потому что можно задать e=10
Ваш спор об особенностях описания условий русским языком тут бесполезен, потому что ты тупой и не можешь понять очевидных вещей.
Для е = 128 имеем условную равность 951 и 1050.
Для твоего е = 10 уже условно равны 951 и 960.
И именно в этом смысл того, что написано на пикче, которую ты приклеил к своему посту. только почему автор решил именно так это описать - хуй знает
Для любого студентика, который осилил хоть немного походить на пары матанализа, знакома такая хуйня: lim (an) = A - значит, что начиная с какого N для всех n > N выполняется условие |а - A| < e, где е - эпсилон - больше нуля.
И для нормального человека ясно, что "больше нуля" == невероятно мало, но не ноль.
А потом, когда узнаешь о вычислительных методах, поймёшь, что это е - это точность вычисления.
И для заданной точности е==128 и е==10 равными будут разные числа, сечешь?
Хотя, видимо, вы настолько проблемные в своем пту колледже, что вас к понятию предела готовят такой леммой.
То есть в Кнута вкатываться ?
Лол я тоже сначала так подумол, но этот всё правильно расписал.
Стиль жопочтения очень похож. Выдумал "условное равенство", которого в лемме нет, подумал, что эпсилон в матане - это машинный эпсилон, плюс подростковый уровень речи на оскорблениях, который ставит в ситуацию, когда не просто школьник чего-то в матане недопонял, а школьник общается типа на равных.
Лаба.
А, блин, не дочитал.
>pow не работает с отрицательными значениями
И? Раз лаба, значит первый курс. Раз первый курс, значит матан. Вспоминай, какая симметрия у кубического корня.
Вычисляй по абсолютному значению, к результату прилепляй знак исходного, очевидно же.
AB&C& по алгоритму обратной польской записи. Как можно разбить это выражение на части согласно приоритету? Пытаюсь вывести поэтапное решение вида A&B и A&B&C ну или &C . В данном примере если разбивать с помощью стека, как если бы мы выполняли вычисления, всё работает. Но на более сложных как, например AB&C+D/* я не могу придумать алгоритм. Может кто помочь с этой хуйней? Уже второй день голову ломаю, и в итоге ничего не придумал.
>>304063
Долбоёб первокур снова на связи.
Братаны, спасиба :3
Правда я не так сделал, а как долбоёб в квадрате, но всё же заебись. (Препод требует чтобы в плюсах мы писали как в си)
file = freopen("rooms.txt", "r", stdin);
struct Komnata
{
int ID;
char ros[8];
int chel;
int cost;
};
int i = 1;
struct Komnata nomer[1000];
while (col>i)
{
scanf("%d %s %d %d", &nomer.ID, &nomer.ros, &nomer.chel, &nomer.cost);
i++;
}
А как прочитать файл так что-то можно было использовать команды?
Вот у меня файл и нужно использовать вот эти адд, гет, и их подкоманды, инком, клиент. Начальная цифирька — количество строк. Я её прочитаю без проблем, а остальное?
7
ADD CLIENT SERVICE = ECONOMY BEGIN_DATE = 11.07.2020 END_DATE = 28.09.2020
GET INCOME BEGIN_DATE = 15.07.2020 END_DATE = 28.07.2020
GET QUEUE ID = 170 DATE = 27.12.2020
ADD CLIENT SERVICE = COMFORT BEGIN_DATE = 03.04.2020 END_DATE = 05.06.2020
ADD CLIENT SERVICE = STANDART BEGIN_DATE = 22.09.2020 END_DATE = 17.11.2020
GET QUEUE ID = 246 DATE = 27.12.2020
GET ROOM ID = 567
Как считать их куда нибудь отдельно, чтобы потом брать и использовать? Команду адд клиент туда, тип комнаты эконом туда, даты туда?
Причём команды по количеству символов разные, хуй поймёшь, короче.
Вот про такое на лекциях вообще помоему не говорили даже как реализовывать потом эти команды. Типо на свитчах и ифах всё это строить? Или как-нибудь в подпрограммы кидать?
>>304063
Долбоёб первокур снова на связи.
Братаны, спасиба :3
Правда я не так сделал, а как долбоёб в квадрате, но всё же заебись. (Препод требует чтобы в плюсах мы писали как в си)
file = freopen("rooms.txt", "r", stdin);
struct Komnata
{
int ID;
char ros[8];
int chel;
int cost;
};
int i = 1;
struct Komnata nomer[1000];
while (col>i)
{
scanf("%d %s %d %d", &nomer.ID, &nomer.ros, &nomer.chel, &nomer.cost);
i++;
}
А как прочитать файл так что-то можно было использовать команды?
Вот у меня файл и нужно использовать вот эти адд, гет, и их подкоманды, инком, клиент. Начальная цифирька — количество строк. Я её прочитаю без проблем, а остальное?
7
ADD CLIENT SERVICE = ECONOMY BEGIN_DATE = 11.07.2020 END_DATE = 28.09.2020
GET INCOME BEGIN_DATE = 15.07.2020 END_DATE = 28.07.2020
GET QUEUE ID = 170 DATE = 27.12.2020
ADD CLIENT SERVICE = COMFORT BEGIN_DATE = 03.04.2020 END_DATE = 05.06.2020
ADD CLIENT SERVICE = STANDART BEGIN_DATE = 22.09.2020 END_DATE = 17.11.2020
GET QUEUE ID = 246 DATE = 27.12.2020
GET ROOM ID = 567
Как считать их куда нибудь отдельно, чтобы потом брать и использовать? Команду адд клиент туда, тип комнаты эконом туда, даты туда?
Причём команды по количеству символов разные, хуй поймёшь, короче.
Вот про такое на лекциях вообще помоему не говорили даже как реализовывать потом эти команды. Типо на свитчах и ифах всё это строить? Или как-нибудь в подпрограммы кидать?
Просили же не копировать код в посты. Залей на какой-нибудь онлайн компилятор и ссылку кидай
Да в принципе я только похвастаться принёс.
И он работает только в визуалке.
https://ideone.com/VAO2Ld
Как прочитать файл с командами так чтобы возможно было понять где команды и потихонечку их выполнять?
>инфиксную
>обратной польской
Сначала разберись в этом вопросе, а потом снова приходи, если что-то останется непонятным.
>Структура в памяти хранит свои поля последовательно
В памяти компилятор может добавлять пэддинг для повышения эффективности. Структура типа {char; int; char;} на современном сферическом компиляторе в вакууме с большой вероятностью будет выдавать сайзоф 12. Так-то бинарный вид в стандарте на кресты вообще не оговаривается.
>>304708
Тебе надо написать парсер для твоего мини dsl. Читаешь построчно команды, далее по токенам, со свичами и подпрограммами.
Лучше почитаю. Я так охуею тыкаться в стены.
Если чо, выполню задание за 6 баллов вместо 12 баллов и похуй. Всё равно за кодинг стайл и структуру программы нашкребу что-нибудь.
Да, там анон другой уже написал, что я не совсем точно описал.
Я потом вспомнил, что когда я пытался сам определить структуру для считывания хедера изображения(чтобы не подключать windows.h), то проебался именно в этом моменте с выравниванием и размером структуры, где-то это можно было отключить, естественно, где именно - не помню.
>>304729
>Алгоритм сортировочной станции — способ разбора математических выражений, представленных в инфиксной нотации.
Это я уже написал. Всё работает корректно, но мне нужно вывести этапы которые производит алгоритм. Вот скажем пик. Далее программа вычисляет значение поэтапно, в приоритете который я задал. И мне бы хотелось вывести эти этапы. Скажем выполнило AB& - вывод A&B, далее ~D и в конце (A&B)|C&~D. Вот тут то, чего я хочу добиться https://math.semestr.ru/inf/table.php.
Оно самое, спасибо.
char str[10] = "Hui pizda"
char str [0-2] = ?
Hui?
Часть строки точнее.
Да хоцца разбить, но чтобы строка разбилась на все слова и слова улетели в массив или ещё куда нибудь.
Ты хочешь разбить массив строк и записать его в другой массив? Ты ебанутый чтоль. Если твои слова разделены пробелами то strtok всё еще подходит, загугли как это правильно сделать и всё.
Ты должен будешь каждой строке присвоить часть твоей изначальной строки. Иначе результат уйдет в никуда. Если хочешь чтобы они ушли в массив строк - создавай массив строк, и каждому элементу присваивай часть изначальной
Что значит брать?
char str[] = "Hui pizda";
char str2[2];
strncpy (&str2[0], &str[0], 2 );
Как-то так. Слайсов в С нет.
Фу ебать.
С виду няшечшка хуйняшечка, а стоит только звук включить - обычная руснявая пизда.
в первый раз вижу её стрим
Хватит мешать матлогику с матанализом. Причем тут необходимо и достаточно?
Ну для e = 128 951 будет необходимо равно 1050-и. Для другого e не равно. Как на большинстве современных машин существует 1e-9 (или уже не современных, лол) в качестве такого эпсилона, так на машинах будущего машинный эпсилон для плавающей точки уменьшится, и бывшие необходимо равными величины уже не будут таковыми.
На мой взгляд ты не понимаешь, зачем нужно понятие необходимо равных величин и пытаешься подменить его понятием равных.
>Причем тут необходимо и достаточно?
При том, что Фихтенгольц написан языком 19 века и я попытался объяснить тупым школьникам, что значит слово "необходимо". Он ее использует всегда, когда что-то из чего-то следует. В современных формулировках ее не используют.
Попытка не удалась, потому что школьники оказались слишком тупыми и не способны осилить лемму.
>На мой взгляд ты не понимаешь, зачем нужно понятие необходимо равных величин и пытаешься подменить его понятием равных.
Шизик, у Фихтенгольца нет никакого понятия необходимо равных величин. 128 не равно 951, потому что не для любого эпсилон больше 0 существует интервал размером меньше e, в который попадают оба числа. Прочитай лемму раз сто, может дойдет.
можешь начать с Энтони Уильямс - Параллельное программирование на C++ в действии
хотел ее в шапку добавить
Есть пик:
void(List::add_e)(int) = &List::Add_element;
void(List::show_e)(int) = &List::Show;
прототипы:
void Show(int A)
void Add_element(int new_element)
Что-то не то получается, add_e/show_e у меня не определяются как указатели.
[code]
class Yoba {
public:
Distance fly(Perdole perdole);
};
using YobaFunc = Distance (Yoba::*) (Perdole);
[/code]
>"Необходимо равны" означает не "обязательно равны", а "настолько равны, что на разницу между ними можно забить".
Шизик? https://ru.wikipedia.org/wiki/Необходимое_и_достаточное_условия
>Фихтенгольц написан языком 19 века
В 21 веке логика стала немодна и "необхоидимо" не употребляется?
https://ravesli.com/uroki-cpp/
А так?
>понятие необходимо равных величин
Враки, нет такого и не нужно оно.
Для того чтобы уместить джва числа a и b в сколь угодно малый промежуток, необходимо чтобы a и b были равны.
Вот о чем эта лемма, вот в каком смысле Ф. использует слово "необходимо".
Вот gcc такую дичь компилирует, только вчера тестил. Сверху возможные замены через using или typedef, чтоб каждый раз не таскать скобочки.
kra - класс, type - аргумент шаблона (или как оно там называется).
В функцию можно передавать и как "<имя класса>::<имя метода>", так и как "<экземпляр класса>.<имя метода>". Без всяких & и *
В C++17 завезли std::invoke
помогите мне пожалуйста разобраться с OpenCV и CUDA. Я хочу прочитать видео с помощью класса cudacovec из opencv. я использую метод cv::cudacodec::createVideoReader(fname), но после этого вылетает вот эта ошибка.
>OpenCV(3.4.1-dev) Error: The function/feature is not implemented (The called functionality is disabled for current build or platform) in throw_no_cuda, file /home/nvidia/devel/opencv/opencv/modules/core/include/opencv2/core/private.cuda.hpp, line 111
terminate called after throwing an instance of 'cv::Exception'
what(): OpenCV(3.4.1-dev) /home/nvidia/devel/opencv/opencv/modules/core/include/opencv2/core/private.cuda.hpp:111: error: (-213) The called functionality is disabled for current build or platform in function throw_no_cuda
То есть, в моей версии CUDA, 9.2 вообще нет этой функции? Я пытался поискать другие способы прочитать видео, но не смог разобраться что именно делать. На форуме nvidia
https://devtalk.nvidia.com/default/topic/1043750/?comment=5295044
в теме с той же проблемой что и у меня пишут, что надо установить библиотеку nvcuvid, мне её отдельно нужно установить? И как мне её подключать в проект, с помощью заголовочного файла, или в .pro файле что-то прописать? И какой всё-таки метод использовать для создания video reader?
Тебе нужно пересобрать opencv с поддержкой cuda по инструкции типа https://github.com/BVLC/caffe/wiki/OpenCV-3.3-Installation-Guide-on-Ubuntu-16.04
я установил OpenCV с поддержкой CUDA, то есть класс например GpuMat у меня есть. Моя проблема в создании video reader с CUDA и отсутствующей функцией.
Бумп
чё?
в той книжке даются минимальные знания о том как писать многопоточку, если то о чем там написано считают сложным, то лучше и не пытайся ее делать
>Аноний, подкинь литературу по многопоточному программированию. Что такое потоки с чем их едят. Мъютексы хуютексы...
https://actor-framework.readthedocs.io/en/latest/Introduction.html
Посмотри как в Эрланге сделано и сделай так же на си.
мимо абитуриент кун
>абитуриент
>зарабатывать
Айтишники капусту рубят, пойду учиться на погромиста!111
Какой же ты даун.
Ну меня, например, тошнит от веба, а всякие числодробительные и компьютервижн проекты радуют.
А так у С++ стараний больше, а денег меньше, потому что рыночек. Но С++ гигантский плюс для поиска удаленной работы на западе. Неебический.
>ряя в аЙти и так уже много, тупое школоло ряя
мне всегда было интересно как работает мой кампудахтор и в частности программная его чась.
если б я думал только о бабле я и не задумывался б изучать что то сложнее питона
>пук
что сказать то хотел?
ты програмист вообще, что ты тут делаешь если не магешь в конкструктив
Да с тобой нехуй говорить, всегда ему интересны были пека, только задается вопросом нахуй ему учить что-то кроме пыха и жса, ведь на них бабки можно рубить. Конченный.
Ты бы попустился, че злой такой. Как вахтерша какая-то
>Но С++ гигантский плюс для поиска удаленной работы на западе
надеюсь, ты говоришь на основании личного опыта
в твоем вопросе и содержится ответ
раз ты абитуриент, то скорей всего у тебя есть мамка и папка, готовые кормить тебя еще 5 лет
но лучшее что ты сможешь сделать - это не теряя время подучить веб-разработку и уже на курсе втором устраиваться на удаленочку
если выберешь плюсы - твой путь окажется гораздо, гораздо сложнее, а как вариант и вообще закончится ничем
@
FLOATING POINT EXCEPTION
Я очень тупой, буду безмерно рад любой помощи. http://www.cyberforum.ru/cpp-beginners/thread167333.html
stl::mem_fn?
Забей на эту кривую парашу. Вкатывайся через годик другой, когда допилят для людей.
так и есть
еще вкатывальщики, спрашивающие почему их hello world не компилится
но в отличие от пхп-треда отвечают им такие же мало знающие студенты
состоявшиеся кодеры здесь есть, но они молчат или только отвечают на интересные сложные вопросы
вообще это специфика крестовой специализации - люди предпочитают молчать после нескольких лет работы "в поле"
Да. Я начинал в 2012, несколько раз пытался в веб-вакансии с рейтом хотя бы $15, каждый раз выбирали не меня - очень большая конкуренция. А с крестами было просто - специалистов мало и все заняты.
Это плохой вопрос, если тебя интересует вкат. Интереснее на чем я специализировался тогда. На переводе кода со скриптовых языков на С++, на анализ опенсорса. То есть такая типичная фрилансерская работа по чистке сортиров вилкой. Но, в отличие от веба, вечно таким заниматься не будешь, хороший крестовик редкость.
Там у них много переопределений и 2000 строк.
Мне бы чистый список без перегруженных операторов.
struct element
{
int x;
element Next, P;
};
struct List
{
private:
element N ,Prev;
public:
List()
{
Prev = nullptr;
N = nullptr;
}
~List()
{
while (Prev)
{
element temp = Prev->Next;
delete Prev;
Prev = temp;
}
}
void Add_element(int new_element)
{
element temp = new element;
temp->x = new_element;
temp->Next = Prev;
Prev = temp;
}
void Add_element(int i, int new_element)
{
int A = element_quantity();
element temp = Prev;
element data = N;
while (temp)
{
N = Prev;
temp = temp->Next;
if (A - i == 0)
{
element *obj = new element;
Prev = obj;
obj->x = new_element;
obj->Next = temp;
temp = obj->Next;
}
i++;
}
}
Нужно чтобы Адд, который с 2 параметрами, вставлял в итую позицию, element_quantity() возвращает количество элементов на момент вызова. Так же нужно сделать для удаления с итой позиции.
Раньше добавление работало, но потом я начал делать удаление и крашнул студию, в итоге не сохранилось.
Там у них много переопределений и 2000 строк.
Мне бы чистый список без перегруженных операторов.
struct element
{
int x;
element Next, P;
};
struct List
{
private:
element N ,Prev;
public:
List()
{
Prev = nullptr;
N = nullptr;
}
~List()
{
while (Prev)
{
element temp = Prev->Next;
delete Prev;
Prev = temp;
}
}
void Add_element(int new_element)
{
element temp = new element;
temp->x = new_element;
temp->Next = Prev;
Prev = temp;
}
void Add_element(int i, int new_element)
{
int A = element_quantity();
element temp = Prev;
element data = N;
while (temp)
{
N = Prev;
temp = temp->Next;
if (A - i == 0)
{
element *obj = new element;
Prev = obj;
obj->x = new_element;
obj->Next = temp;
temp = obj->Next;
}
i++;
}
}
Нужно чтобы Адд, который с 2 параметрами, вставлял в итую позицию, element_quantity() возвращает количество элементов на момент вызова. Так же нужно сделать для удаления с итой позиции.
Раньше добавление работало, но потом я начал делать удаление и крашнул студию, в итоге не сохранилось.
Это нормально.
При инициализации переменной компилятор выделяет под нее какую-нибудь мусорную ячейку в ОЗУ, где находиться всякая дичь.
(Некоторые компиляторы выводят ошибку)
Да, для обычных переменных это нормально.
Но в stl контейнерах они по дефолту устанавливаются в нулевое значение типа, например.
Обычные переменные при использовании без инициализации дадут мусор, то есть какое-то значение в памяти. У меня это какое-то ебанутое число примерно -2^31 или как-то так.
Глобальные переменные без инициализации устанавливаются в ноль даже массивы.
При инициализации одного элемента массива все остальные не инициализированные установятся в нули
Сейчас в основном на питоне ML делаю, лол.
Сейчас кресты нужны только в продакшен на десктоп, а я слишком ценный специалист, чтобы заниматься подобным. Хотя если уволят то, скорее всего, опять вернусь на кресты.
Нужно подстроить одну прогу под многопоточность. Там буквально три строчки)
Т.е. несколько классов со статическими функциями запихнуты в map так, чтобы потом я эти статические функции мог через этот map дёргать.
Статические вообще без проблем, если сигнатура у них одна и та же.
https://ideone.com/9WPkgP
С методами лучше заюзать std::function, который запомнит ссылку на this.
Хотя у тебя в мапе не функция, а метакласс. Метаклассов в С++ нет.
Цель у тебя какая?
Это вообще разные вещи. C# - джаваподобный мусорособираемый язык высокого уровня (хотя сам язык поприятнее джавы будет), ориентированный на исполнение на виртуальной машине CLR. То есть абстракциями оперировать легче, чем плюсами, но и (вменяемо) управлять памятью ты не сможешь. И просто сам язык медленнее сей/плюсов (чего, впрочем, хватает для 90% приложений). То есть для уровня "сделать веб/десктоп приложение" самое оно, но если у тебя один из следующих ворклоадов:
>БЛЯДЬ РАБОТАЕМ НАПРЯМУЮ С PCI/I2C/ЧТО ТАМ ЕСТЬ ЕЩЁ
>ВСЁ МЕДЛЕННО - ТАЩИ БОЛЬШЕ SIMD
>У НАС VTUNE ГОВОРИТ ЧТО LLC MISS COUNT ВЫСОКИЙ - А НУ
>640 КИЛОБАЙТ ПАМЯТИ (на программу и на данные) ХВАТИТ ВСЕМ
>У НАС ВЫЧИСЛЕНИЯ ИДУТ 60 ЧАСОВ - НАДО БЫ БЫСТРЕЕ
и просто если ты не можешь расходовать лишние ресурсы компьютера или должен уметь выжать его до конца, то да, плюсы в таком случае незаменимы. А так, если хочешь просто понять, каковы низкоуровневые языки, то лучше сделай упор на чистый Си. Всё-таки ящитаю в плюсы нужно вкатываться строго после хорошего понимания Си.
Так джава си-подобный, выходит что С# - тоже. C/C++ тоже языки высокого уровня же. Почему не смогу? Просто добавляю ключевое слово unsafe и делаю все тоже самое что и на C++, делать асм вставки тоже можно насколько я понял. Выходит, что у плюсов пруфит только в производительности, ну и драйвера не попишешь?
Чёрт, ты серьёзно за 18 часов не нашёл нужный код? По второй же ссылке нашёл нужный тебе с разбором и добавлением в произвольную позицию.
>element_quantity()
Это настолько очевидное свойство списка, что стоило бы потратить 4 байта и его вынести в отдельную переменную и просто изменять значения при добавлении, мне кажется. Если не подразумевается, что у тебя миллионы копий этой структуры, и в каждом буквально три с половиной элемента.
Почему в элементе хранится два указателя? Зачем указатели N и data? Нужна ли тебе ещё помощь? Если тебе в самом деле интересно, а не нужно просто унылую лабу сделать и забыть - то можно списаться, объясню всё-всё про списки и всякое другое, если потребуется.
>>305917
>в stl контейнерах они по дефолту устанавливаются в нулевое значение
А это можно как-то отключить, кстати? Практического применения никакого - проще явно вызвать зануление в 1 из 100 случаев, чем каждый раз мучать компьютер бесполезными действиями.
Заплати. Чо ты как этот самый.
С добавлением разобрался.
void Add_element(int i, int new_element)
{
int A = element_quantity();
element temp = Prev;
element temp2 = Prev;
while (temp2)
{
temp2 = temp2->Next;
if (A - i == 0)
{
element obj = new element;
obj->x = new_element;
obj->Next = temp2;
temp->Next = obj;
}
i++;
temp = temp->Next;
}
}
А вот с удалением проблема, выкинуть указатель то могу на (i-1 элемент), но как не впихну delete, то ошибка доступа памяти в строке temp = temp->Next;
void Del_element(int i)
{
int A = element_quantity();
element temp = Prev;
while (temp)
{
if (A - i == 0)
{
temp->Next = temp->Next->Next;
}
temp = temp->Next;
i++;
}
}
С добавлением разобрался.
void Add_element(int i, int new_element)
{
int A = element_quantity();
element temp = Prev;
element temp2 = Prev;
while (temp2)
{
temp2 = temp2->Next;
if (A - i == 0)
{
element obj = new element;
obj->x = new_element;
obj->Next = temp2;
temp->Next = obj;
}
i++;
temp = temp->Next;
}
}
А вот с удалением проблема, выкинуть указатель то могу на (i-1 элемент), но как не впихну delete, то ошибка доступа памяти в строке temp = temp->Next;
void Del_element(int i)
{
int A = element_quantity();
element temp = Prev;
while (temp)
{
if (A - i == 0)
{
temp->Next = temp->Next->Next;
}
temp = temp->Next;
i++;
}
}
Анон, начал учить эти ваши плюсы (и программирование вообще). И я просто в ахуе от нелогичности этого дерьма. Допустим, делаю многомерный массив. 2 массива по 4 элемента. И чтобы вызвать из 2-го массива 4-ый элемент мне нужно писать 1 и 3, потому что плюсы воспринимают первый массив и первый элемент не как 1, а как 0, то есть начинают отсчет с ноля.
Как дальше жить с этим?
Ну наверное в очень многих языках программирование индексация начинается с 0, а не с 1.
Допустим int может принимать значения от 0...10, если массив начинается с нуля, то нам доступны значения от 0 до 10, если с 1 то с 1 до 10, то есть последний элемент доступен не будет. Все просто и логично, просто ты дурачек.
>Допустим int может принимать значения от 0...10
Но ведь там не интеджеры, а черектеры. А они могут принимать любое значение, не?
Я все равно ничего не понял.
Почему тогда сразу нельзя было сделать создание массива с учетом ноля? Допустим ты хочешь сделать два массива с 4-мя элементами. Тогда писать надо 1 и 3. И для вызова последнего элемента второго массива логично было бы юзать все те же 1 и 3.
>ошибка доступа памяти в строке
Очевидно, потому что ты удаляешь temp, а потом обращаешься temp->Next или ещё что-то такое.
Попробуй это:
[code]
void Del_element(int i)
{
int A = element_quantity();
if (A<i) return;// Такого элемента нет
element W,B = Prev; //Тут две звёздочки, если оно сломается.
if (i==0){ //Отдельный случай, когда нужно поменять Prev
W=Prev;
Prev=Prev->Next;
delete Prev;
}else{ //Случай, когда значение Prev менять не надо
W=Prev;
B=Prev;
for (int n=0;n<i;n++){//Перехожу на элемент i
B=B->Next;
W=B;
}
//В - элемент подлежащий удалению
//W - предыдущий
W->Next=B->Next;
delete W;
}
[/code]
>ошибка доступа памяти в строке
Очевидно, потому что ты удаляешь temp, а потом обращаешься temp->Next или ещё что-то такое.
Попробуй это:
[code]
void Del_element(int i)
{
int A = element_quantity();
if (A<i) return;// Такого элемента нет
element W,B = Prev; //Тут две звёздочки, если оно сломается.
if (i==0){ //Отдельный случай, когда нужно поменять Prev
W=Prev;
Prev=Prev->Next;
delete Prev;
}else{ //Случай, когда значение Prev менять не надо
W=Prev;
B=Prev;
for (int n=0;n<i;n++){//Перехожу на элемент i
B=B->Next;
W=B;
}
//В - элемент подлежащий удалению
//W - предыдущий
W->Next=B->Next;
delete W;
}
[/code]
ты можешь там смотреть видео с курса, это будет бесплатно
но смысла в этом немного, важны тестовые упражнения и задания, доступ к проверяющей системе
вообще важно то что тебя будут по сути заставлять кодить, набивать руку
Точнее, вот так: https://ideone.com/LN7Ja
Писал вслепую, перепутал две строчки. Сейчас должно работать, по идее. И чёт глаза вытекают от кода без переносов, думал "code" блокирует стирание звёздочек и пробелов.
> на питоне ML делаю
не хотелось тебя упрекать, но первым постом ты говорил, что легко найти удаленку на крестах и что работаешь на плюсах удаленно
а получается вот оно как
>Но ведь там не интеджеры, а черектеры. А они могут принимать любое значение, не?
У тебя какой то пиздец с пониманием, попробуй для начала ассемблер, хорошая вещь. А потом чистый С, и только потом уже плюсы.
посоветуй по асму что нибудь чтобы побольше прикладных интересных задач простеньких
другой анон
Непонел, что именно посоветовать? Для обучения советую FASM (он же flat assembler) посмотреть, только не fasmg, по нему материала еще мало. На офф сайте есть примерчики, тексты, да и много чего по нему гуглица.
Еще в папке EXAMPLES при скачивании есть исходники всяких блокнотов, графических демок, простых hello world'ов.
> ассемблер
в контексте с++ треда нужен только затем, чтобы уметь читать и контролировать выхлоп компилятора
1280x720, 0:04
>в контексте с++ треда нужен только затем, чтобы уметь читать и контролировать выхлоп компилятора
>не хотелось тебя упрекать, но первым постом ты говорил, что легко найти удаленку на крестах и что работаешь на плюсах удаленно
>а получается вот оно как
Нет, это говорил гномик в твоей голове. Я писал следующее: "С++ гигантский плюс для поиска удаленной работы на западе".
То есть не плюс как в собеседованиях пишут плюс, который нихуя не плюс, а реальный такой плюс выполнить простенький проект, познакомиться с заказчиком и сказать ему "а я еще и вышивать умею". А работать на крестах в 2018...
Нет, не пойми меня неправильно, я работал несколько лет чисто на С++ и всегда моя работа заканчивается имплементацией на С++ для встраивания в продакшен (если речь о десктопных юзерах, в вебе можно обойтись крестовыми библиотеками), но при первой возможности я не работаю на С++, потому что надоедает постоянно пилить велосипеды, искать на гитхабе древние BSD библиотеки, дрючить cmake и заниматься прочей хуитой.
Поэтому молодым я С++ учить особо не советую. Effort'а много, а выхлоп будет - ну чуть больше везения при поиске работы.
Потому что массив по сути - это кусок памяти. Твоя переменная, которая обозначена как массив на самом деле есть указатель на адрес первого элемента. В квадратных скобочках ты указываешь не номер элемента, а смещение относительно этого адреса. Соответственно, первый элемент массива находится при нулевом смещении.
Во многих других языках без семантики си-подобных указателей ёбнутые создатели (сказалось тяжёлое наследие си) оставили 0 как индекс первого элемента массива, списка и других подобных коллекций. Но есть и правильные языки, где первый элемент нумеруется единичкой.
>Но есть и правильные языки, где первый элемент нумеруется единичкой.
Это хуевые языки для гуманитариев. Матлаб из таких языков и постоянно это бесит.
Например, мне нужно обработать массив кусками по 10 элементов (только не надо говорить про векторизацию в матлабе - это просто пример). На сишке я пишу так (@ как водится звездочка):
for(int i = 0; i < ...; ++i) for (int j = 0; j < ...; j++) a[i @ 10 +j] = ...
И тут прелесть в том, что 0 @ 10 = 0.
А вот когда у тебя нумерация с единицы, возникает проблема. 1 @ 10 = 10. В итоге надо писать
a[1 + (i - 1) @ 10 + j], чтобы превратить i в ноль, высчитать смещение по i, а потом еще не забыть прибавить единицу, чтобы опять вернуть нумерацию с единицы.
На пустом месте формула усложнилась. Так что указывать смещение вместо порядкового номера штука правильная и очень математичная в любых языках, не только в низкоуровневых. Не веришь мне, спроси у Саймона: http://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:-33--33-
Хотя вру, единицу прибавлять не надо - j-то с единицы. Короче, даже в таком простом коде появляются баги на пустом месте
Ты в своем примере какую-то хуйню написал.
Если индексы элементов начинаются с единички, то все становится ещё проще:
for(int i = 1; i <= ...; i += 10) for (int j = 0; j < 10; j++) a[i + j] = ...
И никаких проблем.
Но, таки да, становится неудобно, если по модулю деление брать.
Что не так? Там даже лямбды есть.
Что за хрень, у меня одного недоступно?
>Так джава си-подобный, выходит что С# - тоже. C/C++ тоже языки высокого уровня же
Синтаксис один, но суть другая. Да и высокий уровень тоже высокому уровню рознь. Если сказать хаскелисту, который каждый день жонглирует профункторными линзами да свободными моноидами, что в шарпах высокий уровень абстракций, он усмехнётся и продолжит пилить индексированные монады.
>Почему не смогу? Просто добавляю ключевое слово unsafe и делаю все тоже самое что и на C++,
Некоторые... деликатные вещи на AllocHGlobal и прочем не сделаешь.
>Выходит, что у плюсов пруфит только в производительности, ну и драйвера не попишешь?
Честно? Да.
RIP.
Тем, кто считает Си языком высокого уровня, пора очнуться из сорокалетней комы и обнаружить, что в современном компьютерном языкознании стандарты несколько поменялись.
Наркоман?
>Так джава си-подобный, выходит что С# - тоже. C/C++ тоже языки высокого уровня же. Почему не смогу? Просто добавляю ключевое слово unsafe и делаю все тоже самое что и на C++, делать асм вставки тоже можно насколько я понял. Выходит, что у плюсов пруфит только в производительности, ну и драйвера не попишешь?
Язык тащит за собой компилирующий и выполняющий его рантайм и соответствующие ограничения в плане переносимости (для переноса на неподдерживаемую платформу придется вскрывать исходы рантайма и перепиливать рантайм + раньше мог соснуть с платформами где динамическая генерация кода запрещена или невозможна (гарвардская архитектура), но недавно запилили AOT, который впрочем тоже для неподдерживаемых платформ придется перепиливать. Ну и в целом язык был анальной проприетарщиной от М$ и лишь недавно вылился в опенсорс).
Ну а что касается популярности - под самый популярный игродвижок пишут именно на шарпе игоры.
>Ну и в целом язык был анальной проприетарщиной от М$ и лишь недавно вылился в опенсорс
И вот это вот - его главная проблема. За долгие годы анальной проприетарности за ним закрепилась ниша мидл-левел этнерпрайза, прибитого гвоздями к шиндошс-онли инфраструктуре. Ни моно, ни ксамарин эту ситуацию не переломили, разве что вот говноюнька хоть как-то открыла для языка новую нишу на рынке труда, до неё он вообще был загибающимся легаси-языком для вышеупомянутого мид-левел энтырпрайза.
>Тем, кто считает Си языком высокого уровня, пора очнуться из сорокалетней комы и обнаружить, что в современном компьютерном языкознании стандарты несколько поменялись.
Любой язык представляющий переносимую абстракцию над железом суть высокоуровневый. Суть в том что на сишке можно написать переносимый код, при этом прилагая усилия для избегания граблей с типами и прочим, на ассемблере это ни при каких усилиях не получится - исход для x86 ты не заставишь скомпилиться под ARM.
Спасибо, выручил.
А ты запрети, лол
c++ - надстройка над си, кучка синтаксического сахара
Флаги какие? -O1/2/3/g?
Это неопределенное поведение, компилятор может делать что угодно. Если бы ты инициализировал переменную, ему бы пришлось сначала скопировать константу на стек, а потом загрузить её в регистр. Но ему не нужно делать ни того, ни другого, поэтому он этот регистр тупо занулил через XOR EAX EAX или типа того, потому что имеет полное право.
Тут надо понимать, что это работает так только в конкретном случае. В этом примере ты, скорее всего, увидишь не ноль:
int a;
if (x == 0){
a = 2;
}
if (x == 2){
a = 6;
}
float b = sqrt(123);//Заставить компилятор сбросить штуки на стек
std::cout <<a << b;
Блин, про x забыл:
int x;
std::cin >> x;
int a;
if (x == 0){
a = 2;
}
if (x == 2){
a = 6;
}
float b = sqrt(123);//Заставить компилятор сбросить штуки на стек
std::cout <<a << b;
Думаю во многих актуальных книжках (Липпман, Джосатисс) советы так или иначе повторяются либо даётся их модификация.
да и не факт что к разным. думаешь рандому слабо два числа повторить в разных потоках7
Операционки на низком уровне пишут, ваш кэп.
Ну так там все книги по факту являются модификацией предыдущей, но при этом если в одной книге пишется что пока-что какой-то технологии нет в книге 2008 года например писалось что нет технологии для отключения функций в классе либо final а в следующей книге уже описывается эта технология. Отредачте шапку тогда, исправьте на читать последнюю. Хотя похуйдумаю, всё равно ее не добавляют уже
«(Без)знаковое целое размером не менее X байт», «указатель на символ», «цикл с предусловием», «структура с таким-то выравниванием полей» и тэ дэ — это «абстракции»только если по меркам 70-х. Высокоуровневый язык в первую очередь должен предоставлять удобные средства для работы в терминах предметной области (причём произвольной, если это язык общего назначения), а не железяки. В сишке железяка будет водопадом протекать сквозь попытки хоть что-то абстрагировать, как ты ни ухищряйся.
> например писалось что нет технологии для отключения функций в классе либо final
Ну, блин, в таком случае надо учитывать ведь и версию языка.
А то будешь читать что-нибудь из старого, а там про какой-нибудь Copy Elision и прочее ничего нет.
Да я просто по гайду шёл, и наткнулся на такое чудо. Решил остальные 2 книжки не читать.
Тогда лучше читать новое чтобы потом с учётом смотреть на старое.
C++ это все же низкоуровневый язык, и нужно постоянно ебаться с кроссплатформенным ассемблером ака сишка епт. Поэтому ассемблер знать нужно, а то блять создашь мегабайтный VLA, и будешь охуевать когда программа пишет вместо result: x -- segement naebnulsa.
При желании код в fasm можно обмазать кучей макросов и условной конпеляцией как это делают в це и получить условно переносимый код.
Есть код (http://hardfire.ru/class_matrix) что бы весь листинг не кидать. В нем есть перегрузка матрицы, вывести обычную матрицу я понял как, а как вывести матрицу из массива чисел - не понял.
matrix(double array[], int N, bool horizontal=0)
Как использовать эту функцию?
Ппробую так,например
matrix q({ 2.3,5.2,4.3 }, 3, 1);
Пишет
E0289 отсутствуют экземпляры конструктора "matrix::matrix", соответствующие списку аргументов
Вроде понял, создал в main массив
double arr[] = { 1,5,7 };
И закинул ево в ту функцию
matrix q(arr, 3, 1);
Бля, некоторые команды я хуй знаю как вызывать. Помогите позязя
https://stackoverflow.com/questions/53151521/could-we-access-member-of-a-non-existing-class-type-object
Аноны, нужна помощь.
Вот в джаве или шарпе, после того момента , когда комфортно для себя начинаешь писать чисто на ЯП, ты переъодишь на фреймворки - Спринг или что то подобное в шарпе.
А что делать в крестах? Есть какая то готовая инфраструктура ? Что то такое, что можно задрочить и идти на собес?
по stl там обычно гоняют, могут про boost спросить
Сижу на связке сишечка + кресты + Qt
уже и опыт работы вроде за плечами есть, и базовую хуйню из разряда структуры данных + ООП знаю
наформошлепить могу на легком, был даже один проект с ЦОС, с него больше всего угорел
Какое-то время реверс интересовал, но почитал что придётся всё время сидеть и в ИДУ пялить, восторга не вызывает
матан давно забросил, но когда-то он мне доставлял
собсно вопрос: не ебу в какую сторону двигаться и что дальше учить, так что высрите мне вашу субъективщину, охота посмотреть чем люди живут, мб что-то зацепит
Сижу на связке сишечка + кресты + Qt
уже и опыт работы вроде за плечами есть, и базовую хуйню из разряда структуры данных + ООП знаю
наформошлепить могу на легком, был даже один проект с ЦОС, с него больше всего угорел
Какое-то время реверс интересовал, но почитал что придётся всё время сидеть и в ИДУ пялить, восторга не вызывает
матан давно забросил, но когда-то он мне доставлял
собсно вопрос: не ебу в какую сторону двигаться и что дальше учить, так что высрите мне вашу субъективщину, охота посмотреть чем люди живут, мб что-то зацепит
а ещё я даун с даблкликом
>структура типа {char; int; char;} на современном сферическом компиляторе в вакууме с большой вероятностью будет выдавать сайзоф 12.
Привет двачерам из 2003 =)
24 же. У современных машин слово восемь байт, а не четыре.
Если ты просишь помощи, то ты должен показать что ты что-то сделал сам, либо пытался. Тебя на любом сайте пошлют нахуй с просьбами сделать дз за себя, потому-что тебе лень
>Привет двачерам из 2003 =)
Привет из 1488-го =)
> 24 же.
https://wandbox.org/permlink/g6Em3moNxZ0VxtZn
> У современных машин слово восемь байт, а не четыре.
У машин вообще слов нет, Слово было у Бога.
template<typename T>
class Zalupa {
public:
friend T func<T> (Zalupa<T>&);
};
template <typename T>
T func (Zalupa<T>& z) {}
то не распознает func<T> как template, а если объявление func кинуть перед объявлением класса, то ругается на неизвестный тип параметра функции.
Чувствую себя тупым...
на всякий случай, вставлю свои три копейки о том, как где-то в англоязычных интернетах читал мнение, что джавист Шилдт зря взялся за C++ (как автор), и учиться по его книге - гавно вариант.
Сомневаюсь, что такое объявление friend синтаксически корректно. Сделай так
template<typename U>
friend U func(Zalupa<U>&);
Скорее всего, в первом for
for (i = 0; i < 10; i += 2)
lst2.push_back('A' + i);
должен быть lst1, а не lst2. А ассерт вылезает потому, что вызов merge требует, чтобы оба листа были отсортированными
connect(socket, SIGNAL(connected()), this, SLOT(connectClient()));
этот коннект должен при удачном соединение перекинуть на слот и выполнить его. В слоте просто похуй что вывод строки допустим. Если коннект с 1 раза удачный, то все робит , строку выводи как надо. Если раз 100 тыкать на заведомо неконнектюющююся хуйню, а на 101 прикконектится к нормальному порту, он блять выведет 101 раз сообщение. Че за ебала? как фиксить, чет даж хз как гуглить
Фикс, разобрался, Qt::UniqueConnection нужно юзать параметром.
> хорошо разбирается в массивах
О, как раз ищу вакансию массивщика. Серьезная предметная область...
видимо, функция void, которая должна просто закончить работу при условии somth....
на торрентах vs2017 с большим набором доп хрени кроме c++, как правильно выбрать, чтобы можно было работать на python, c++, c#. Геймдев не интересует, есть какое-то описание нормальное для разделов и что стоит ставить , а что нет(всего 40gb) или только искать описание каждого набора?
Что за говно ты читаешь?
В дефолтном конструкторе выделяют память с использованием new, в то время как везде удаляют используя delete []
Присваиваешь такой дефолтно сконструированному объекту что-то и привет UB
В sample::set предыдущую память не освобождают...
Пиздец.
Стандарт.
Нагуглил srand(time(NULL));
а на маке, разве, нет /dev/random и /dev/urandom ?
Где я вылезаю за пределы массива. Уже пол часа сижу и не вижу
void sloj(int a[], int b[], int &la, int lb)
{
int i = 0, j = 0, c, d;
for (i; i < la; i++)
{
for (j; j < lb; j++)
{
if (a > b[j])
{
la++;
d = i;
c = la;
for (c; d + 1 < c; c--)
{
if (c == (0))
break;
a[c] = a[c - 1];
}
}
}
}
}
Менее ублюдски
void sloj(int a[], int b[], int &la, int lb)
{
int i = 0, j = 0, c, d;
for (i; i < la; i++)
{
for (j; j < lb; j++)
{
if (a > b[j])
{
la++;
d = i;
c = la;
for (c; d + 1 < c; c--)
{
if (c == (0))
break;
a[c] = a[c - 1];
}
}
}
}
}
https://pastebin.com/eZvT83NY
Не могу допереть как написать через предложенный оператор, накиньте за щеку идей.
Блять отбой, спасибо. Второй час ночи, котелок совсем ебобо.
int main()
{
char a;
cin >> a;
cout << a;
}
аффтар предлагает char a = ' ';
Защитное программирование
>for (i; i < la; i++)
поседний цикл i = la -1
>la++;
la принимает размер массива, т.е., a[la] уже segmentation fault
>c = la;
>for (c; d + 1 < c; c--)
>a[c] = a[c - 1];
т.е, в первой же итерации a[la]
насколько я помню, стандарт не выдвигает требований по автоматической инициализации.
Т.е., при объявлении переменная может быть инициализирована чем угодно.
Char по дефолту байт занимает, т.е., при ошибке чтения с потока (флаги (bad|fail){1}(bit)?), у тебя будет символ ß, например.
С кайфом, так сказать.
//генератор для C++11
#include <random>
int main()
{
std::mt19937 mersenne;
std::random_device rand(mersenne);
std::uniform_[int или real]_distribution<> dist(левая_граница, правая_граница);
auto a = dist(rand);
return 0;
}
В народе постоянно говорят о том, что использовать goto - плохо и нужно искать любые способы его обхода.
Если goto так нежелателен, то поясните, как в подобном коде (пример ниже) можно избежать его использования. По задумке в консоли текст выводится каждый раз, когда человек нажимает на конкретную кнопку и прекращает выводиться, когда нажимается любая другая. Ифы, вайлы, форы и прочие элсы ведут к тому, что текст выводится один раз. Ну, или я не заюзал какие-то дополнительные неизвестные мне элементы синтаксиса.
Инбифо: юзать классы, ООП, либы, лямбды, полиморфизмы, еще какую-нибудь неизвестную мне хуйню, до которой мне год пинать кресты, пробираясь через самые азы.
#include "pch.h"
#include <iostream>
using namespace std;
void main()
{
link_1:
char char_1;
cout << "Hello world!\n";
cout << "Would you like to repeat?\n";
cout << "Press \"Y\" if you would.\n";
cout << "Press any key if you would not.\n";
cin >> char_1;
if (char_1 == 'y' || char_1 == 'Y')
{
goto link_1;
}
else
{
cout << "OK, bye then.\n";
system("pause");
}
}
В народе постоянно говорят о том, что использовать goto - плохо и нужно искать любые способы его обхода.
Если goto так нежелателен, то поясните, как в подобном коде (пример ниже) можно избежать его использования. По задумке в консоли текст выводится каждый раз, когда человек нажимает на конкретную кнопку и прекращает выводиться, когда нажимается любая другая. Ифы, вайлы, форы и прочие элсы ведут к тому, что текст выводится один раз. Ну, или я не заюзал какие-то дополнительные неизвестные мне элементы синтаксиса.
Инбифо: юзать классы, ООП, либы, лямбды, полиморфизмы, еще какую-нибудь неизвестную мне хуйню, до которой мне год пинать кресты, пробираясь через самые азы.
#include "pch.h"
#include <iostream>
using namespace std;
void main()
{
link_1:
char char_1;
cout << "Hello world!\n";
cout << "Would you like to repeat?\n";
cout << "Press \"Y\" if you would.\n";
cout << "Press any key if you would not.\n";
cin >> char_1;
if (char_1 == 'y' || char_1 == 'Y')
{
goto link_1;
}
else
{
cout << "OK, bye then.\n";
system("pause");
}
}
Уууу, Абу пидр. Не может сделать нормальное отображение спецсимволов.
#include "pch.h"
#include <iostream>
using namespace std;
void main()
{
link_1:
char char_1;
cout << "Hello world!\n";
cout << "Would you like to repeat?\n";
cout << "Press \"Y\" if you would.\n";
cout << "Press any key if you would not.\n";
cin >> char_1;
if (char_1 == 'y' || char_1 == 'Y')
{
goto link_1;
}
else
{
cout << "OK, bye then.\n";
system("pause");
}
}
Уууу, Абу пидр. Не может сделать нормальное отображение спецсимволов.
#include "pch.h"
#include <iostream>
using namespace std;
void main()
{
link_1:
char char_1;
cout << "Hello world!\n";
cout << "Would you like to repeat?\n";
cout << "Press \"Y\" if you would.\n";
cout << "Press any key if you would not.\n";
cin >> char_1;
if (char_1 == 'y' || char_1 == 'Y')
{
goto link_1;
}
else
{
cout << "OK, bye then.\n";
system("pause");
}
}
Легко
#include <iostream>
using namespace std;
void main()
{
char char_1;
do
{
cout << "Hello world!\n";
cout << "Would you like to repeat?\n";
cout << "Press \"Y\" if you would.\n";
cout << "Press any key if you would not.\n";
cin >> char_1;
}
while (char_1 == 'y' || char_1 == 'Y');
cout << "OK, bye then.\n";
system("pause");
}
чет не очень табы со студии копируются
как до строк доберёшься, расскажи, ок?
а то в шарпе реализация строк очень даже ничего и никаких сложностей с символами нет
сложности, в основном, в утечках и корявой работы с памятью, в шарпе этого тоже нет, там по аналогии джавы спизжен весь язык гарбэдж коллектор
Как на счет того, чтобы сделать уже наконец перекат?
Пикрилейтед - в ОП-пик. Если еще не делали.
Сам допетрил. Просто через while. Правда пришлось дублировать все cout-ы в функцию.
>>320891
>как до строк доберёшься, расскажи, ок? а то в шарпе реализация строк очень даже ничего и никаких сложностей с символами нет
Сейчас после пайтона синтаксис с-ей кажется ну совсем громоздким. В пайтоне можно было тупо любую строку помножить на интеджер и повторить н раз тем самым. А здесь целую функцию писать с циклом и так каждый раз. Хз как оно в жабе и шарпе, но что-то подсказывает, что намного проще.
Хотя казалось бы, давно уже могли бы накидать синтаксического сахара, чтобы прямо из коробки все работало. Кому не нужно и кто за каждую миллисекунду в отладчике борется - пусть просто не пользуется.
>В пайтоне можно было тупо любую строку помножить на интеджер и повторить н раз тем самым.
Разумеется, пептон так и задумывался, к тому же, он динамический почти на 100%, там такие операции за хуйню делаются (но вылезают и другие сложности при этом).
Это копия, сохраненная 8 января 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.