41

(14 535 відповідей, залишених у Інше)

Так-так, польський пан тут ні до чого :D
Яку послугу? Зняти авто з обліку? Це спокійно можна зробити онлайн через Дію.
Як і дуже багато чого, мені іноді навіть здається, що місцями ми задалеко з цією "цифровізацією" зайшли. Я взагалі не пам'ятаю коли востаннє йшов у якісь держустанови, для оформлення хоч чогось.

> В україні вводять онлайн послугу, щоб не йти в держустанову
> Вкраїнчики обсирають
...
> В польщі вводять онлайн послугу, щоб не йти в держустанову
> Вкраїнчики б'ються в екстазі Zwycięstwo będzie nasze! Dziękuję za wsparcie! Niech żyje Polska! :!

42

(14 535 відповідей, залишених у Інше)

Та куди там нам, українському селу до польських панів.

43

(14 відповідей, залишених у C++)

Якщо ніяк не ініціалізувати, то нічого і не буде ініціалізовано. Там буде сміття, іноді компілятори або Address/Memory Sanitizers можуть пхати в неініціалізовану змінну певні маркери, як от -1094795586 значення. Для можливості відловлювання доступу до таких обʼєктів.
Щодо часткової ініціалізації, то так — це очікувана поведінка.

44

(14 відповідей, залишених у C++)

Загалом `type *` – це анотація вказівника на певний тип (зліва від *). Вказівник може вказувати як на один єдиний об'єкт так і на перший елемент з масиву об'єктів, як вже було сказано вище. Все залежить від контексту та даних.

int     a  [3] = {1, 2, 3};         // << це масив `int`ів
int  (*pa) [3] = &a;                // << це вказівник на масив `int`ів
int*    ap [3] = {a, a + 1, a + 2}; // << це масив з вказівників на `int`
int* (*pap)[3] = &ap;               // << це вказівник на масив з вказівників на `int`
int**  pp      = ap;                // << це вказівник на вказівник на `int`

Вказівники – це база, вони є всюди (якщо дозволяє середовище) :)

45

(2 588 відповідей, залишених у Інше)

Наступного місяця розробники з моєї компанії даватимуть доповідь на CppCon, де на одному з перших слайдів є згадка про війну в Україні і як виявилось – це може бути проблемо, бо "owners can get twitchy", це ж "технічна" конференція, звісно..
Але найсмішніше те, що людина з якою можна проконсультуватися по цьому питанні, щоб не було проблем, це русня (Timur Doumler). Чєл який дає доповіді російською й любить їздити на росію.

46

(0 відповідей, залишених у *nix)

Хочу поділитись та в певному сенсі десь ще занотувати для себе різні (корисні) програми для MacOS, які можуть зробити життя на цій ОС зручнішими.

Прихований текст

Востаннє коли я сидів на MacOS, то користувався різними застосунками і тепер коли знову повернувся на мак, трохи шкодую, що ніде не зберіг собі, що саме встановлював.

Розпочну, мабуть, з найважливішого:

  • Raycast [musthave][free/paid] – чудовий застосунок для підвищення продуктивності. Виконує ту ж роль, що й дефолтний Spotlight, але більше, краще та зручніше. Раніше ще користувався майже ідентичною програмою Alfred, але наразі Raycast мій новий фаворит.

  • Homebrew [musthave][free] – така необхідна система керування пакетами.

  • BetterDisplay [musthave][free] – мабуть найкращий застосунок для керування дисплеями та моніторами. Дозволяє змінювати конфігурації, контролювати яскравість і колір, підтримує XDR/HDR тощо. Як непогана альтернатива є ще Lunar.

  • IINA /ˈiːnə/ [musthave][free] – швидкий та сучасний медіаплеєр.

  • Rectangle [musthave][free/paid] – дозволяє переміщувати та змінювати розмір вікон за допомогою комбінацій клавіш або областей прив’язки. Це просто зручно.

  • iTerm2 [musthave][free] – найкраща заміна вбудованого терміналу.

  • Neovim + NvChad [optional][free] – альтернатива текстовому редактору та IDE (можна налаштувати під будь-який стек).

  • 1Password [optional][paid] – особисто для мене найкращий менеджер паролів, підтримує купу платформ та має розширення для браузерів, коштує $2.99/міс. користуюсь вже кілька років. Інші безкоштовні альтернативи Bitwarden, heylogin.

  • Keka [optional][free] – файловий (роз)архіватор.

Інші цікаві програми:

  • Arc [free] – наче й нічого особливого, базується на Chromium й написаний на Swift, але дає дещо новий досвід перегляду. Все, що я можу сказати, це спробуйте. Має справді гарні функції, яких немає в жодному іншому браузері.

  • Pearcleaner [free] – зручніша альтернатива AppCleaner'а, дозволяє повністю деінсталювати інші програми.

  • Balance Lock [free] – раніше бувало, що macOS чомусь змінювала аудіобаланс навушників, ця програма дозволяє це виправити. Хоча у себе зараз цього не помічаю.

  • Stats [free] – системний монітор у панелі меню.

  • Ice [free] – потужний інструмент керування панеллю меню. Дозволяє приховувати та показувати різні елементи панелі меню.

  • macSvn [free/paid] – SVN? Так. Цей застосунок намагається бути схожим на черепаху.

  • VMware Fusion Pro [free] – віртуалка.

Здається нічого не забув, якщо теж чимось користуєтесь – діліться.

47

(23 відповідей, залишених у C++)

А я звідки знаю, це ж ви вперто відмовляєтесь показати весь ваш CMakeLists.txt. Бо так можна довго вгадувати, що ви й куди вставляли.

48

(23 відповідей, залишених у C++)

Ви знущаєтесь?

49

(23 відповідей, залишених у C++)

Ну, то візьміть лише останні рядки:

# Цією командою можна зручно встановити бажаний стандарт [c++17, c++20, c++23]
target_compile_features(<YOUR_TARGET> PUBLIC cxx_std_20)
# Цією командою можна легко додати дефайни, можна вписувати їх на місці
target_compile_definitions(<YOUR_TARGET> PUBLIC _GLIBCXX_DEBUG)
# Цією командою виставляємо прапорці компілятору
target_compile_options(<YOUR_TARGET>
    PUBLIC -Wall
           -Wextra
           -Wpedantic
           -fsanitize=address,undefined)
# Цією командою виставляємо прапорці лінкеру
target_link_options(<YOUR_TARGET>
    PUBLIC -fsanitize=address,undefined)

Санітайзер потрібно передавати і компілятору і лінкеру. Зможете з 4 командами впоратись?

50

(23 відповідей, залишених у C++)

Teg Miles написав:
wander написав:
Teg Miles написав:

Підкажіть із CMakeLists.txt, я всі проєкти з ним роблю.

Ну, можна якось так:

Прихований текст
cmake_minimum_required(VERSION 3.20)

project(test)

include(CheckCXXSymbolExists)
check_cxx_symbol_exists(_LIBCPP_VERSION "cstddef" IS_LIBCXX)

set(CXX_LIBSTD_DEBUG_FLAGS)
if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    if(IS_LIBCXX)
        # NOTE: debug mode is immature in Clang, and values of _LIBCPP_DEBUG above 0
        # require  the debug build of libc++ to be present at linktime.
        list(APPEND CXX_LIBSTD_DEBUG_FLAGS _LIBCPP_DEBUG=1)
    else()
        # Enable diagnostic features of standard class templates, including ability
        # to examine containers in gdb.
        # See https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_using.html
        list(APPEND CXX_LIBSTD_DEBUG_FLAGS _GLIBCXX_DEBUG)
    endif()
endif()

option(CXX_ENABLE_SANITIZER_ADDRESS   "Enable address sanitizer." YES)
option(CXX_ENABLE_SANITIZER_UNDEFINED "Enable UB sanitizer."      YES)

set(CXX_SANITIZERS "")

if(CXX_ENABLE_SANITIZER_ADDRESS)
    list(APPEND CXX_SANITIZERS "address")
endif()

if(CXX_ENABLE_SANITIZER_UNDEFINED)
    list(APPEND CXX_SANITIZERS "undefined")
endif()

list(JOIN CXX_SANITIZERS "," CXX_ENABLED_SANITIZERS)

add_executable(out_of_bounds_test
    main.cpp)
# Set c++20
target_compile_features(out_of_bounds_test PRIVATE cxx_std_20)
# Set c++ standard library build flags
target_compile_definitions(out_of_bounds_test
    PRIVATE ${CXX_LIBSTD_DEBUG_FLAGS})
# Set sanitizers (if any)
target_compile_options(out_of_bounds_test
    PUBLIC -fsanitize=${CXX_ENABLED_SANITIZERS})
target_link_options(out_of_bounds_test
    PUBLIC -fsanitize=${CXX_ENABLED_SANITIZERS})

Посилання на godbolt.

Teg Miles написав:

Два останніх закоментив, бо ще не знаю, яку там конфігурацію краще обрати.

Перевизначати будь-які CMAKE_<LANG>_FLAGS_<BUILD_TYPE> – погана ідея (виняток: якщо інакше не обійтись).

А якщо ось так:

add_compile_options(
"$<$<COMPILE_LANGUAGE:CXX>:-Ofast;-DNDEBUG;-std=c++20;-march=native;-fpic;-ftree-vectorize>"
)

Так тут ж зовсім інші опції виставлені.. Вам обов'язково в один рядок?

51

(23 відповідей, залишених у C++)

Teg Miles написав:
wander написав:

З Vim – хз, я використовую neovim з плагіном для cmake (для майже всіх випадків).
Даний уривок я зібрав напряму з командного рядка ручками, як виключення, бо так було швидше.
Можу підказати з налаштуванням CMakeLists.txt, а як той vim у вас збирає я не знаю.

Підкажіть із CMakeLists.txt, я всі проєкти з ним роблю.

Ну, можна якось так:

Прихований текст
cmake_minimum_required(VERSION 3.20)

project(test)

include(CheckCXXSymbolExists)
check_cxx_symbol_exists(_LIBCPP_VERSION "cstddef" IS_LIBCXX)

set(CXX_LIBSTD_DEBUG_FLAGS)
if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    if(IS_LIBCXX)
        # NOTE: debug mode is immature in Clang, and values of _LIBCPP_DEBUG above 0
        # require  the debug build of libc++ to be present at linktime.
        list(APPEND CXX_LIBSTD_DEBUG_FLAGS _LIBCPP_DEBUG=1)
    else()
        # Enable diagnostic features of standard class templates, including ability
        # to examine containers in gdb.
        # See https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_using.html
        list(APPEND CXX_LIBSTD_DEBUG_FLAGS _GLIBCXX_DEBUG)
    endif()
endif()

option(CXX_ENABLE_SANITIZER_ADDRESS   "Enable address sanitizer." YES)
option(CXX_ENABLE_SANITIZER_UNDEFINED "Enable UB sanitizer."      YES)

set(CXX_SANITIZERS "")

if(CXX_ENABLE_SANITIZER_ADDRESS)
    list(APPEND CXX_SANITIZERS "address")
endif()

if(CXX_ENABLE_SANITIZER_UNDEFINED)
    list(APPEND CXX_SANITIZERS "undefined")
endif()

list(JOIN CXX_SANITIZERS "," CXX_ENABLED_SANITIZERS)

add_executable(out_of_bounds_test
    main.cpp)
# Set c++20
target_compile_features(out_of_bounds_test PRIVATE cxx_std_20)
# Set c++ standard library debug flags
target_compile_definitions(out_of_bounds_test
    PRIVATE ${CXX_LIBSTD_DEBUG_FLAGS})
# Set sanitizers (if any)
target_compile_options(out_of_bounds_test
    PUBLIC -fsanitize=${CXX_ENABLED_SANITIZERS})
target_link_options(out_of_bounds_test
    PUBLIC -fsanitize=${CXX_ENABLED_SANITIZERS})

Посилання на godbolt.

Teg Miles написав:

Два останніх закоментив, бо ще не знаю, яку там конфігурацію краще обрати.

Перевизначати будь-які CMAKE_<LANG>_FLAGS_<BUILD_TYPE> – погана ідея (виняток: якщо інакше не обійтись).

52

(23 відповідей, залишених у C++)

З Vim – хз, я використовую neovim з плагіном для cmake (для майже всіх випадків).
Даний уривок я зібрав напряму з командного рядка ручками, як виключення, бо так було швидше.
Можу підказати з налаштуванням CMakeLists.txt, а як той vim у вас збирає я не знаю.

53

(23 відповідей, залишених у C++)

Teg Miles написав:

До речі, якщо працюєте з контейнерами і треба дістати щось за індексом,
то краще використовувати оператор .at(), а не оператор [].
Бо .at() при неправильному індексі видає вищезгадану помилку,
а [] просто тихенько видає вам нулик (якщо масив був з цілими числами).

Вихід за межі масиву – UB, загалом, в такому випадку компілятор не зобов'язаний надавати жодних діагностик. Але це не означає, що його не можна про це попросити.
Повторюсь ще раз, такий підхід (методом тику), далеко вас не заведе. Ні, звісно можна пробувати випадкові речі й сподіватися, що компілятор це пропустить/програма не впаде. Але ви ж так і не зрозумієте, чому так сталося і що можна зробити. Приклад:

#include <vector>
int main() {
    std::vector<int> v;
    return v[100];
}

> compile

g++ -o main main.cpp -std=c++20 -Wall -Wextra -Wpedantic -fsanitize=address,undefined -D_GLIBCXX_DEBUG -g -O0

> out

Прихований текст

Program returned: 1
Program stderr
/opt/gcc-14.1.0/include/c++/14.1.0/debug/vector:508:
In function:
    constexpr std::debug::vector<_Tp, _Allocator>::reference std::
    debug::vector<_Tp, _Allocator>::operator[](size_type) [with _Tp = int;
    _Allocator = std::allocator<int>; reference = int&; size_type = long
    unsigned int]

Error: attempt to subscript container with out-of-bounds index 100, but
container only holds 0 elements.

Objects involved in the operation:
    sequence "this" @ 0x7bab53100020 {
      type = std::debug::vector<int, std::allocator<int> >;
    }
AddressSanitizer:DEADLYSIGNAL
=================================================================
==1==ERROR: AddressSanitizer: SEGV on unknown address (pc 0x7bab54e28898 bp 0x7bab5501be90 sp 0x7ffd1b2f5b00 T0)
==1==The signal is caused by a READ memory access.
==1==Hint: this fault was caused by a dereference of a high value address (see register values below).  Disassemble the provided pc to learn which register was used.
    #0 0x7bab54e28898 in abort (/lib/x86_64-linux-gnu/libc.so.6+0x28898) (BuildId: 490fef8403240c91833978d494d39e537409b92e)
    #1 0x7bab5584d1c2  (/opt/gcc-14.1.0/lib64/libstdc++.so.6+0xb01c2) (BuildId: a436cc09b39e5efb87974aa327eeae4272fd1b23)
    #2 0x403a4e in std::__debug::vector<int, std::allocator<int> >::operator[](unsigned long) /opt/compiler-explorer/gcc-14.1.0/include/c++/14.1.0/debug/vector:508
    #3 0x4023f8 in main main.cpp:4
    #4 0x7bab54e29d8f  (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f) (BuildId: 490fef8403240c91833978d494d39e537409b92e)
    #5 0x7bab54e29e3f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e3f) (BuildId: 490fef8403240c91833978d494d39e537409b92e)
    #6 0x4021e4 in _start (main.s+0x4021e4) (BuildId: 3202272c5c10ff79ea754c5b4f416e4a27b534ed)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/lib/x86_64-linux-gnu/libc.so.6+0x28898) (BuildId: 490fef8403240c91833978d494d39e537409b92e) in abort
==1==ABORTING

Посилання на godbolt.

54

(7 відповідей, залишених у C++)

Teg Miles написав:
wander написав:

А, чому ви вирішили, що другий варіант працює без помилок?

Бо там не було повідомлень про помилку.

Таааак, з таким підходом до навчання ви далеко не просунетесь..

leofun01 написав:

масив змінної довжини (VLA) це синтаксний цукор

VLA – це не синаксичний цукор, а повноцінне розширення системи типів в С, але не в С++.

55

(7 відповідей, залишених у C++)

А, чому ви вирішили, що другий варіант працює без помилок?

56

(28 відповідей, залишених у C++)

leofun01 написав:

Там ще є приклади, і вони тільки підтверджують, що діставати адресу [так як я зробив] можна, і в даному випадку це не буде UB, див. рядки

Загалом приклади (examples) та нотатки (notes) не є нормативними, але так приклади там все вірно описують, у тебе же ситуація чуть інша. Адже

int  i;
int* pi = &i; // Це теж ок, хоча `i` й не була ініціалізована.
*pi;          // А такий код вже UB, хоча знову ж, це не твій випадок :)
leofun01 написав:

Цей struct є trivial

Так, і що?

leofun01 написав:

і цей конструктор не має параметрів

Тут взагалі не зрозумів до чого це?..

leofun01 написав:

тому тут все файно (well defined)

Ну, най тобі буде так :)

leofun01 написав:

Чи "активний/не активний" це про щось інше ?

В тебе union має два мембери o та l, далі див. нижче

https://eel.is/c++draft/class.union#general-2.sentence-2 написав:

In a union, a non-static data member is active if its name refers to an object whose lifetime has begun and has not ended. At most one of the non-static data members of an object of union type can be active at any time, that is, the value of at most one of the non-static data members can be stored in a union at any time.

, потім читаємо далі:

https://eel.is/c++draft/class.union#general-5 написав:

When the left operand of an assignment operator involves a member access expression that nominates a union member, it may begin the lifetime of that union member (ie may make it active) [...]

Тобто, union мембер може стати (не)активним (розпочати / завершити свій lifetime) через конструктор/деструктор або оператор присвоєння форми union.member = [some expression].

57

(28 відповідей, залишених у C++)

leofun01 написав:

Я зробив так що: перша для публічного читаня, друга для приватного rw. Це зручно, коли хочеш виводити вміст без ризику перезапису.

Для цього придумали методи та функції, які набагато простіше писати, читати та використовувати.

leofun01 написав:

Час життя може й не почав, але память під нього вже виділена, значить адресу вже має.
Стосовно само-ініціалізації: загалом так, але в даному випадку я тільки беру адресу, це не заважає процесу ініціалізації.

З однієї сторони я можу погодитись, але з іншої, стандарт чітко говорить:

https://eel.is/c++draft/class.cdtor написав:

For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior.

leofun01 написав:

Чому не активний, дуже навіть активний.

Ні, не активний. Одночасно активним може бути лише один мембер або `o`, або `l`. Обидва не можуть бути активними. Якщо `o` активний, то `l` автоматично стає не активним і навпаки.

58

(28 відповідей, залишених у C++)

Справа не лише в #define'ах, ви ходите по дуже тонкому льоду.

leofun01 написав:
union MyLinkedList { // Чому `union`???

    /*
    Яка роль цих структур? Для чого вони? Це якийсь особливий прийом обфускації?)
    static struct C { // І чому тут `static`?
        int const v;
        C const *const p, *const n;
    };
    struct {
        int const length;
        C const *const tail, *const head;
    };
    */

    ...

    // Об'єкт `o` (він же член класу), ще не розпочав час свого життя.
    // Коли ініціалізація `o({ 0, &o, &o })` виконується, об'єкт `o` ще не ініціалізовано,
    // і взяття його адреси або використання для самоініціалізації є невизначеною поведінкою.
    // Це тому, що `o` використовується до завершення його ініціалізації.
    MyLinkedList() : o({ 0, &o, &o }) { }

    N *getNode(int i) {
        int c = l + 1 // << UB, спроба прочитати неактивний мембер `l` юніона.
        ...
    }
    void addAfterNode(N *p, int v) {
        ...
        ++l; // << UB, спроба прочитати неактивний мембер `l` юніона.
    }
    void deleteNode(N *x) {
        --l; // Теж саме, в інших функціях ті ж проблеми з активними/неактивними мемберами.
        ...;
    }

    ...
};

MyLinkedList myList;
myList.addAtHead(5);
auto i = myList.get(0);
leofun01 написав:

Якщо замість 1-символьних поставити повні ідентифікатори і видалити #define'и, то код більш читабельним не стане.

Ну, кому як.

59

(28 відповідей, залишених у C++)

leofun01 написав:

Ніщо так не мотивує, як дивитись коли хтось робить не правильно.

А, хто казав, що його код не правильний? Код пана Teg Miles принаймні читабельний.

leofun01 написав:

#define'и додав, бо мені код з короткими ідентифікаторами гарніший [і я скупий на символи]

То візьміть пайтона та пишіть на ньому. Певен там можна все в 1 рядок написати :D

60

(14 535 відповідей, залишених у Інше)

FakiNyan написав:
wander написав:
FakiNyan написав:

все, придбав макбука того, страждаю тепер.

Хех, от і я теж повернувся на мак, майже після 2 років перерви)

а чо?

Новий проєкт – нове життя))