все, придбав макбука того, страждаю тепер.
Хех, от і я теж повернувся на мак, майже після 2 років перерви)
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Повідомлення користувача wander
все, придбав макбука того, страждаю тепер.
Хех, от і я теж повернувся на мак, майже після 2 років перерви)
Цікаво, чи не трапиться багаторазова спроба подвiйного видалення? Уявiмо, що усi ноди добавлялися з голови, окрiм останнього, якiй було вставлено десь у середину (по iндексу). Тож рекурсiя почнеться з нього. Потiм почнеться видалення з голови. Коли черга дiйде до вказаного нода, з якого почався перший ланцюг, схоже буде спроба повторного запуску його деструктора, та замаху на повторне звiльнення пам'ятi.
Ні, подвійного видалення не буде
{
MyLinkedList myList;
myList.addAtHead(10);
myList.addAtHead(20);
myList.addAtIndex(1, 15);
} // <-- call `myList` destructor `MyLinkedList::~MyLinkedList()`
// +--> call `head` destructor `unique_ptr<Node>::~unique_ptr<Node>()` [початок рекурсивного ланцюжка]
// +--> call `ptr` destructor `Node::~Node()`
// +--> call `next` destructor `unique_ptr<Node>::~unique_ptr<Node>()`
// +--> call `ptr` destructor `Node::~Node()`
// +--> call `next` destructor `unique_ptr<Node>::~unique_ptr<Node>()`
// ...
При виході зі скоупу почнеться виклик дефолтного деструктора MyLinkedList::~MyLinkedList(), оскільки він дефолтний він просто тригерне деструктори мемберів, у нашому випадку маємо лише одного мембера -- unique_ptr<Node> head. Після чого ми потрапимо в деструктор Node::~Node(), який теж дефолтний та просто почне виклик деструктор свого мембера, тобто std::unique_ptr<Node> next. Ну і так далі. Видалення в цьому випадку можливе лише з першого вузла (голови), адже це єдиний член списку. Рекурсія не може початись з останнього вузла. Тому не важливо, куди ми впихнемо останнє значення в список (на початок, в середину чи кінець).
Так. Будь ласка, - той пост де De.
Видалив.
Там нема такої проблеми. Деструктора у Node нема, тому delete на next викликатися не буде. Усi деструктори смартiв будуть запущенi ву порядку зворотньому до порядку їх створення. Проблема у тому, що все це вiдбуватимется у момент, коли увесь список виходитиме з областi.
Я й говорив за деструктори розумних вказівників. Явного деструктора немає і в самому списку, там всюди дефолтний, який буде викликати деструктор розумного вказівника. Починаючи з unique_ptr на перший вузол, його деструктор викличе видалення на цьому вузлі. Перш ніж цей виклик повернеться, він повинен знищити наступний вказівник цього вузла, чий деструктор розумного наступного (next) вказівника викличе delete на другому вузлі. І так далі, ланцюжок із n рекурсивних викликів. Що потенційно може призвести до stack overflow та UB.
cppreference самі про це говорять
// unique_ptr-based linked list demo struct List { struct Node { int data; std::unique_ptr<Node> next; }; std::unique_ptr<Node> head; ~List() { // destroy list nodes sequentially in a loop, the default destructor // would have invoked its `next`'s destructor recursively, which would // cause stack overflow for sufficiently large lists. while (head) { auto next = std::move(head->next); head = std::move(next); } } };
Що до некогерентних до здорового глузду i логіки задач (iндекси у даному разi), у контекстi теми самого завдання, то я свою точку зору висловив. Час i енергїя учня, це ресурс який треба використати якомога краще. Тому в мене нема чого сказати гарного про LeetCode i багато iншiх ресурсiв та закладiв, незалежно вiд рiвня розкурученностi.
Як я знаю (можу помилятись) попередньо LeetCode є збірником різних завдань, які можуть вас попросити розв'язати на технічній співбесіді при прийнятті на роботу (деякі завдання можуть доходити до абсурду), саме тому деякі з них містять вже готові заготовки коду, які просять вас імплементувати, як це часто роблять на співбесідах. Я особисто знаю людину, яка вирішила там кілька сотень завдань саме для проходження співбесід, можливо автор цієї тем теж хоче знайти роботу. Що ж, який попит..
---------------------------
del ненавмисної копiї. Питання до модераторiв: як редагувати я бачу, а от як видалити нi. Якщо це можливо, то як?
Видаляти можуть лише модератори, якщо хочете можу видалити за вас.
Не вдивлявся сильно в імплементацію ТС, але std::move викликатиме reset та release за вас, проте це все ще не означає, що не потрібно бути уважним та дивитись що куди мувається. Але, проблема коли список вийде за скоуп та почнеться рекурсивний виклик деструкторів до глибини n (де n довжина списку) -- залишається. Не те щоб цю проблему не можна було б вирішити, але тоді якось весь сенс у використані std::unique_ptr втрачається, на мою думку. Загалом розумні вказівники не зовсім були створені саме для таких випадків, їхній скоуп використання дещо інший. З іншої сторони, це теж можливість трохи набити синців та самостійно розібратися в проблемі.
Щодо індексів повністю згоден, але це ж задачка з LeetCode. Там швидше тебе намагаються "навчити" вирішувати конкретні завдання, а не дати глибоке розуміння предметної області.
unique_ptr<Node> ...; next = NULL; // не `nullptr`? ну ок..
Це, якось дивно бачити таке поєднання..
Пробував move використати, усе одно помилка виходить.
Певно компілятор бракбагований.
Але не розумію Node* next.
Я б радив спершу почитати, що таке той Linked List, як Data Structure. А, вже потім би брався його імплементовувати в певній мові.
по суті, шаблону типу використано цей же таки тип
1. Це не шаблон типу.
2. А, який тип там тоді мав би бути на вашу думку?
Чому використали звичайний вказівник, а не розумний?
Хз, поставте це питання автору, код якого ви позичили.
Шо по рубі ?
Десь між Пайтоном та ДжаваСквіртом.
leofun01, ймовірно тре пояснити детальніше. Мені написала HRка щодо вакансії, скинувши типовий коротенький опис + запросила на кол (~10хв). Оскільки вона спілкувалася українською, я початково думав, що це пишуть з якоїсь української галери, яка займається аутсорсом чи аутстафом. На колі вона запитала мене про очікувану зарплату, де я й назвав суму, яку типово називаю для українських галер. Я трохи протупив, бо вона казала, що компанія ірландська і контракт буде з ними напряму, а не через якусь українську компанію (як це типово буває). Я цю інформацію прийняв, але толком не обробив (цей тиждень якийсь дикий був). Потім була технічна співбесіда в інший день, яку я пройшов і того ж дня, ввечері, мені вона відписала, що їм все сподобалось, тому готові пропонувати офер. То ж, чекаю офер, має бути на початку наступного тижня. І зараз, на цьому етапі, я розумію, що трохи продешевив, от.
Приблизно так:
Дякую, тільки вони найняли якусь українську агенцію, щоб шукати тут кандидатів. Тому, це напевно тре буде якось українською сформулювати, але загалом шаблон я зрозумів.
Дуже рідко після отримання очікуваної ставки від кандидата компанії самі кажуть "ну в нас бюджет більший, тому ми вам пропонуємо +1000 до того що ви сказали".
Хах, у мене так майже двічі було.. Напевно, просто щастило.
Все треба казати прямо
Хороший план, тре буде прикинути вартість заліза зараз.
Мені от ще цікаво, краще почекати коли вже остаточно матиму офер на "руках" (пошті) (обіцяли вислати вже у пн/вт), щоб завести розмову про гроші, чи сказати ще до отримання оферу. І ще одне, наявність на руках іншого оферу, теж може зіграти позитивно? Я ще на наступному тижні очікую відповіді від іншої компанії, але це типова українська аутсорс компанія, грошей там менше буде, але будуть типові плюшки. Цю карту можна якось коректно розіграти? Бо я в цьому досвіду не маю
до нас ірландці з республіки Ірландія ставляться як до братів по крові, бо вони у свій час вибороли незалежність від окупанта (Британії) і дивляться на нас як на тих, хто проходить той самий шлях
Це я помітив, Ірландці круті.
ну й відповідно фізично не можуть понаставляти всіляких трекерів; а запасний вживаний ноут можна придбати цілком реально придбати за 15к гривень, а за 25к+ гривень більш-менш реально придбати і новий базової конфігурації, що для гребця не є аж такою проблемою
Тут не зовсім так, через специфіку проєкту, як я розумію, будь-що не підійде. Потрібно буде щось точно з більш-менш хорошою відеокартою, хоча я ще не встиг обговорити конфігурацію. Сфера все ж геймдев/графіка/3D.
півтора української галерної ставки більш-менш реально, однак на жаль, зважаючи на те що вже названа сума, думаю додаткові 500 єнотів можна спробувати вибити; ну й ще варіант особливо класно показати себе впродовж випробувального і тоді на підсумковому мітингу після випробувального попросити заслужені +500 єнотів.
Гм, +500 було б не так і погано, але от не знаю, якби це так до цього питання підійти й натякнути)
Панове, потрібна порада. Пропонує офер ірландська продуктова компанія напряму, якої немає на українському ринку, відповідно дає більш обмежений перелік всяких плюшок на відміну від українських аутсорс компаній, наприклад, не надають робочу техніку (через складнощі її доставляння в Україну) або ФОП прийдеться вести самому тощо. І, я от думаю, наскільки було б погано (на даному етапі) спробувати випросити в них більше грошей?
Я щось протупив та не одразу зрозумів, що це ж закордонна компанія, а суму назвав як для реалій українського ринку..
бо я навіть не можу перемикати мови шорткатами
Я для шорткатів мови юзав kawa, єдиний мінус під ARM проц треба ручками перекомпілювати, але на диво у мене все працювало гуд.
масштабування теж якесь деганське
Є таке, я помічав, що це ще може залежати від HDMI кабеля. Купівля просто якіснішого мені допомогла. Але ще можна спробувати скористатись BetterDisplay тулзою.
батарейка тримає мегадовго / воно дуже компактне і легеньке
Для мене в свій час це були основні плюси, які в цілому позитивно змінили моє ставлення до ноутбуків.
Факі почав займатися AI? Чи для чого саме йому високопродуктивний ноут на базі саме ARM... Походу йому це "шоб було" або ж "не маю до чого взятися, спробую цю залізяку".
Не переводьте питання. До чого тут Факі чи ШІ? Я лише говорив, що трохи недоцільно порівнювати ціни на ноутбуки розглядаючи один на звичній х64 архітектурі (якийсь умовний Інтел і5-7) та ноутбук на ARM-процесорі, який не поступається продуктивністю першому.
Чи для чого саме йому високопродуктивний ноут на базі саме ARM...
А, яка різниця для чого саме? Якщо ви можете собі дозволити купити високопродуктивний ноут, то чому цього не зробити? Я сумніваюсь, що хтось би, в здоровому глузді, маючи можливість та гроші, свідомо придбав набагато гірший ноут.
Я до того, що хто б обрав Ланос замість Мерседеса, маючи можливість та гроші придбати Мерседес..
Походу йому це "шоб було" або ж "не маю до чого взятися, спробую цю залізяку".
Не бачу в цьому проблеми.
Знову ж таки, "сусід наспівав", що для базових моделей mac у порівнянні з hp лише на 15% дорожчий, однак коли йдеться про прокачані за характеристиками моделі, ціни на mac вже йдуть "суттєво" вищі.
Покажіть мені ноутбук від hp на ARM-процесорі з такими ж конфігураціями та продуктивністю, які пропонує mac. Тоді можемо поговорити за ціни.
Популярні інструменти для програмування зараз універсальні для всіх платформ, наприклад Jupyter Notebook. Проблема з маками виникає, коли потрібна якась комплектуюча типу невинного кабеля, а він раптом коштує вдесятеро більше, ніж подібний кабель для HP чи Dell.
Брехня, за пару сотень гривень можна купити перехідник з USB-C на майже будь-який інший роз'єм. Або одразу можна собі взяти хаб з купою перехідників (все в одному), маю такий один вже зо 3 роки (китайський, коштував до 1000 гривень, там щось 8в1).
Ґуґлити "overpriced mac cable".
Ви ж ніколи тим маком не користувались, нащо писати про те, в чому не тямите?
Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.
Як розуміти оце ваше: "на Windows 11 (MSVC) — такий підхід не спрацював"? Програма не компілюється чи може вона форматує диск, замість збереження даних?
Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.
Знову ж таки, дивлячись, які дані ви зберігаєте та в якій кількості? Як часто користувач може робити ці зміни тощо?
Якщо це не багато інформації яку необхідно зберегти, а користувач ймовірніше за все робитиме ці зміни не часто, то чому б не зберігати її одразу після того, як користувач змінив налаштування?
Сенс у відкладеному зберіганні є, якщо ви знаєте, що ймовірніше за все, користувач може часто щось оновлювати. Тому, щоб багато раз не зберігати маленькі шматочки інформації, ви чекаєте поки не накопичиться більше інформації, щоб потім залпом її зберегти за один виклик.
Але на Manjaro в мене Chromium стоїть.
Тому таке попередження вилазить лише на Віндовс 11.
Це не має стосунку до того, який браузер у вас встановлено.
Швидше за все, справа в Chrome, на основі якого створено QtWebEngineView.
І в інших бачу така ж проблема з ним.
Швидше за все справа саме в Qt6, а не в Chromium. І так, коли збираєте під віндовс, переконайтесь, що збірка відбувається саме через MSVC, бо MinGW не збере коректно Chromium під вінду.
Мені чомусь здається, що ви знову чогось не договорюєте.. Це точно весь вивід, який вам видав зневаджувач? Ех.. Ну, гаразд, яке питання..
З погляду D3D11, це попередження з'являється якщо ви створили InputLayout компонентів з таким типом:
D3D11_INPUT_ELEMENT_DESC inputLayout[] =
{
{ "TEXCOORD", 0, DXGI_FORMAT_R16G16_UINT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
/* інші компоненти "COLOR", "POSITION" тощо. */
};
d3d11Device->CreateInputLayout(inputLayout, numElements, ...);
Зверніть увагу на вказаний тип компонента -- DXGI_FORMAT_R16G16_UINT.
Але у вершинному шейдері тип цього компонента було вказано іншим, як от
struct VertexShaderInput
{
int2 texcoord : TEXCOORD;
/* інші компоненти "COLOR", "POSITION" тощо. */
};
Тут тип вже вказано int2 (тобто int32), хоча мало б бути щось типу ushort2 (тобто uint16). Але як я пам'ятаю HLSL підтримує 16-бітні типи лише з переданим ключиком -enable-16bit-types.
Щоб це виправити потрібно виправити шейдер або те, як ви створюєте InputLayout. Ну, або знати більше контексту, хто і звідки це кидає. Не виключено, що це може бути баг і у самому Qt.
Налаштування для iOS та Android вже були в автоматично згенерованому CMake від Qt.
Тобто, це повністю згенерований Qt файл, не ви його писали? Це їхній Qt Creator так генерує? Гм, як на мене, це, дуже ненадійний підхід. Загалом, я б рекомендував всі залежності додавати як підмодулі (git sub-modules) та дозволити CMake вантажити їх під час конфігурації проєкту. Таким чином, ви б зняли додаткову відповідальність з користувача, робити зайві дії + автоматизація процесу. Але з Qt так, схоже, не вийде. Та й це було б занадто, враховуючи розміри Qt..
Тому, на вашому місці, перше, що я б зробив: переписав CMakeLists.txt та повикидував звідти все, що не використовується. Воно то вам може і не заважає, але хтозна-коли і як воно може вистрілити. Потім, оскільки все ж крок інсталяції Qt ручками пропустити не дуже вийде, я б запропонував додати білд скрипт (build.sh/build.bat), який би перевіряв наявність встановленого Qt й при необхідності [можливо вони лише вінді потрібні?] додавав CMAKE_PREFIX_PATH або QT_DIR (я підозрюю, що вони все ж потрібні, проте, ймовірно, не завжди задаються автоматично, гляньте, що у вас в Manjaro по env змінних) та викликав власне CMake для збірки. І замість виклику напряму CMake використовував цей скрипт. Це додасть трохи більше автоматизації та зручності.
Тобто ви взяли чисту інсталяцію Windows 11 та запустили збірку свого проєкту?.. А, Qt ви встановлювали? Ви, знову пропонуєте нам вгадувати, що ви робили, а що - ні?
видає таку помилку щодо CMake
Ну, хоч помилку скопіювали й на тому дякую.
CMake файл
Бачу у вас є конфіг для Android та iOS, навіщо? Ви збираєте свій проєкт під мобілки? Ви тестували збірку під Android та iOS? Якщо ні, то навіщо вам це в CMake файлі?