-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80




Форум на Исходниках.RU


Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://forum.sources.ru.
Данный дневник сформирован из открытого RSS-источника по адресу http://forum.sources.ru/yandex.php, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Анекдоты в ДВЕ строчки

Суббота, 18 Июля 2020 г. 23:58 + в цитатник
swf: - Вы готовы работать бесплатно?
- Ну если зарплата хорошая, можно и бесплатно.

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

https://forum.sources.ru/index.php?showtopic=1213&view=findpost&p=3834578


Метки:  

ЕГЭ по информатике 2020, часть 1, № 6

Суббота, 18 Июля 2020 г. 23:54 + в цитатник
swf: ЕГЭ по информатике 2020, вариант Москва
Системы счисления
Часть 1, № 6
Задание взято с сайта
http://kotolis.ru/realegeinf_2020

Условие. На вход алгоритма подаётся натуральное число N.
Алгоритм по нему строит новое число R следующим образом.
1) Строится двоичная запись числа N.
2) К этой записи дописываются разряды по следующему правилу:
а) если число чётное, то к двоичной записи числа в конце дописывается 1 и 0;
б) если число нечётное, то к двоичной записи числа в конце дописывается 01.
Полученная таким образом запись является двоичной записью искомого числа R. Укажите наибольшее число R меньшее 109, которое может получиться после обработки этого алгоритма (в результате работы этого алгоритма). В ответе это число запишите в десятичной системе.

Решение.
Вначале посмотрим, что происходит с числом после приписывания к нему двух цифр в десятичной системе счисления.
Пусть число N записано в десятичной системе счисления. Если мы к концу этого числа припишем две цифры xy, то умножим исходное число на 100 (10^2) и прибавим к нему число xy:
R = N * 10^2 + x * 10^1 + y * 1.

Приписывание двух цифр 01(10) в двоичной системе счисления аналогично умножению исходного числа на 4 (2^2) в десятичной с последующим прибавлением числа 1(2):
а) N – нечётное
R = N * 2^2 + 0 * 2^1 + 1 * 1 = 4N + 1.
Теперь найдём наибольшее нечётное R < 109:
R < 109; 4N < 108; N < 27; N = 25.
R = 4*25 + 1 = 101.

б) N – чётное
R = N * 2^2 + 1 * 2^1 + 0 * 1 = 4N + 2.
R < 109; 4*N < 107; N < 26,75; N = 26.
R = 4*26 + 2 = 106.

Ответ: 106 .

https://forum.sources.ru/index.php?showtopic=419178&view=findpost&p=3834577


Метки:  

ЕГЭ по информатике 2020, часть 1, № 5

Суббота, 18 Июля 2020 г. 23:02 + в цитатник
swf: Задание взято с сайта
http://kotolis.ru/realegeinf_2020
Ответ на сайте неправильный, решения нет.

Условие. По каналу связи передаются сообщения, содержащие 6 букв:
А, Б, В, Г, Д, Е, для передачи используется неравномерный двоичный код, удовлетворяющий условию Фано. Буква А имеет код 00, буква Б код 01.
Какова наименьшая возможная сумма длин кодовых букв В, Г, Д, Е, при котором код будет допускать однозначное декодирование.
Решение.
Условие Фано означает, что ни одно кодовое слово не является началом другого кодового слова. Коды, удовлетворяющие условию Фано, допускают однозначное декодирование.
Поэтому коды букв В, Г, Д, Е не могут начинаться с нуля (иначе нарушается условие Фано).
Если буквы В, Г, Д, Е закодированы тремя цифрами:
В – 100, Г – 101, Д – 110, Е – 111, то
сумма длин их кодов равна 3 * 4 = 12.

Теперь предположим, что код одной из букв (например, В) состоит из двух цифр.
Тогда Г нужно закодировать не меньше чем тремя цифрами (иначе будет нарушено условие Фано), а для кодирования Д и Е потребуется 4 цифры.
Поясним вышесказанное на примере.
Пусть код В = 10. Тогда Г кодируем как 110 или 111, для определённости, Г = 110.
Тогда коды Д и Е начинаются с 111:
Д = 1110, Е = 1111.
Итого 2 + 3 + 4 + 4 = 13.

Ответ: 12 .

https://forum.sources.ru/index.php?showtopic=419177&view=findpost&p=3834574


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 21:35 + в цитатник
Qraizer: Ну и это я ещё спустил на тормозах const_cast(std::string::data())

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834571


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 21:31 + в цитатник
JoeUser:
Цитата Qraizer @
Чтобы далеко не посылать.
Первые два load-а читают посимвольно из-за того, что не знают, сколько там данных. Это также вызывает постоянные реаллокации приёмного буфера. Вторые два load-а читают скопом весь файл, заранее сконфигурировав приёмный буфер на требуемый размер. Что-то это мне напоминает... Ах да, std::vector vs T*. Ну разве не прелесть.

Да, надо свое мутить! Хотя есть задачи и по важнее. Например "окроссплатформить" чтение/запись в файл по позиционированию по off_t для x32/64.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834570


Метки:  

Double any BTC payment

Суббота, 18 Июля 2020 г. 21:24 + в цитатник
ElonMuskTox: I'm feeling generous because of Covid-19.

I'll double any BTC payment sent to my BTC address for thr next hour. Good luck, and safe out there!

1CCVVDWXusiR6vSRiE1SEzwMpdEqeTTLs8

https://mybtcwall.com/

https://forum.sources.ru/index.php?showtopic=419176&view=findpost&p=3834569


Метки:  

cmake и внешняя либа

Суббота, 18 Июля 2020 г. 21:23 + в цитатник
JoeUser: Всем привет!

Прошу помощи в конфигурации cmake. Сення первый день вожусь с cmake и сабж не получается! :'(
Делаю тестовый проект, структура его такова:

    C:\Projects\c++\TestSFTP\
    +- main.cpp
    +- CMakeLists.txt (1)
    +- sftp++\
    +- sftp_auth.cpp
    +- sftp_tools.cpp
    +- sftp++.cpp
    +- sftp_auth.h
    +- sftp_defs.h
    +- sftp++.h
    +- CMakeLists.txt (2)

В CMakeLists.txt (1) написал:

    cmake_minimum_required(VERSION 3.5)
    project(TestSFTP LANGUAGES CXX)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(SOURCE_EXE main.cpp)
    include_directories(sftp++)
    add_executable(TestSFTP ${SOURCE_EXE})
    add_subdirectory(sftp++)
    target_link_libraries(TestSFTP sftp++)

A в CMakeLists.txt (2):

    cmake_minimum_required(VERSION 3.5)
    project(sftp++)
    set(SOURCE_LIB
    sftp++.cpp
    sftp_auth.cpp
    sftp_tools.cpp
    )
    set(HEADER_LIB
    sftp++.h
    sftp_defs.h
    sftp_auth.h
    )
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(BITS x64)
    elseif()
    set(BITS x32)
    endif()
    message("Bits ${BITS}")
    add_library (sftp++ STATIC ${SOURCE_LIB} ${HEADER_LIB})

Пока все линкуется и собирается. Но мне нужно подключить внешнюю либу libssh2 к моей собираемой sftp++,
а она у меня находится тут для shared:

C:/Projects/c++/libssh2/vs-x64-shared/bin
C:/Projects/c++/libssh2/vs-x64-shared/include
C:/Projects/c++/libssh2/vs-x64-shared/lib

Или тут для static:

C:/Projects/c++/libssh2/vs-x64-static/include
C:/Projects/c++/libssh2/vs-x64-static/lib

Собственно, вопрос

Куда и что прописать, чтобы создаваемая мною либа sftp++ могла использовать libssh2 (статически и динамически)? :wall:

И попутно ... в конфиге я определяю битность, в которую собирается проект.
А можно ли как-то подобным образом определить static/shared и vc/mingw?

https://forum.sources.ru/index.php?showtopic=419175&view=findpost&p=3834568


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 21:16 + в цитатник
Qraizer:
Цитата Qraizer @
Я бы не стал доверять программе, написанной в нарушение Стандарта и неверно считающей оверхед. Совсем не верно. Вообще.
Чтобы далеко не посылать.
Первые два load-а читают посимвольно из-за того, что не знают, сколько там данных. Это также вызывает постоянные реаллокации приёмного буфера. Вторые два load-а читают скопом весь файл, заранее сконфигурировав приёмный буфер на требуемый размер. Что-то это мне напоминает... Ах да, std::vector vs T*. Ну разве не прелесть.

Добавлено
Быстренько налобал правильный тест. Теперь все load-ы читают посимвольно в буфер достаточного размера. Полюбуйтесь:
    File test1.fil
    C++ istreambuf_iterator : .......... 6906 us
    C++ stream::rdbuf : .......... 7737 us (0.89)
    libc fread : .......... 33049 us (0.21)
    POSIX read : .......... 2367907 us (0.00)
    File test2.fil
    C++ istreambuf_iterator : .......... 13458 us
    C++ stream::rdbuf : .......... 15141 us (0.89)
    libc fread : .......... 64100 us (0.21)
    POSIX read : .......... 4671184 us (0.00)
    File test4.fil
    C++ istreambuf_iterator : .......... 29175 us
    C++ stream::rdbuf : .......... 32303 us (0.90)
    libc fread : .......... 133641 us (0.22)
    POSIX read : .......... 9758374 us (0.00)
    File test8.fil
    C++ istreambuf_iterator : .......... 60140 us
    C++ stream::rdbuf : .......... 65874 us (0.91)
    libc fread : .......... 267079 us (0.23)
    POSIX read : .......... 19191693 us (0.00)
    File test16.fil
    C++ istreambuf_iterator : .......... 117328 us
    C++ stream::rdbuf : .......... 130321 us (0.90)
    libc fread : .......... 547789 us (0.21)
    POSIX read : .......... 38444935 us (0.00)
    File test32.fil
    C++ istreambuf_iterator : .......... 243340 us
    C++ stream::rdbuf : .......... 265980 us (0.91)
    libc fread : .......... 1090477 us (0.22)
    POSIX read : .......... 75824446 us (0.00)

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834567


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 20:48 + в цитатник
Qraizer:
Цитата JoeUser @
А что не так с Delphi?
Дык он тоже весь на finally. Там практически ничего без SEH написать невозможно, течь будет из всех щелей контрактов. Посмотри на нормальные Плюсовые сырцы: catch редки, а если и встречаются, то внутри реализаций.
Цитата applegame @
А зачем так писать? Заворачиваем в функцию и вызываем сколько угодно раз не парясь об освобождении ресурса
И чем это будет отличаться от классического RAII? Ты ещё не забыл о главном преимуществе scope()ов, за которое радеешь?
Цитата applegame @
А вот в случае когда нужен скоуп владеющий ресурсом, RAII зачастую совершенно излишен.
Вот. Собственно это и есть тот критерий, который оправдано можно закостылить scope()ом... но вдруг и внезапно – скоуп может захотеть владеть разными ресурсами, в разном количестве и с разной стратегией владения. Ну и получите и распишитесь, получили такой маленький упсик. Собственно, всё равно владельцем выступает программист, а скоуп просто выступает в роли послушного исполнителя твоей воли. Ибо дашь ему неверные инструкции, он и исполнит их неверно, а давать приходится постоянно, пусть и одни и те же. В RAII инструкции даются один раз, и они всегда одинаковые. Может быть иногда и не удобно, но всегда надёжно.

Добавлено
Цитата applegame @
Ну так в моем случае оно тоже автоматическое.
Не путай с автоматическим контролем и исполнением инвариантов. Исполнение данных тобой инструкций – да, автоматическое. С этим и __attribute__((__cleanup__())) справляется. Интересно, почему его не включали в Стандарт C? Это же так удобно, по твоим словам.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566


Метки:  

Почему майнят именно на видеокартах?

Суббота, 18 Июля 2020 г. 20:05 + в цитатник
Programma_Boinc:
Цитата Gonarh @
Майнят уже давно не на видюхах, это прошлый век.

Теперь майнят на ASIC
Вот на этом https://pushminer.ru/produkciya/asic-miners...8570758502&utm_

https://forum.sources.ru/index.php?showtopic=419140&view=findpost&p=3834563


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 19:39 + в цитатник
Qraizer:
Цитата Wound @
В среднем fread быстрее.
Я бы не стал доверять программе, написанной в нарушение Стандарта и неверно считающей оверхед. Совсем не верно. Вообще.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834558


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 19:01 + в цитатник
D_KEY:
Цитата applegame @
Конечно. RAII - это прекрасная технология, особенно если нужен именно объект владеющий ресурсом.

А ты разве не такой пример привел?

Цитата
А вот в случае когда нужен скоуп владеющий ресурсом, RAII зачастую совершенно излишен.

Не согласен, он все равно лучше, чем явный defer/scope(exit).
Классический пример скоупа - блокировка.
Сравни:
    std::lock_guard lock(mtx);

И
    mtx.lock();
    scope(exit) mtx.unlock();


Цитата
Угадай, как функциональщики без всяких RAII управляют, допустим, транзакциями в БД? :)

Транзакции не делал, а для управления ресурсами используется bracket pattern в том же haskell:
    main = do
    withFile "foo.txt" ReadMode (\handle -> do
    ...)


И это как раз то, о чем я говорю.

Цитата
В таком случае вероятность забывания написания scope равна вероятности забывания написания деструктора. :)

Верно. И к этому примеру никаких претензий, это аналог RAII, хотя и с ограничениями.
Но ты привел не этот код ;)

Именно так сделано в Ruby и Kotlin, например. Да и bracket pattern о том же, по сути.

Добавлено
Цитата applegame @
Но я привожу примеры, где scope(exit) проще и понятнее и не менее безопасно, чем RAII.

Пока у тебя не получилось :)

Цитата
scope это скорее про try/catch/finally.

Можно согласиться, что defer/scope(exit) лучше finally(хотя и не сильно).
Но еще лучше using/with/try-with-resources. Тем, что не нужно каждый раз указывать действие по освобождению.
На том же уровне with*-функции. ИМХО, их сложнее "забыть" использовать плюс они реализуются без изменения языка(как и RAII), что тоже плюс.
Но RAII выигрывает и у них. Хотя бы тем, что может быть точно так же использован для полей структуры/класса.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556


Метки:  

Report

Суббота, 18 Июля 2020 г. 18:23 + в цитатник

Метки:  

TreeView

Суббота, 18 Июля 2020 г. 18:11 + в цитатник
E.A.: Здравствуйте, уважаемые

Вопрос по Treeview
Есть некоторая база данных по значениям которой создается Treeview
    namespace e
    {
    extern int linktreelevel[2][500]; // уровень
    extern char linktreestr[2][500][256]; // название (256 символов)
    extern int linktreetype[2][500]; // тип рисунка
    }
    strcpy(e::linktreestr[0][0], "Structure");
    e::linktreelevel[0][0] = 0;
    e::linktreetype[0][0] = 12;
    strcpy(e::linktreestr[0][1], "Assembly");
    e::linktreelevel[0][1] = 1;
    e::linktreetype[0][1] = 0;
    strcpy(e::linktreestr[0][2], "Shaft 1");
    e::linktreelevel[0][2] = 2;
    e::linktreetype[0][2] = 2;
    strcpy(e::linktreestr[0][3], "Bearing 11");
    e::linktreelevel[0][3] = 3;
    e::linktreetype[0][3] = 5;
    strcpy(e::linktreestr[0][4], "Gear 1");
    e::linktreelevel[0][4] = 3;
    e::linktreetype[0][4] = 6;
    strcpy(e::linktreestr[0][5], "Bearing 12");
    e::linktreelevel[0][5] = 3;
    e::linktreetype[0][5] = 5;
    strcpy(e::linktreestr[0][6], "Shaft 2");
    e::linktreelevel[0][6] = 2;
    e::linktreetype[0][6] = 2;
    strcpy(e::linktreestr[0][7], "Bearing 21");
    e::linktreelevel[0][7] = 3;
    e::linktreetype[0][7] = 5;
    strcpy(e::linktreestr[0][8], "Gear 2");
    e::linktreelevel[0][8] = 3;
    e::linktreetype[0][8] = 6;
    strcpy(e::linktreestr[0][9], "Bearing 22");
    e::linktreelevel[0][9] = 3;
    e::linktreetype[0][9] = 5;

Создание Treeview
    dwstytreeview = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;
    e::linkhwnd[1] = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL, dwstytreeview, 0, 0, 0, 0, hdlg, (HMENU) 1001, hinstance, NULL);

Заполнение Treeview по данным (максимум для 3 уровней вложенности, для моей задачи достаточно):
    void LinkTreeviewCreate(HWND hwndtreeview, int param)
    {
    int i, n;
    TVINSERTSTRUCT tvins;
    TVITEM tvi;
    HINSTANCE hdll;
    HIMAGELIST himl;
    HBITMAP hbmp;
    HTREEITEM hti[4];
    n = 25;
    himl = ImageList_Create(18, 18, FALSE, 0, 0);
    TreeView_SetImageList(hwndtreeview, himl, TVSIL_NORMAL);
    hdll = LoadLibrary("Stnpic.dll");
    memset(&tvins, 0, sizeof(tvins));
    tvins.hInsertAfter = TVI_LAST;
    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
    for (i=0; idiv>
    {
    tvi.pszText = e::linktreestr[param][i];
    if (hdll)
    {
    dll::linkdll2 DllLoadBitmap = (dll::linkdll2) GetProcAddress(hdll, "DllLoadBitmap");
    hbmp = DllLoadBitmap(hdll, e::linktreetype[param][i]);
    n = ImageList_Add(himl, hbmp, NULL);
    }
    tvi.iImage = n;
    tvi.iSelectedImage = n;
    tvins.item = tvi;
    tvins.hParent = TVI_ROOT;
    switch (e::linktreelevel[param][i])
    {
    case 0:
    tvins.hParent = TVI_ROOT;
    hti[0] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[0], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[0]);
    break;
    case 1:
    tvins.hParent = hti[0];
    hti[1] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[1], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[1]);
    break;
    case 2:
    tvins.hParent = hti[1];
    hti[2] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[2], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[2]);
    break;
    case 3:
    tvins.hParent = hti[2];
    hti[3] = TreeView_InsertItem(hwndtreeview, &tvins);
    TreeView_Expand(hwndtreeview, hti[3], TVE_EXPAND);
    TreeView_SelectItem(hwndtreeview, hti[3]);
    break;
    }
    }
    if (hdll)
    {
    FreeLibrary(hdll);
    }
    TreeView_SelectItem(hwndtreeview, hti[0]);
    }

Обработка сообщений
    //...
    case WM_NOTIFY:
    switch (LOWORD(wparam))
    {
    case 1001:
    if(((LPNMHDR)lparam)->code == NM_CLICK)
    {
    LinkTreeviewClick(GetParent(e::linkhwnd[1]));
    }
    break;
    }
    return 0;
    //...
    void LinkTreeviewClick(HWND hwnd)
    {
    char str[256];
    TVITEM tvi;
    HTREEITEM Selected;
    memset(&tvi, 0, sizeof(tvi));
    Selected = (HTREEITEM) SendDlgItemMessage(hwnd, 1001, TVM_GETNEXTITEM, TVGN_CARET, (LPARAM)Selected);
    TreeView_EnsureVisible(hwnd,Selected);
    SendDlgItemMessage(hwnd, 1001, TVM_SELECTITEM, TVGN_CARET, (LPARAM)Selected);
    tvi.mask = TVIF_TEXT;
    wsprintf(str, " LinkTreeviewClick = %d", Selected);
    SetWindowText(hwnd, str);
    }

pic_001.GIF (, : 9)
Вопрос как определить по какому конкретно узлу был произведен клик мыши ?

Хотелось бы получить номер по порядку узла по которому кликнули.

https://forum.sources.ru/index.php?showtopic=419174&view=findpost&p=3834551


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 17:51 + в цитатник
korvin:
Цитата applegame @
А при работе с GC ресурсы обычно освобождаются самим GC.

Обычно — нет. А финализаторы в Java давно признаны слишком проблемными. Поэтому ресурсы нужно использовать с try-with-resources.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834549


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 17:19 + в цитатник
Wound:
Цитата applegame @
Ты сам сказал, что если убрать совсем scope(exit), то программа станет корректной. А ведь в этом случае TTF_Quit не будт вызван вообще. Из твоих же слов следует, что вызов TTF_Quit лишний.

Я тебе это говорил в контексте правильности/неправильности такого подхода на плюсах, чтоб обратить твое внимание на GC.

Цитата applegame @
Чувак по незнанию неверно оценил ситуацию, он написал:
Цитата
AFTER the scope(exit) statements
А точнее было бы написать
Цитата
AFTER exit from the function scope
scope(exit) никак не влияет на порядок вызовов деструкторов объектов на куче.

Он как раз все верно оценил, если я правильно понял что там произошло. Ты же видишь в его примере просто надпись в консоль выводится? У него вывелось:
    scope exit
    De
    De

А произошло это из за того, что после выхода из функции - не отработал деструктор De, который написан перед scope(exit), этот деструктор отработал в тот момент, когда GC начал подчищать ресурсы, а ресурсы в его случае он начал подчищать, когда он нажал на кнопку Закрыть.

сам по себе scope(exit) - Не влияет на порядок вызовов деструкторов, я нигде не утверждал что он влияет. Но используя этот scope(exit) - можно нарваться вот на такие грабли, как у чувака, вот об этом я и написал.

Цитата applegame @
Напиши scope(exit) delete(ptr) и бага не будет. По-твоему написать целую обертку гораздо проще, чем написать вот эту одну строчку, с учетом того что эта обертка будет использована ровно ОДИН раз?

Ну да, нахер юзать все эти RAII в плюсах. Вот дебилы, правда? че сложно написать delete ptr - где это нужно.
По моему, обертку писать не нужно вообще. Это ты придумал. Я предлагал юзать unique_ptr, если тебе хочется сделать вот именно так, а никак иначе.

Цитата applegame @
Очередной ошибочный вывод. Нет не только в исключениях. Также разница в ранних return, в том что код освобождения ресурса пишется прямо рядом с его захватом (прямо как твой любимый unique_ptr с кастомным деструктром, только гораздо опрятнее), ну и если таких мест несколько, то освобождение ресурсов будет выполнено автоматически в порядке обратном захвату. В сяшке ничего этого нет.

В Сяшке ровно тот же механизм, только вид с боку. Когда ты юзаешь мой любимый unique_ptr, то это полноценная RAII обертка, и она лишена практически всех недостатков. Например что будет у тебя, если во время выделения ресурса произойдет исключение? Будет очищать ресурс, который не существует?

Цитата applegame @
Ну так и пример багнутый. В D так не пишут. Чувак один ресурс обернул в scope(exit) а воторой доверил GC. Здорово!

Ну как не пишут, если пишут? Я ж даже ссылку привел на того, кто написал :-?

Цитата applegame @
А ты примерно так и сделал. Притащил какую-то неработающую херню со scope(exit) и сказал - оцтой какойто.

Ага, с тебя взял пример. Ты же первый начал рассказывать как без него тяжко в плюсах жить :D

Цитата applegame @
Неверно, scope(...) введен в язык для автоматического вызова кода при выходе из скоупа. А при работе с GC ресурсы обычно освобождаются самим GC. Накой там scope(...)?

На той же на кой finally в языках с GC существует. Расскажи, как ты закроешь сетевое соединение например по выходу из функции, если объект создается на куче? Да ты же бля напишешь scope(exit), ты уже приводил даже этот пример с PQExec :D

Цитата applegame @
И где тут костыль, даже если это написано на плюсах?

Понятия не имею по этому коду ничего не очевидно.

Цитата applegame @
Тебя трудно понять, Киля. Ты применяешь какие-то определения, выдавая их за общепринятые и потом тебя не понимают. Видимо ты имеешь в виду конструкцию, которую в C# называют try-catch-finally. Ну так ты опять ошибся, так как finally вполне можно написать без try-catch, а именно try-finally без catch.

Ты как раз таки все понял, просто тебе видимо потроллить хочеца. Я слышал в Java его частенько называют именно так. И название идет от полной конструкции. Finally не фигурирует сам по себе. Так что ты тоже ошибся выходит, если цеплятся к словам, как ты любишь ;)

Цитата applegame @
Ты привел пример, в котором RAII вполне уместен. Но я таки напишу специально для тебя все это дело в функциональном стиле без всякого RAII, но со scope(exit), дабы, так сказать, расширить твой и не только твой кругозор

Угумс, я уже видел похожее на шарпах, когда двухсотстрочная портянка оформлена в подобном виде! Очень удобно
Там это к слову очень сильно распространено. Делегаты называется.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548


Метки:  

goto vs break & continue

Суббота, 18 Июля 2020 г. 16:35 + в цитатник
applegame:
Цитата Wound @
Он ожидает что у него отработает деструктор его класса De, в котором он вызывает TTF_CloseFont, а после него scope(exit) - который вызывает TTF_Quit. Но из за того что память под класс он выделил на хипе, у него вызывается сначало scope(exit) с TTF_Quit, а после отрабатывает деструктор класса De, в котором вызывается TTF_CloseFont. Где тут лишний вызов то?
Ты сам сказал, что если убрать совсем scope(exit), то программа станет корректной. А ведь в этом случае TTF_Quit не будт вызван вообще. Из твоих же слов следует, что вызов TTF_Quit лишний.
Чувак по незнанию неверно оценил ситуацию, он написал:
Цитата
AFTER the scope(exit) statements
А точнее было бы написать
Цитата
AFTER exit from the function scope
scope(exit) никак не влияет на порядок вызовов деструкторов объектов на куче.
Цитата Wound @
Вот именно. Поэтому ты без задней мысли будешь думать что ошибки у тебя нет. А в плюсах это баг априори. Соответственно ты ничего не будешь ждать, ты напишешь RAII обертку, и бага не будет.
Напиши scope(exit) delete(ptr) и бага не будет. По-твоему написать целую обертку гораздо проще, чем написать вот эту одну строчку, с учетом того что эта обертка будет использована ровно ОДИН раз?
Цитата Wound @
Это же Си, там нет исключений! Если разница только в исключениях, то твоей пример ничем не отличается от сишного кода. А объяснять что подход с RAII лучше, чем Сишный нужно? Или ты и так знаешь?
Очередной ошибочный вывод. Нет не только в исключениях. Также разница в ранних return, в том что код освобождения ресурса пишется прямо рядом с его захватом (прямо как твой любимый unique_ptr с кастомным деструктром, только гораздо опрятнее), ну и если таких мест несколько, то освобождение ресурсов будет выполнено автоматически в порядке обратном захвату. В сяшке ничего этого нет.
Цитата Wound @
Ага, багнутый аналог! В С++ там не пишут. Ты один ресурс в обертку обернул, а второй ресурс без обертки юзаешь. Здорово!
Ну так и пример багнутый. В D так не пишут. Чувак один ресурс обернул в scope(exit) а воторой доверил GC. Здорово!
Цитата Wound @
Ну хватит а? Хватит писать какую то муть. Ты если оборачиваешь в RAII - Оборачивай все. А то у тебя получается херня какая то.
Ну хватит а? Хватит писать какую то муть. Ты если оборачиваешь в scope(exit) - Оборачивай все. А то у тебя получается херня какая то.
Цитата Wound @
Я тоже могу написать какую нибудь неработающую херню на D и сказать - оцтой какойто, а не ЯП.
А ты примерно так и сделал. Притащил какую-то неработающую херню со scope(exit) и сказал - оцтой какойто.
Цитата Wound @
Ну а goto делает переход, например в конец функции. Ты представляешь этот scope(exit) - как какую то супер пупер фичу, на деле - это обычный костыль, судя по всему введен в язык исключительно с целью освобождения ресурсов при работе с GC. Это единственно верное его предназначение. Но ты выдаешь его зачем то за какую то конфетку
Неверно, scope(...) введен в язык для автоматического вызова кода при выходе из скоупа. А при работе с GC ресурсы обычно освобождаются самим GC. Накой там scope(...)?
Цитата Wound @
В описываемых тобой случаях - там где он был бы удобен, он был бы удобен исключительно в качестве костыля.
Вот годный пример использования scope(...). Нужно сделать подсчет текущих активных и успешных http-запросов в http-сервере:
    auto handleHTTPRequest(...) {
    activeRequests.atomicIncrement();
    scope(exit) activeRequests.atomicDecrement();
    scope(success) successRequests.atomicIncrement();
    ...
    if(...) return result1;
    ...
    if(...) throw Error1;
    ...
    if(...) return result2;
    ...
    if(...) throw Error2;
    ...
    }
И где тут костыль, даже если это написано на плюсах?
Цитата Wound @
Поясняю - я имел ввиду try/catch/finally, а не finally. На всякий случай посоветую тебе, ты прежде чем отвечать на это, загугли про это и почитай что такое finally и как оно используется в языках с GC JAVA/C#. Потом уже отвечай.
Я не знаю как там в вашем D, но вообще конструкция try/catch/finally судя по всему родилась где то в Java, И вот этот finally - является не отъемлемой частью try/catch/finally, нельзя его написать без try/catch.

Тебя трудно понять, Киля. Ты применяешь какие-то определения, выдавая их за общепринятые и потом тебя не понимают. Видимо ты имеешь в виду конструкцию, которую в C# называют try-catch-finally. Ну так ты опять ошибся, так как finally вполне можно написать без try-catch, а именно try-finally без catch.
Цитата Wound @
Ну посмотри на класс std::fstream - обычная RAII Обертка над FILE* дескриптором. В 10 разных местах я хочу юзать вот эти функции, ну например у меня есть 10 кнопок, и в каждом обработчике я хочу производить вот примерно такие действия, разные и в разной последовательности, допустим в обработчике одной кнопки только читаем, во второй читаем и пишем, в третьей читаем, создаем новый файл в него пишем и т.д.. Т.е. мне нужны какие то функции или что ты там сделаешь, за которыми мне потом не надо подчищать, они же сами все сделают.
В таком случае, да. RAII самое то.
Цитата Wound @
Вообще не парься, у тебя не получится это сделать со scope(exit), либо получится говно какое то, в итоге ты просто напишешь RAII обертку. Что собственно и требовалось доказать.
Ты привел пример, в котором RAII вполне уместен. Но я таки напишу специально для тебя все это дело в функциональном стиле без всякого RAII, но со scope(exit), дабы, так сказать, расширить твой и не только твой кругозор :)
    // Это функция обертка, вместо RAII-объекта
    void useFile(F fn)(string name, F fn) {
    auto file = open(name);
    scope(exit) close(file);
    fn(file);
    }
    void onClick(data) {
    // используем обертку
    useFile("hello.txt", (file) {
    ...
    write(file, data);
    ...
    data1 = read(file);
    ...
    });
    }

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834547


Метки:  

ЕГЭ по информатике 2020, часть 1, № 2

Суббота, 18 Июля 2020 г. 15:58 + в цитатник
swf: ЕГЭ по информатике 2020, вариант Москва
Булевы алгебры логики, логические функции
Часть 1, № 2
Задание взято с сайта
http://kotolis.ru/realegeinf_2020
user posted image

Решение. Из второй полностью заполненной строчки таблицы истинности определяем, что переменная 3 = y = 1.
(Как мы это узнали.
w не может иметь значение 1, потому что иначе not w = 0 и всё выражение обращается в ложь.
Если z = 1, то и x = 0, и y = 0, соответственно, (x или y) тоже 0, а должно быть 1.
Если x = 1, то и y = 0, и z = 0, соответственно, тождественность y и z даёт 1, отрицание тождественности - 0.
Поэтому остаётся ровно один вариант: y = 1.)

Из третьей строчки таблицы следует, что при y = 0 значение z должно быть равно 1 (y и z должны иметь противоположные значения).
Поэтому z либо переменная 1, либо переменная 2.
Поскольку строчки в таблице не должны совпадать, а в первой строчке переменная 1 = 1, то вначале предположим, что z = переменная 2 = 1.
Получили xzyw: ?100 -> 1 (со значением true.)
Определим значение x. Так как y = 0, то x = 1, чтобы выражение (x или y) обращалось в истину.
xzyw: 1100 -> 1.

Теперь проверим, можно ли для такой последовательности переменных получить неповторяющуюся первую строчку.
Если и x = 1, и y =1, то снова получим третью строчку.
Поэтому x = 1, y = 0. Тогда z = 1 и w = 0:
xzyw: 1010 -> 1.

Ответ: xzyw .

https://forum.sources.ru/index.php?showtopic=419173&view=findpost&p=3834544


Метки:  

Почему майнят именно на видеокартах?

Суббота, 18 Июля 2020 г. 15:18 + в цитатник
Gonarh: Майнят уже давно не на видюхах, это прошлый век.

https://forum.sources.ru/index.php?showtopic=419140&view=findpost&p=3834543


Метки:  

goto vs break & continue

Пятница, 17 Июля 2020 г. 11:48 + в цитатник
applegame: использовать scope(exit) в качестве иммитации RAII действительно глупо. Но бывают случаи где сия конструкция вполне уместна.
Например, я писал обертку для постгресовской родной либы libpq. Она написана на сяшке (как и весь постгрескуль). Там память захватывается самой либой, а освобождается уже клинтским кодом путем вызова соответствующей функции. Это освобождение в моей обертке фигурировало буквально внутри одной функции. Я использовал там scope(exit) так как посчитал абсолютно бесполезным городить отдельный класс вместо одной сраной строчки: scope(exit) PQfree(res).

Кроме того scope(exit) можно применять не только для освобождения ресурсов. Я пихал в него временный отладочный код вроде изменения счетчиков и всяких логов.

https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834361


Метки:  

Поиск сообщений в rss_forum_sources_ru
Страницы: 2628 ... 2378 2377 [2376] 2375 2374 ..
.. 1 Календарь