powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
236 сообщений из 236, показаны все 10 страниц
Очень интересны нюанс с оператором switch
    #39981555
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть возможность проверить себя и без отладчика сообразить, что делает этот код?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
bool testSwitch()
{
    char ch = 'c'; // Или 'a', например.
    char str[] = "bcd";
    char *ptr = nullptr;
    int count = 0;

    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }

    return true;
}


Это же за гранью добра и зла. Впервые сегодня увидел такое.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981556
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С много такой гадости, С изобретали не в угоду читабельности, все было направлено на производительность, тогда это было актуально.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981567
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Это же за гранью добра и зла. Впервые сегодня увидел такое.

Почему впервые? Duff's device много раз сюда постили. Это по сути оно же.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981577
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
Это же за гранью добра и зла. Впервые сегодня увидел такое.

Почему впервые? Duff's device много раз сюда постили. Это по сути оно же.

Я только что впервые узнал о таком устройстве.

Я вот тут думал, а как такую конструкцию вообще объяснить на словах? Она же абсурдна. И догадался. Я всегда воспринимал оператор switch как расширенный if / else с нюансом, что без break мы переходим в следующую ветку. А такое восприятие неверно.

Операторы case / default нужно воспринимать как метки для оператора goto. А оператор switch — это условный оператор goto. И всё встаёт на свои места. Конструкция становится логичной и простой.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981599
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981677
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, на спичках экономят!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do
  switch (ch)
  {
  case '\0':
  case 'e':
  case 'f':
  case 'g':
    break;
  default:
    if (nullptr != (ptr = str, ch))
    {
      count++;
      return true;
    }
  }
while (false);
return false;
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981687
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
do ... while (false) - лишний.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)

В некоторых командах есть соглашение о том что пустые секции default или объединённые case - маркируются
специальным поясняющим комментарием о том что дескыть так и надо и здесь нет ошибки разработчика.

Потому-то со стороны да. Выглядит как будто просто завтык.

А в данном исходнике я-бы просто отказался от switch в пользу if-else.

Switch - это оператор варианта. А зачем нужен вариант без вариантов. Просто выглядит как воцафак и просто неряшливость.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981775
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ некоторых командах есть соглашение о том что пустые секции default или объединённые case
- маркируются специальным поясняющим комментарием о том что дескыть так и надо и здесь нет
ошибки разработчика.

Более того, современные версии GCC выдают предупреждение, если такового комментария или
соотвествующего C++17 атрибута нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981798
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я думаю что утилиты статического анализа такие как Sonar/PVS здесь просто должны выбросить алерт.

Может не critical, но тем не меннее какой-то важности чтоб обратить внимание.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981876
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Switch - это оператор варианта...


Нет конечно , не совсем так.
В том смысле, в каком под оператором варианта подразумевается структурированный оператор с единственной веткой выбора.
if elsif else - можно было бы поназывать вариантом "оператора варианта"
(если не использовать возможности "побочных действий", таких как в
стартовом примере, ломающих его до неструктурированного), а switch - нет , без специальных услилий программиста,
специально выписывающего switch в сограсованном со структурным программированием стиле .
Если, например, цикл целиком состоит из единственного структурированного if elsif else, то он и глазами и компилятором,
потенциально, может анализироваться на тему своей завершаемости, или иных соображений, обеспечивающих
формальное доказательство правильности цикла.

То есть, если в цикле есть набор охран, за каждой из которых своя команда выполнения,
то "традиционный анализ" требует единственного срабатывания только одной из охран, даже если по состоянию цикла
могло бы сработать несколько. Это существенно используется в формальных доказательствах правильности построения цикла.
На цикле, внутри которого сишный switch, такой анализ в своей первоначальной постановке просто не работает,
если существуют неразделенные break-ом охраняемые команды.
(Правда, на if с побочным действием тоже далеко не разбежишься)

В Си switch аналог неструктурированных фортрановых вычислимых или присвоенных goto
и/или vba-шного On expression GOTO line, но со своим блекджеком в виде произвольного местоположения default.

mayton

А зачем нужен вариант без вариантов.

В VBA можно сказать, что нигде не нужен, потому что, кроме неструктурированного On expression GOTO line,
там есть структурированный Select case, которому прямо в ветке можно указать список значений или диапазон
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim Number 
Number = 8  

Select Case Number  
Case 1 To 5    
    Debug.Print "Between 1 and 5" 
Case 6, 7, 8   
    Debug.Print "Between 6 and 8" 
Case Else    
    Debug.Print "Not between 1 and 8" 
End Select


В Си ты должен выписать столько "пустых" case, сколько элементов в "списке выбора", приводящему к единственному действию.
---
В стартовом примере заявленные случаи должны попасть внутрь ветки if с побочным действием, который находится внутри default секции.
Это не сложно, потому что if целиком положен внутрь switch, но заштукатуренному структурным программированием мозгу надо приглядеться.

А "устройство Даффа" выносит мозг наверно каждому, кто видит его первый раз, именно пересечением - там switch начат до начала
цикла, а цикл закончен после завершения switch.
Ну, это особенность синтаксиса. Ни на фортране, ни на бейсике такое устройство мозг не взорвет с их неструктурированными goto.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравился-бы вариант в котором в case-секциях стоит функция или предикат.
И при этом работает охранная логика исполнения первого условия которое вышло в true.
А не константа как в большинстве use-cases.

Пример:

Код: plaintext
1.
2.
3.
4.
letterClass c
   | c >= '0' && c <= '9' = "Digits or hex digits"
   | c >= 'A' && c <= 'H' = "Hex digits"
   | otherwise      = "I do not know what is it!"
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981948
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

чего-то похожего для expression можно добиваться вложениями условного оператора ?
И выглядеть будет похоже:
Код: plaintext
1.
2.
3.
           v =  (c >= '0' && c <= '9') ? "Digits or hex digits":
                (c >= 'A' && c <= 'H') ? "Hex digits":
                 "I do not know what is it!";



для statement, вероятно считается - зачем заменять if, если и так работает...

Хотя, есть для statement в "некоторых языках" соглашение о полноте вариантов выбора,
то есть, либо должен быть выписан явный else, либо, когда его нет,
и по текущему состоянию вычисления нет явной ветки для выбора,
то система должна генерировать ошибку времени выполнения.

Это, бывает, явно эксплуатируют...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982073
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.


Похоже, что в такой формулировке я не понимаю, с чем соглашаться, а с чем нет.

"изменяемость" или "не изменяемость" "условий" не имеет самостоятельного значимого для switch контекста,
после того как решение о переходе на конкретную метку уже принято.

До морковкиного заговения можно обсуждать - важно или нет - изменилось ли состояние переменной,
по значению которой мы оказались "здесь" , если мы уже здесь .
И должно ли после принятия решения оно оказываться "здесь" проверяемо "тем же", что и "до принятия решения".

Насчет "много ограничений" - не вижу этого - требуется значение, приводимое к целочисленному виду.
Скажем так, как на самый первый взгляд, это даже свободнее вариантов, настаивающих на логическом значении в каждой ветке.

Более того, я даже не знаю, ставится ли, и какое, формальное ограничение на число веток.
Basic, как счастливо взял от фортрана 255 как максимум, так и живет с этим.
Подозреваю, что для Си этот вопрос, почти традиционно, отдаётся на усмотрение реализации.

Короче, для своего времени - зашибись конструкция.
Но следования "канонам" структурного программирования никто не обещал.
Пропессорские выдумки о том, как студенты должны писать программы, пожалуйста, в одну корзину,
а мучения взрослых инженеров со положенными на них (или взятыми добровольно на себя) обязательствами о том,
как и на чем им прямо сейчас на самом деле писать - придется складывать в другую.

Прямо-таки почти навязывается встречный вопрос - должны ли мы немедленно вспомнить о господине Гослинге, например,
озаботившемуся вопросом реорганизации рабкрина неправильного языка в правильный для каждого браузера,
да более того - вообще для всего интернета.
Или пришло-таки время вспомнить о ржвачине...


Если серьёзно - не трожьте (в смысле не судите) Си лапками, замаранными структурным программированием.
А вот как именно и почему точно о вопросе структурированного оператора выбора не заботится C++ - это малёк за рамками моей компетенции.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982149
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На языке условного ассемблера алгоритм выглядит примерно так:
Код: asm
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
cmp al, '\0';
je label_1;
cmp al, 'e';
je label_1;
cmp al, 'f';
je label_1;
cmp al, 'g';
je label_1;
and rax, 0x0f;
lea rbx, str;
push rbx;
push rax;
call strchr;
cmp rax, 0x0;
jne label_2;

label_1:
  xor rax, rax;   // return false
  ret;

label_2:
  add count, 1;
  mov rax, 1;     // return true
  ret;
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982177
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпримерно так

Авотхрен. Если список вариантов плотный, то он выглядит как одна команда "jmp table[al]".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982198
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, финты ушами оптимизации не принципиальны.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу инженеришки Гослинга и его JVM байткодов (опкодов).

Есть отдельная инструкция tableswitch (0xAA) . По сути представляет аргументами case-константы и jump-offsets
куда надо прыгнуть. Вобщем-то и всё.

Современные сборочные конструкции со строками в switch возможно уже собираются как-то по другому.
На условных переходах.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кей Хорстман на Joker сетует об отсутствии expression для multi-way branch.
Якобы для if-else есть а для switch нету.

Упоминает о дихотомическом поиске для switch jump table.
И о sequental для patterns.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982908
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }


Хрень какая-то!
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982962
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008, где хрень?! Там всё отлично!
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982983
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если принять во внимание пост Буби и также тот факт что Си считается портабельным ассемблером,
то в нем (ассемблере) можно сделать ВСЁ! Тоесть располагать ключевые слова языка в любом порядке для достижения
цели. Также как и __asm мнемоники вы можете располагать как угодно лишь-бы работало. И никто вас не покритикует.
И мы имеем дело с архаизмом.

И хотя мой консервативный мозг смотрит в сторону большей строгости и чеков в фазе компилляции
я готов махнуть рукой на этот стиль и просто согласиться с тем что разработчики Bell Labs были
первопроходцами и решали насущные проблемы разработки операционок и телефонного софта.

Для них стиль стоял не на первом месте, хотя для нас сегодня, измученных нарзаном PSV-Studio
и Сонаром такой подход кажется немыслимым кощунством.

По сути смысл обсуждения должен быть таков.

>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983021
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
Оправдывает, если полезные эффекты необходимы для того, чтобы "вписать" машинный код в ограниченный объем памяти, например в Master Boot Record - 446 байт.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983044
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton
>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
Оправдывает, если полезные эффекты необходимы для того, чтобы "вписать" машинный код в ограниченный объем памяти, например в Master Boot Record - 446 байт.

Как часто такое бывает в практике современного С/C++ разработчика?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983051
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, в практике прикладника, возможно, никогда.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983245
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
SQL2008, где хрень?! Там всё отлично!

Хрень в том, что после обработки default идут обработчики case!
И после default должен быть break. Хотя если он стоит последним, как принято, то может break и не нужен.
Хотя я всегда пишу.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983267
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008, кто тебе сказал такую глупость? :)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983270
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот блин. Я же простой вопрос спросил. Как часто. А мне ответили - как Одессе.
Давайте оценим % соотношений прикладников и НЕ-прикладников. Заметьте... я следую
парадоксу ложной дихтомии и употребляю тактичный термин НЕ-прикладник имея в виду
всех оставшихся.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983281
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Как часто - не знаю, но одно с уверенностью могу сказать - такая фича понадобиться с вероятностью 100%!
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton,
Как часто - не знаю, но одно с уверенностью могу сказать - такая фича понадобиться с вероятностью 100%!

Ну... хорошо. Я готов согласиться что когда-то кому-то она вдруг понадобиться.
А не достаточно ли нам будет __asm секции для решения этой проблемы?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983291
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, малопортабельно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983292
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А закладываться на то, что у всех процессоров одинаковый конвейер - портабельно, значит???
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983301
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
///
Для них стиль стоял не на первом месте, хотя для нас сегодня, измученных нарзаном PSV-Studio
и Сонаром такой подход кажется немыслимым кощунством.

думать им приходилось обо всем разом .
И о портабельности, и о компактности получаемого кода, и об эффективности как результата компиляции, так и работы программиста.

Может быть ты не поверишь, но и о культуре сопровождения кода в большой корпорации тоже.
У Кернигана можно найти упоминание о том, произвольность местоположения default была выбрана сознательно ,
в расчете на то, что при возникновении необходимости дописывать что-то в существующий switch,
корпоративные программисты хотели бы и будут размещать новые ветки ниже уже существующих,
а не произвольным образом втыкивать их между старыми, превращая старый код в неузнаваемый.


mayton

>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации

А в чем резкость?
Если не является резкостью отсутствие break после каждой ветки, почему его отсутствие после default -
обычной, по сути метки, за малой оговоркой, среди прочих - смущает?
Все как для прочих меток - может быть break, а может и нет.

Стартовый код прост как палка: для набора значений, известных как "хорошие случаи" просто goto на метку return True.
Иначе провести доп проверку (с побочным действием) и решить - true оно return или нет.

При этом нет сомнения, что студент за такой код должен быть немедленно отчислен.
:))
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983304
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyУ Кернигана можно найти упоминание о том, произвольность местоположения default была
выбрана /сознательно/, в расчете на то, что при возникновении необходимости дописывать
что-то в существующий switch, корпоративные программисты хотели бы и будут размещать новые
ветки ниже уже существующих, а не произвольным образом втыкивать их между старыми,
превращая старый код в неузнаваемый.
А некоторые советуют размещать ветки в порядке возрастания значений. Это, якобы, позволяет
компилятору генерировать более оптимизированный код...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983317
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Стартовый код прост как палка: для набора значений, известных как "хорошие случаи" просто goto на метку return True.
Иначе провести доп проверку (с побочным действием) и решить - true оно return или нет.

Если говорить о switch, то там набор запрещённых значений.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983320
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Может быть ты не поверишь, но и о культуре сопровождения кода в большой корпорации тоже.
У Кернигана можно найти упоминание о том, произвольность местоположения default была выбрана сознательно ,
в расчете на то, что при возникновении необходимости дописывать что-то в существующий switch,
корпоративные программисты хотели бы и будут размещать новые ветки ниже уже существующих,
а не произвольным образом втыкивать их между старыми, превращая старый код в неузнаваемый.

Да уж, специфические были у Кернигана представления о корпоративных программистах. Типа о читабельности кода вообще не заботятся, а просто будут вкорячивать новые case в конец списка. Хули там думать, код писать нужно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983355
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

boobyУ Кернигана можно найти упоминание о том, произвольность местоположения default была
выбрана /сознательно/, в расчете на то, что при возникновении необходимости дописывать
что-то в существующий switch, корпоративные программисты хотели бы и будут размещать новые
ветки ниже уже существующих, а не произвольным образом втыкивать их между старыми,
превращая старый код в неузнаваемый.

А некоторые советуют размещать ветки в порядке возрастания значений. Это, якобы, позволяет
компилятору генерировать более оптимизированный код...

А как это переводится на человечий язык?
неужто кто-то из компиляторов двоичный поиск по таблице значений реализует?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983357
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
А закладываться на то, что у всех процессоров одинаковый конвейер - портабельно, значит???
Не понимаю о чём ты...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983360
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
А как это переводится на человечий язык?
Как прыжок по адресу, хранящемуся в элементе таблицы, доступ к которому осуществляется по базе + индекс из (входное значения минус начальное значение).
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983362
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
сдаётся, у вас теоретические представления о читабельности реального "промышленного" прикладного кода,
сроком жизни хотя бы лет в 15-20 и непрерывно изменяемого при этом...

Не трожь писанное не тобой, дописывай в конец - замечательной осторожности принцип для применения в жизненном цикле
эпических прикладных непрерывно развиваемых промышленных поэм...

Это сейчас в моде "рефакторинг" до степени не узнавания родной мамой со свистелками и перделками.
А в традиционной промышленности, после того, как изначальный код написан и программист уволился -
никто не знает , что там делается.

Тронешь - убьёт, без резиновых сапог - не входи.
Допиши и подпишись, чтобы у табе потом интересовались, пока ты жив, что на твоём участке делается.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983363
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
booby
А как это переводится на человечий язык?
Как прыжок по адресу, хранящемуся в элементе таблицы, доступ к которому осуществляется по базе + индекс из (входное значения минус начальное значение).

Нет.
Порядок следования вариантов никак не может изменить эффективность индексированного доступа к элементам таблицы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983364
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
petrav,
сдаётся, у вас теоретические представления о читабельности реального "промышленного" прикладного кода,
сроком жизни хотя бы лет в 15-20 и непрерывно изменяемого при этом...

Не трожь писанное не тобой, дописывай в конец - замечательной осторожности принцип для применения в жизненном цикле
эпических прикладных непрерывно развиваемых промышленных поэм...

Это сейчас в моде "рефакторинг" до степени не узнавания родной мамой со свистелками и перделками.
А в традиционной промышленности, после того, как изначальный код написан и программист уволился -
никто не знает , что там делается.

Вы только что описали крайне низкоквалифицированную команду. Без вариантов.

Я сам работаю в промышленности и наблюдаю системы, которые и по 30-ть лет развиваются. И да, гавнокода там много, всё как в команде вами описанной.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983368
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

"промышленная система" и "команда" - это антонимичные понятия, по Гамбурскому счёту.

для работы с "промышленной системой" по определению годится произвольный выловленный из уличной толпы человек.
Промышленный прикладной программист не должен быть образован, иначе он работать не сможет .
Сразу, вместо работы, начнёт switch-и рефакторить.

Когда по любой причине произвольно схваченный за рукав не годится - объявляется, что существует "команда",
которой нужны "штыки" (в смысле обученные солдаты, если и не умеющие пользоваться, то хотя бы представляющие
правдоподобно, что значит слово "штык").
Бывает, когда "команда" уходит, то, что после неё остаётся, автоматически превращается в обыкновенный "промышленный код".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983369
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
petrav,

"промышленная система" и "команда" - это антонимичные понятия, по Гамбурскому счёту.

для работы с "промышленной системой" по определению годится произвольный выловленный из уличной толпы человек.
Промышленный прикладной программист не должен быть образован, иначе он работать не сможет .
Сразу, вместо работы, начнёт switch-и рефакторить.

Когда по любой причине произвольно схваченный за рукав не годится - объявляется, что существует "команда",
которой нужны "штыки" (в смысле обученные солдаты, если и не умеющие пользоваться, то хотя бы представляющие
правдоподобно, что значит слово "штык").
Бывает, когда "команда" уходит, то, что после неё остаётся, автоматически превращается в обыкновенный "промышленный код".

Это вы нейронную сеть запрограммировали, что она на форуме такие перлы от вашего имени выдаёт? Мне кажется архитектура НС неудачно выбрана.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983385
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Промышленный прикладной программист не должен быть образован, иначе он работать не сможет .

Но всё же вы меня заинтересовали. Давайте начнём с одной мысли.

Что означает ваша процитированная мной фраза?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983410
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
booby

Промышленный прикладной программист не должен быть образован, иначе он работать не сможет .

...
Что означает ваша процитированная мной фраза?

Буквально то, что написано.

У образованного человека невыносимый для массового производства недостаток - он имеет не просто тенденцию думать,
но и принимает сам этот процесс за самостоятельную ценность.

Обоснование уменьшения количества ошибок от увеличения количества дум вызывает большой скепсис,
а количество строк кода от увеличения дум уменьшается несомненно.
Когда человек думает, он код не пишет, по крайней мере рабочий код.
В "промышленности" нет задачи иметь в штате "умного человека", но есть задача выпустить "много кода".
Как это обеспечить, в условиях, когда роботы еще не заменили человека-программиста?

Конечно, строители обеспечили механизацию и непрерывность каменного строительства еще в древнем мире:
- рабочий на каменоломне не занимается транспортировкой, перевозчик не занимается обработкой,
каменотес не кладет из камня стены. И каждому из них полезно не знать, чего ради все их труды.
Просто для того, чтобы глубокая задумчивость не останавливала производственный процесс.

Кое-какими из этих идей программирование, как промышленная отрасль, уже вооружилась, но в целом
все еще пока сохраняет признаки средневекового ремесленничества или крестьянского быта, когда каждый "субъект"
не просто выполняет всю работу целиком, а чистосердечно считает себя архитектором результата,
извлекая из этого ценностные смыслы.

Это по сути несовместимо с массовым или вообще любым крупным производством,
которое подразумевает, что малое количество инженеров, используя труд большого количества рабочих,
может быть использующих механизмы, способны обеспечить управление большими объёмами производства или сооружением
крупных конструкций за разумное время. В задачу каких-то других инженеров входит создание самих механизмов.

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

Вот и всё, приблизительно, если не сильно растекаться по древу.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983504
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Пожалуйста, в какой стране вы лично наблюдали работу промышленных прикладных программистов?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать в разных компилляторах создать декодер кодовой страницы (например win1251-UTF-16)
на case-switch и посмотреть как разные компилляторы соберут это. В линейный. Бинарный поиск. Или хеш-поиск.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983573
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Можно попробовать в разных компилляторах создать декодер кодовой страницы (например win1251-UTF-16)
на case-switch и посмотреть как разные компилляторы соберут это. В линейный. Бинарный поиск. Или хеш-поиск.

Такой декодер он может и в обычный массив перевести где индексом будет 1251.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
Можно попробовать в разных компилляторах создать декодер кодовой страницы (например win1251-UTF-16)
на case-switch и посмотреть как разные компилляторы соберут это. В линейный. Бинарный поиск. Или хеш-поиск.

Такой декодер он может и в обычный массив перевести где индексом будет 1251.

Может или переведет?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983595
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav
пропущено...

Такой декодер он может и в обычный массив перевести где индексом будет 1251.

Может или переведет?

Можно проверить.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983619
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне щас некогда. Но я вечером сделаю тестовые сорцы. Сгенерить надо.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983659
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://www.sql.ru/forum/1134172/tyapnichnyy-koi-8r
тут уже делали перевод кодировок

оттуда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
// Example program
#include <iostream>
#include <string>

const static int koi8r2unicode[] = {
  0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524,
  0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590,
  0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248,
  0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7,
  0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556,
  0x2557,0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E,
  0x255F,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565,
  0x2566,0x2567,0x2568,0x2569,0x256A,0x256B,0x256C,0x00A9,
  0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,
  0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,
  0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,
  0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A,
  0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,
  0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
  0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,
  0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A
};

int getUnicodeCanonical(int koi8r){
  if (koi8r<128) return koi8r;
  return koi8r2unicode[koi8r-128];
}

int getUnicodeSwitch(int koi8r)
{
    if (koi8r<128) return koi8r;
    switch(koi8r)
    {
    case 128:
        return 9472;
        break;
    case 129:
        return 9474;
        break;
    case 130:
        return 9484;
        break;
    case 131:
        return 9488;
        break;
    case 132:
        return 9492;
        break;
    case 133:
        return 9496;
        break;
    case 134:
        return 9500;
        break;
    case 135:
        return 9508;
        break;
    case 136:
        return 9516;
        break;
    case 137:
        return 9524;
        break;
    case 138:
        return 9532;
        break;
    case 139:
        return 9600;
        break;
    case 140:
        return 9604;
        break;
    case 141:
        return 9608;
        break;
    case 142:
        return 9612;
        break;
    case 143:
        return 9616;
        break;
    case 144:
        return 9617;
        break;
    case 145:
        return 9618;
        break;
    case 146:
        return 9619;
        break;
    case 147:
        return 8992;
        break;
    case 148:
        return 9632;
        break;
    case 149:
        return 8729;
        break;
    case 150:
        return 8730;
        break;
    case 151:
        return 8776;
        break;
    case 152:
        return 8804;
        break;
    case 153:
        return 8805;
        break;
    case 154:
        return 160;
        break;
    case 155:
        return 8993;
        break;
    case 156:
        return 176;
        break;
    case 157:
        return 178;
        break;
    case 158:
        return 183;
        break;
    case 159:
        return 247;
        break;
    case 160:
        return 9552;
        break;
    case 161:
        return 9553;
        break;
    case 162:
        return 9554;
        break;
    case 163:
        return 1105;
        break;
    case 164:
        return 9555;
        break;
    case 165:
        return 9556;
        break;
    case 166:
        return 9557;
        break;
    case 167:
        return 9558;
        break;
    case 168:
        return 9559;
        break;
    case 169:
        return 9560;
        break;
    case 170:
        return 9561;
        break;
    case 171:
        return 9562;
        break;
    case 172:
        return 9563;
        break;
    case 173:
        return 9564;
        break;
    case 174:
        return 9565;
        break;
    case 175:
        return 9566;
        break;
    case 176:
        return 9567;
        break;
    case 177:
        return 9568;
        break;
    case 178:
        return 9569;
        break;
    case 179:
        return 1025;
        break;
    case 180:
        return 9570;
        break;
    case 181:
        return 9571;
        break;
    case 182:
        return 9572;
        break;
    case 183:
        return 9573;
        break;
    case 184:
        return 9574;
        break;
    case 185:
        return 9575;
        break;
    case 186:
        return 9576;
        break;
    case 187:
        return 9577;
        break;
    case 188:
        return 9578;
        break;
    case 189:
        return 9579;
        break;
    case 190:
        return 9580;
        break;
    case 191:
        return 169;
        break;
    case 192:
        return 1102;
        break;
    case 193:
        return 1072;
        break;
    case 194:
        return 1073;
        break;
    case 195:
        return 1094;
        break;
    case 196:
        return 1076;
        break;
    case 197:
        return 1077;
        break;
    case 198:
        return 1092;
        break;
    case 199:
        return 1075;
        break;
    case 200:
        return 1093;
        break;
    case 201:
        return 1080;
        break;
    case 202:
        return 1081;
        break;
    case 203:
        return 1082;
        break;
    case 204:
        return 1083;
        break;
    case 205:
        return 1084;
        break;
    case 206:
        return 1085;
        break;
    case 207:
        return 1086;
        break;
    case 208:
        return 1087;
        break;
    case 209:
        return 1103;
        break;
    case 210:
        return 1088;
        break;
    case 211:
        return 1089;
        break;
    case 212:
        return 1090;
        break;
    case 213:
        return 1091;
        break;
    case 214:
        return 1078;
        break;
    case 215:
        return 1074;
        break;
    case 216:
        return 1100;
        break;
    case 217:
        return 1099;
        break;
    case 218:
        return 1079;
        break;
    case 219:
        return 1096;
        break;
    case 220:
        return 1101;
        break;
    case 221:
        return 1097;
        break;
    case 222:
        return 1095;
        break;
    case 223:
        return 1098;
        break;
    case 224:
        return 1070;
        break;
    case 225:
        return 1040;
        break;
    case 226:
        return 1041;
        break;
    case 227:
        return 1062;
        break;
    case 228:
        return 1044;
        break;
    case 229:
        return 1045;
        break;
    case 230:
        return 1060;
        break;
    case 231:
        return 1043;
        break;
    case 232:
        return 1061;
        break;
    case 233:
        return 1048;
        break;
    case 234:
        return 1049;
        break;
    case 235:
        return 1050;
        break;
    case 236:
        return 1051;
        break;
    case 237:
        return 1052;
        break;
    case 238:
        return 1053;
        break;
    case 239:
        return 1054;
        break;
    case 240:
        return 1055;
        break;
    case 241:
        return 1071;
        break;
    case 242:
        return 1056;
        break;
    case 243:
        return 1057;
        break;
    case 244:
        return 1058;
        break;
    case 245:
        return 1059;
        break;
    case 246:
        return 1046;
        break;
    case 247:
        return 1042;
        break;
    case 248:
        return 1068;
        break;
    case 249:
        return 1067;
        break;
    case 250:
        return 1047;
        break;
    case 251:
        return 1064;
        break;
    case 252:
        return 1069;
        break;
    case 253:
        return 1065;
        break;
    case 254:
        return 1063;
        break;
    case 255:
        return 1066;
        break;
    }
}


int main()
{
    getUnicodeCanonical( 150 );
    getUnicodeSwitch( 150 );

    return 0;
}


https://godbolt.org/z/h5aKza
gcc 10 switch заменил на таблицу
Код: plaintext
1.
movswl 0x8049f20(%eax,%eax,1),%eax
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983663
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. Как-то раз я гуглил в интернетах что-то по Oracle. И нашёл.... свой собственный блджад вопрос 10 летней давности
здесь в скруле и ответ к нему. Вот это был сюрприз мать ево.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983986
m_Sla,

Какой страшный switch. Вот красивый, но работает идентично.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
int CompactSwitch(int koi8r) {
    switch(koi8r) {
    case 128: return 9472;
    case 129: return 9474;
    case 130: return 9484;
    case 131: return 9488;
    case 132: return 9492;
    case 133: return 9496;
    case 134: return 9500;
    case 135: return 9508;
    case 136: return 9516;
    case 137: return 9524;
    case 138: return 9532;
    case 139: return 9600;
    case 140: return 9604;
    case 141: return 9608;
    case 142: return 9612;
    case 143: return 9616;
    case 144: return 9617;
    case 145: return 9618;
    case 146: return 9619;
    case 147: return 8992;
    case 148: return 9632;
    case 149: return 8729;
    case 150: return 8730;
    case 151: return 8776;
    case 152: return 8804;
    case 153: return 8805;
    case 154: return 160;
    case 155: return 8993;
    case 156: return 176;
    case 157: return 178;
    case 158: return 183;
    case 159: return 247;
    case 160: return 9552;
    case 161: return 9553;
    case 162: return 9554;
    case 163: return 1105;
    case 164: return 9555;
    case 165: return 9556;
    case 166: return 9557;
    case 167: return 9558;
    case 168: return 9559;
    case 169: return 9560;
    case 170: return 9561;
    case 171: return 9562;
    case 172: return 9563;
    case 173: return 9564;
    case 174: return 9565;
    case 175: return 9566;
    case 176: return 9567;
    case 177: return 9568;
    case 178: return 9569;
    case 179: return 1025;
    case 180: return 9570;
    case 181: return 9571;
    case 182: return 9572;
    case 183: return 9573;
    case 184: return 9574;
    case 185: return 9575;
    case 186: return 9576;
    case 187: return 9577;
    case 188: return 9578;
    case 189: return 9579;
    case 190: return 9580;
    case 191: return 169;
    case 192: return 1102;
    case 193: return 1072;
    case 194: return 1073;
    case 195: return 1094;
    case 196: return 1076;
    case 197: return 1077;
    case 198: return 1092;
    case 199: return 1075;
    case 200: return 1093;
    case 201: return 1080;
    case 202: return 1081;
    case 203: return 1082;
    case 204: return 1083;
    case 205: return 1084;
    case 206: return 1085;
    case 207: return 1086;
    case 208: return 1087;
    case 209: return 1103;
    case 210: return 1088;
    case 211: return 1089;
    case 212: return 1090;
    case 213: return 1091;
    case 214: return 1078;
    case 215: return 1074;
    case 216: return 1100;
    case 217: return 1099;
    case 218: return 1079;
    case 219: return 1096;
    case 220: return 1101;
    case 221: return 1097;
    case 222: return 1095;
    case 223: return 1098;
    case 224: return 1070;
    case 225: return 1040;
    case 226: return 1041;
    case 227: return 1062;
    case 228: return 1044;
    case 229: return 1045;
    case 230: return 1060;
    case 231: return 1043;
    case 232: return 1061;
    case 233: return 1048;
    case 234: return 1049;
    case 235: return 1050;
    case 236: return 1051;
    case 237: return 1052;
    case 238: return 1053;
    case 239: return 1054;
    case 240: return 1055;
    case 241: return 1071;
    case 242: return 1056;
    case 243: return 1057;
    case 244: return 1058;
    case 245: return 1059;
    case 246: return 1046;
    case 247: return 1042;
    case 248: return 1068;
    case 249: return 1067;
    case 250: return 1047;
    case 251: return 1064;
    case 252: return 1069;
    case 253: return 1065;
    case 254: return 1063;
    case 255: return 1066;
    default: return koi8r;
    }
}

...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983990
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная история. Почему ASCII <= 127 ? Почему не <= 255 ? Почему char == signed char ?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983992
petrav
Интересная история. Почему ASCII <= 127 ?


https://tools.ietf.org/html/rfc1489

petrav
Почему не <= 255 ?


Значит мой switch компактный не содержит ошибок.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983993
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный

Значит мой switch компактный не содержит ошибок.

Да вы тут ни причём. Возможно пространство >127 было выделено под локальные кодировки. Но, во-первых, меня смущает такая прозорливость. Во-вторых почему char знаковый тип? Это противоречит предполагаемой прозорливости.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984009
vAH_O6Vg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Да вы тут ни причём. Возможно пространство >127 было выделено под локальные кодировки. Но, во-первых, меня смущает такая прозорливость. Во-вторых почему char знаковый тип? Это противоречит предполагаемой прозорливости.

char такой, какой требуется по стандарту.
An object declared as type char is large enough to store any member of the basic execution character
set. If a member of the basic execution character set is stored in a char object, its value is guaranteed
to be nonnegative. If any other character is stored in a char object, the resulting value is implemen-
tation-defined but shall be within the range of values that can be represented in that type.
The three types char, signed char, and unsigned char are collectively called the character types.
The implementation shall define char to have the same range, representation, and behavior as either
signed char or unsigned char.
Знаковость у него определяется производителем компилятора.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984029
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Да. Согласен. Break там был лишний.
Но тема референсного топика была не о switch,
А о минимизации булевых функций. Поэтому мы не акцентировали на этом сильно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984072
ВсеРазумный
m_Sla,

Какой страшный switch. Вот красивый, но работает идентично.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
int CompactSwitch(int koi8r) {
    switch(koi8r) {
    case 128: return 9472;
    case 129: return 9474;
    case 130: return 9484;
    case 131: return 9488;
    case 132: return 9492;
    case 133: return 9496;
    case 134: return 9500;
    case 135: return 9508;
    case 136: return 9516;
    case 137: return 9524;
    case 138: return 9532;
    case 139: return 9600;
    case 140: return 9604;
    case 141: return 9608;
    case 142: return 9612;
    case 143: return 9616;
    case 144: return 9617;
    case 145: return 9618;
    case 146: return 9619;
    case 147: return 8992;
    case 148: return 9632;
    case 149: return 8729;
    case 150: return 8730;
    case 151: return 8776;
    case 152: return 8804;
    case 153: return 8805;
    case 154: return 160;
    case 155: return 8993;
    case 156: return 176;
    case 157: return 178;
    case 158: return 183;
    case 159: return 247;
    case 160: return 9552;
    case 161: return 9553;
    case 162: return 9554;
    case 163: return 1105;
    case 164: return 9555;
    case 165: return 9556;
    case 166: return 9557;
    case 167: return 9558;
    case 168: return 9559;
    case 169: return 9560;
    case 170: return 9561;
    case 171: return 9562;
    case 172: return 9563;
    case 173: return 9564;
    case 174: return 9565;
    case 175: return 9566;
    case 176: return 9567;
    case 177: return 9568;
    case 178: return 9569;
    case 179: return 1025;
    case 180: return 9570;
    case 181: return 9571;
    case 182: return 9572;
    case 183: return 9573;
    case 184: return 9574;
    case 185: return 9575;
    case 186: return 9576;
    case 187: return 9577;
    case 188: return 9578;
    case 189: return 9579;
    case 190: return 9580;
    case 191: return 169;
    case 192: return 1102;
    case 193: return 1072;
    case 194: return 1073;
    case 195: return 1094;
    case 196: return 1076;
    case 197: return 1077;
    case 198: return 1092;
    case 199: return 1075;
    case 200: return 1093;
    case 201: return 1080;
    case 202: return 1081;
    case 203: return 1082;
    case 204: return 1083;
    case 205: return 1084;
    case 206: return 1085;
    case 207: return 1086;
    case 208: return 1087;
    case 209: return 1103;
    case 210: return 1088;
    case 211: return 1089;
    case 212: return 1090;
    case 213: return 1091;
    case 214: return 1078;
    case 215: return 1074;
    case 216: return 1100;
    case 217: return 1099;
    case 218: return 1079;
    case 219: return 1096;
    case 220: return 1101;
    case 221: return 1097;
    case 222: return 1095;
    case 223: return 1098;
    case 224: return 1070;
    case 225: return 1040;
    case 226: return 1041;
    case 227: return 1062;
    case 228: return 1044;
    case 229: return 1045;
    case 230: return 1060;
    case 231: return 1043;
    case 232: return 1061;
    case 233: return 1048;
    case 234: return 1049;
    case 235: return 1050;
    case 236: return 1051;
    case 237: return 1052;
    case 238: return 1053;
    case 239: return 1054;
    case 240: return 1055;
    case 241: return 1071;
    case 242: return 1056;
    case 243: return 1057;
    case 244: return 1058;
    case 245: return 1059;
    case 246: return 1046;
    case 247: return 1042;
    case 248: return 1068;
    case 249: return 1067;
    case 250: return 1047;
    case 251: return 1064;
    case 252: return 1069;
    case 253: return 1065;
    case 254: return 1063;
    case 255: return 1066;
    default: return koi8r;
    }
}



а не лучше ли "а,и,е" вытащить вперёд и вообще отсортировать по частоте?
default: return koi8r;
это совершенно точно надо в начало ставить.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984126
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Почему ASCII <= 127 ?
Д.Кнудт, "Всё про TeX" (неточная цитата): "... необходимость более 128 символов в общецелевых приложениях всё ещё неочевидна". ANSI, 1963 год.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984139
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не надо забывать про терминалы с семибитным RS232.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984180
Алексей Роза

а не лучше ли "а,и,е" вытащить вперёд и вообще отсортировать по частоте?


Нет, потому что всё равно конвертируется в массив такой switch А дальше он сам его отсортирует.


Алексей Роза

это совершенно точно надо в начало ставить.


Без разницы где ему висеть. Он всё равно проверяет диапазон входного массива.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984214
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
И не надо забывать про терминалы с семибитным RS232.
Ну так потому и "всё ещё неочевидна" - когда у вас 75 бод, то передача восьми бит вместо семи выглядит довольно накладной.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984284
ВсеРазумный
Нет, потому что всё равно конвертируется в массив такой switch А дальше он сам его отсортирует.

в смысле "сам"?
т.е. он непременно должен каждый раз перебирать 127 значений и никак это не изменить?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения теорий Шеннона английский текст обладает плонтностью 1.3 бит на символ безотносительно
кодировки. Соотв если апач хорошо жмёт контент в gzip - мы можем ожидать неизменный результат и для 8
и для 16 и для 32 бит на символ.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984291
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
С точки зрения теорий Шеннона английский текст обладает плонтностью 1.3 бит на символ безотносительно
кодировки. Соотв если апач хорошо жмёт контент в gzip - мы можем ожидать неизменный результат и для 8
и для 16 и для 32 бит на символ.

Вот поэтому и нужен не utf-8, а uc-32.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984294
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Вот поэтому и нужен не utf-8, а uc-32.
Во-первых любые UCS-варианты уже "deprecated".
Во-вторых, вы так и не можете понять простой вещи: составные символы останутся составными в любой кодировке. Фиксированное число бит у этой кодировки или переменное - без разницы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984296
mayton
Соотв если апач хорошо жмёт контент в gzip

у gzip есть 0-9 уровни сжатия, на 0 самое существенное различие, потом уже незначительный рост
а вот затраты проца растут значительно
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984298
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Вот поэтому и нужен не utf-8, а uc-32.
Во-первых любые UCS-варианты уже "deprecated".
Во-вторых, вы так и не можете понять простой вещи: составные символы останутся составными в любой кодировке. Фиксированное число бит у этой кодировки или переменное - без разницы.

Я это отлично понимаю.

Давайте по другому. Допустим у нас UC-32. Приведите пример составного символа, будем смотреть.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984300
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
mayton
Соотв если апач хорошо жмёт контент в gzip

у gzip есть 0-9 уровни сжатия, на 0 самое существенное различие, потом уже незначительный рост
а вот затраты проца растут значительно

Я просто акцентирую внимание на том что для информационной энтропии разрядность источника - не играет роли.
Для энтропии просто интересна частота неких абстрактных символов.

Кстати эта вся теория рождалась задолго до появления битов и байтов . Клод Шеннон - знатный старец среди
кибернетиков и электротехников.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984305
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Приведите пример составного символа, будем смотреть.
Для кирилицы? "Ё" и "Й". Да, каждый из этих символов имеет "собственный" код, но вы не может запретить "всему миру" использовать нормализацию с полной декомпозицией.
Где это проявляется на практике? Например, при отображении этого самого "ивана-краткого" в Far3.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984308
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
у gzip есть 0-9 уровни сжатия, на 0 самое существенное различие
Использовать термин "сжатие" для "store only" - сильный ход. "Мне бы такое зрение - видеть Никого, да ещё на таком расстоянии".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984313
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Приведите пример составного символа, будем смотреть.
Для кирилицы? "Ё" и "Й". Да, каждый из этих символов имеет "собственный" код, но вы не может запретить "всему миру" использовать нормализацию с полной декомпозицией.

Ну если кто-то включил полную декомпозицию, наверно, он знает что делает, ему это надо и он проблемы решит? Мне не нужна такая декомпозиция. Т.е. я не вижу проблемы с "Й" в UC-32. А вот проблемы в utf-8 я вижу.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984317
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юникод обязан работать не только у вас и для включения полной декомпозиции существуют вполне весомые аргументы.

P.S.
ConEmu и Хабр по ссылке оттуда.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984319
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravА вот проблемы в utf-8 я вижу.

И в чём её проблема?

PS: Ни Far3, ни Notepad, ни один из других известных мне просмотрщиков текстовых файлов на
Windows не умеет работать с декомпозицией, что меня удручает, поскольку именно в таком
формате идёт программа передач с телевизора.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984321
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Юникод обязан работать не только у вас и для включения полной декомпозиции существуют вполне весомые аргументы.

У вас, мне кажется, какой-то неверный подход. Юникод обязан работать у всех, но не работает. При чём не работает у неглупых людей. Может проблема с Юникодом? Но ладно.

Какие есть весомые аргументы включить полную декомопозицию?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984324
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Какие есть весомые аргументы включить полную декомопозицию?
Искать "йод" и "иод", как пример.

P.S.
Юникод не работает тогда, когда очередной petrav считает, что "вот эту фигню можно не делать - бред же".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984327
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Какие есть весомые аргументы включить полную декомопозицию?
Искать "йод" и "иод", как пример.

Подождите. Ну вот мы полностью декомпозировали "йод", получилось четыре символа utf-8, "й" распалась на два, так? Но тривиальным алгоритмом поиска мы всё равно не найдём "иод". Я прав?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984337
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Но тривиальным алгоритмом поиска мы всё равно не найдём "иод". Я прав?
Только потому, что привыкли "не делать вон ту фигню".
Существуют диапазоны юникодных символов и всяческая диакритика расположена во вполне конкретных местах. И разные варианты пробела занимают вполне конкретные места и разные варианты дефисов - тоже.
Следовательно, корректному "юникодному" алгоритму надо понимать - какой именно "тип" у найденного кода, но не всегда требуется анализ конкретного кода в уже известном диапазоне ("типе").
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984338
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
получилось четыре символа utf-8
И в UTF-16 и в UTF-32 тоже будет четыре кода. Но вы, зачем-то, опять выделили UTF-8.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984344
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Но тривиальным алгоритмом поиска мы всё равно не найдём "иод". Я прав?
Только потому, что привыкли "не делать вон ту фигню".
Существуют диапазоны юникодных символов и всяческая диакритика расположена во вполне конкретных местах. И разные варианты пробела занимают вполне конкретные места и разные варианты дефисов - тоже.
Следовательно, корректному "юникодному" алгоритму надо понимать - какой именно "тип" у найденного кода, но не всегда требуется анализ конкретного кода в уже известном диапазоне ("типе").

Т.е. вы хотите сказать, что в стандарте Юникода прописано, что после русской буквы "е" допустим диакритический знак, причём именно такой как в этой букве "ё"? И что в русском языке допускается заменить "ё" на "е"? И немец, который ни бум-бум в русском, сможет учитывать этот нюанс (при разработке поискового движка) используя исключительно стандарт Юникода?

Или вы хотите просто определить, что символ диакретический и его отбросить в поиске?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984345
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
получилось четыре символа utf-8
И в UTF-16 и в UTF-32 тоже будет четыре кода. Но вы, зачем-то, опять выделили UTF-8.

Я не отбрасывал. Я пытаюсь понять как вы видите написание поиска по строке.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984346
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После любой буквы допустим любой диакритический знак. И да, вне зависимости от языка его
можно отбросить если нужно accent-insensitive сравнение.

Как там прописано case-insensitive я не знаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984349
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, почитай еще раз закрытый топик https://www.sql.ru/forum/1319689-1/msvc-i-gcc-sovmestimost-kodirovok-ishodnikov

Там было много полезной инфы к сведению.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984350
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

После любой буквы допустим любой диакритический знак. И да, вне зависимости от языка его
можно отбросить если нужно accent-insensitive сравнение.

Как там прописано case-insensitive я не знаю.

Т.е. в любом языке отбрасывание диакритических знаков не меняет смысла слова? Спорное утверждение. "Нёбо" — "небо", "зайка" — "заика". Но ладно, мы пишем простой поиск и отбросим все диакритические знаки после полной декомпозиции. Ведь именно о поиске после декомпозиции писал Сидоров.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984356
Basil A. Sidorov
Алексей Роза
у gzip есть 0-9 уровни сжатия, на 0 самое существенное различие
Использовать термин "сжатие" для "store only" - сильный ход. "Мне бы такое зрение - видеть Никого, да ещё на таком расстоянии".

судя по кол-ву букв в твоей жизни наконец-то произошло что-то важное.
1, да.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984360
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravТ.е. в любом языке отбрасывание диакритических знаков не меняет смысла слова?

В любом языке поиск слова идёт по написанию, а не по смыслу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984365
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не уверен, что разница между "e" и "ё" и "и" и "й" это именно диакретические символы
такое трактование термина "диакретический" мне кажется достаточно вольным.

при таком подходе и мягкий / твердый знак можно диакретическим символом назвать

IMHO единственный знак похожий на диакретический - знак ударения. А буквы "е", "ё", "и", "й", "ь", "ъ", "ять", "фета" это все же отдельные буквы. IMHO

Если кто видел древнегреческий алфавит ))) - вот там полное развличение с диакретическими символами. Буква греческого алфавита + 8 (точно не уверен, но их комбинаций еще больше!) диакретических символов которые почти к любой букве могут применяться. AFAIK

В общем, тут лингвист нужен )))

ВикипедияДиакрити́ческие зна́ки (др.-греч. διακριτικός — «служащий для различения», от др.-греч. κριτικός — «способный различать»):

в лингвистике — различные надстрочные, подстрочные, реже внутристрочные знаки, применяемые в буквенных (в том числе консонантных) и слоговых системах письма не как самостоятельные обозначения звуков, а для изменения или уточнения значения других знаков;
в типографике — элементы письменности, модифицирующие начертание знаков и обычно набираемые отдельно
...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984369
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По версии википедии, называть фигню над буквой ё диакретическим знаком некорректно


https://ru.wikipedia.org/wiki/Ё#Название_надстрочного_элемента

Официального и общепринятого термина для выносного элемента, присутствующего в букве «ё», нет. Традиционное языкознание и педагогика использовали слово «двоеточие»[К 3], в последние же сто лет чаще всего обходятся менее формальным выражением «две точки»[К 4], либо вообще стараются избегать отдельного упоминания этого элемента[К 5]. Использование иноязычных терминов (умлаут, трема, диерезис или диалитика) применительно к данной ситуации считается некорректным , так как это диакритические знаки и прежде всего обозначают определённую фонетическую функцию, хотя, например, А. А. Реформатский их использовал[3].
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984384
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Т.е. вы хотите сказать, что в стандарте Юникода прописано, что после русской буквы "е" допустим диакритический знак, причём именно такой как в этой букве "ё"?
Я хочу сказать, что вам не надо делать интеллектуальных усилий, чтобы игнорировать (считать равными) определенные диапазоны юникода.
Если (вдруг) вам потребуется обработка текста детской книжки (с расставленными ударениями), то корректный алгоритм будет корректным, а "оптимизированный" - облажается.

P.S.
Как говАривал дедушка Энштейн: "Делайте просто, но не проще, чем нужно".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984387
Алексей Роза

в смысле "сам"?
т.е. он непременно должен каждый раз перебирать 127 значений и никак это не изменить?


Эмм. Для обычного switch это goto array pointer address. Для такого - же switch, компилятор оптимизирует и преобразует в обычный массив array get index value что сводиться к простой конструкции ArrSwitch[IDX]
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984390
ВсеРазумный
Для обычного switch это goto array pointer address.


Ну это в лучшем случае, при хорошем оптимизаторе. А так - да, может быть так что switch обычный будет перебираться пока не найдёт свой собственный элемент конструкцией else-If.


Так что вы были не далеки от правды.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984392
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Т.е. вы хотите сказать, что в стандарте Юникода прописано, что после русской буквы "е" допустим диакритический знак, причём именно такой как в этой букве "ё"?
Я хочу сказать, что вам не надо делать интеллектуальных усилий, чтобы игнорировать (считать равными) определенные диапазоны юникода.
Если (вдруг) вам потребуется обработка текста детской книжки (с расставленными ударениями), то корректный алгоритм будет корректным, а "оптимизированный" - облажается.

Я так понимаю что полная декомпозиция строки сведётся к следующему:

1. Дважды проанализировать все байты текста в котором мы ищем подстроку.
2. Выделение динамической памяти.
3. Копирование всего текста.

А зачем нам для поиска "по Сидорову" вообще делать декомпозицию? Если мы можем алгоритм поиска по utf-8 параметризовать политикой:

Код: plaintext
1.
2.
3.
4.
5.
CharType prepareChar(CharType char)
{
    // Замена: "й" -> "и", "ё" -> "е" и т.д.
    return <символБезДиакретики>;
}



И в один проход, без всякой декомпозиции и копирования, in place найти нужную нам строку?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984394
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вас смутил тип CharType могу предложить такую политику:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct CharType
{
    char ch[4];
    uint8_t len;
};

CharType prepareChar(CharType char)
{
    // Замена: "й" -> "и", "ё" -> "е" и т.д.
    return <символБезДиакретики>;
}
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984396
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
1. Дважды проанализировать все байты текста в котором мы ищем подстроку.
2. Выделение динамической памяти.
3. Копирование всего текста.
Вся эта многотрудная деятельность (как и многое другое) выполняется разово, а её результат остаётся постоянно доступным.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984400
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
1. Дважды проанализировать все байты текста в котором мы ищем подстроку.
2. Выделение динамической памяти.
3. Копирование всего текста.
Вся эта многотрудная деятельность (как и многое другое) выполняется разово, а её результат остаётся постоянно доступным.

Т.е. вы предлагаете для скорости кешировать результаты полной декомпозиции? Но в таком случае она тем более не нужна, точнее она вообще не нужна. Нам нужна не декомпозиция, а удаление диактретики вообще (й -> и...). И составные символы нам тоже не нужны. И буквой Ё проблем нет.

У нас только одна проблема: если на вход нашей программы какой-то пудель нам подсунет результаты полной декомпозиции.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984402
petrav,

Просто в тексте поиска заменяйте Й,И,E,Ё на X и в искаемом тексте. Проблемы не будет
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984403
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Т.е. вы предлагаете для скорости кешировать результаты полной декомпозиции?
Будьте добры не приписывать мне ваши собственные измышления.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984405
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
petrav,

Просто в тексте поиска заменяйте Й,И,E,Ё на X и в искаемом тексте. Проблемы не будет

Я собственно это и предлагаю. Просто Сидоров рассуждает так: UC-32 нам не подходит, потому что нам всё равно нужны составные символы для поиска. Типа для поиска нужно Ё заменить на два символа. И пока он не смог обосновать зачем это нужно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984413
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrov, Basil A. Sidorov

я перечитал дискуссию два раза и вообще не понял, что Вы сейчас обсуждаете (((

Последнее понятное сообщение
22174105
всё что дальше, лично мне вообще не понятно, о чем разговор.

Кроме акцент марк (диакритик марк) есть и управляющие символы (перевод строки, разрывный - не разрывный пробел, "разрещение" на перенос в данном месте слова), и языки где одной букве соответствует дофига начертаний (вроде в арабских языках написание буквы зависит от предыдущей/следующей буквы), и иероглифы, и все прочее.

И в общем, Basil A. Sidorov совершенно прав, что fixed, что utf, основная сложность совершенно в другом будет заключатся ((( Unicode он в меньше степени про кодировку, в большей про обработку и полиграфию. Сам читал в 2000-ом и ничего не понял )))

к тому же, выяснилосль, что:
1) Unicode древнегреческий язык не поддерживает
2) ни одного Unicode шрифта и Ms Word с нормальной поддержкой диакритик знаков все равно нет. Т.к. буквы разноширинные и даже если взять диакритик марк из шрифта, он над буквой будет черти где рисоваться. Марки есть, пользоваться невозможно
Для древнегреческого тогда использовали самопально-нарисованные обычные (неUnicode) шрифты и "обычный" текст в 1251 (Ms Word думал что 1251, на деле древнегреческий). Как сейчас - не знаю.
3) те шрифты которые есть, нужно покупать у Adobe
В 2000-ом все было очень печально. Полной фигней этот Unicode оказался (((. Подозреваю сейчас не сильно лучше
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984414
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Типа для поиска нужно .... И пока он не смог обосновать зачем это нужно.


Поскольку один и тот же символ может кодироваться по разному, желательно его "нормализовать". Привести к единому варианту.

Пример с русским языком не корректен. Нужно брать языки с accent mark
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984415
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
нам всё равно нужны составные символы для поиска
Ещё раз прошу - не приписывайте мне ваши собственные измышления.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984417
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
нам всё равно нужны составные символы для поиска
Ещё раз прошу - не приписывайте мне ваши собственные измышления.

Может я неправильно понял? Это что значит?
Basil A. Sidorov
petrav
Какие есть весомые аргументы включить полную декомопозицию?
Искать "йод" и "иод", как пример.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984418
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Может я неправильно понял? Это что значит?
Я отстаиваю простую позицию: никакой вариант кодирования не позволяет избавиться от составных символов.
Практически это означает, что нет смысла вводить в язык программирования и в API высокого уровня тип (w/mb)char: string - и никаких гвоз..., тьфу, чаров. Не char как эквивалент байта, а char, как эквивалент "символ алфавита".
Да, для реализации низкоуровневого API потребуются коды, но, скорее всего, разумнее будет использовать int. Точно так же, как "современный" readch возвращает int, хотя "было время", когда возвращал (знаковый) char.
petrav
Basil A. Sidorov
Искать "йод" и "иод", как пример.
Это пример применимости полной декомпозиции и пример того, что составные символы могут появится в "типа однобайтовых" алфавитах.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984422
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
Может я неправильно понял? Это что значит?
Я отстаиваю простую позицию: никакой вариант кодирования не позволяет избавиться от составных символов.

Да petrav вроде и не спрашивал про составные. Его вопрос в основном касался оптимизации хранения (байты)
и скорости доступа к производльному i-му символу в строке.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984423
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытаюсь дополнить более корректным примером. Для ряда применений, при обработке/сравнении/поиске может оказаться, что

H20 - информации о superscripts / subscript нет
H 2 O - Combining characters, за которые ратует Basil A. Sidorov (просто цифра 2 + доп. информация о режиме отрисовке)
H Unicode Symbol с кодом U+2082 0 - Precomposed characters, как хочет petrav

одно и то же

note: возможно путаница в терминах Combining / Precomposed , читайте стандарт сами
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984425
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Да petrav вроде и не спрашивал про составные. Его вопрос в основном касался оптимизации хранения (байты) и скорости доступа к производльному i-му символу в строке.
Так составные символы принципиально влияют на алгоритм и, соответственно, скорость доступа к i-му символу строки. Внезапно.
petrav желает сидеть на двух стульях: ему требуется индексный доступ и юникод одновременно . "Не бывает" (ц) комедия "Чародеи", голос скатерти-самобранки.

P.S.
Можно ещё и графа Калиостро из другой комедии вспомнить: "Седалища не хватит"
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984426
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

вопрос в основном касался оптимизации хранения (байты)
и скорости доступа к производльному i-му символу в строке.


здесь простая и очевидная вилка.
если под капотом строки исходный поток байт, то для uft-8 скорость доступа к i-му символу строки линейна по i,
и у тебя нет иных вариантов.

Если же ты критически зависишь от константного доступа к произвольному символу строки - ты не можешь
работать с ней в сыром виде, и должен заплатить за это расходом памяти на преобразование.


Вопрос "что такое строка?" здесь приобретает диалектический, философский характер.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984427
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте лучше перейдем в плоскость 4х алгоритмов нормализации, которые существуют в документации
по Microsoft.Net framework и Java.

https://docs.microsoft.com/en-us/dotnet/api/system.text.normalizationform?view=netcore-3.1
https://docs.oracle.com/javase/tutorial/i18n/text/normalizerapi.html

Пример теста который успешен. Данные взяты с Microsoft, функция нормализации из OpenJDK.

Код: java
1.
2.
3.
4.
   //from Microsoft.Net https://docs.microsoft.com/en-us/dotnet/api/system.text.normalizationform?view=netcore-3.1
        assertEquals("&#7855;", Normalizer.normalize("\u1EAF", Normalizer.Form.NFC));
        assertEquals("&#7855;", Normalizer.normalize("ắ", Normalizer.Form.NFC));
        assertEquals("&#7855;", Normalizer.normalize("ắ", Normalizer.Form.NFC));



Аналогичные алгоритмы я находил в реализациях Python3.

Почему я настойчиво предлагаю пойти в обратную сторону. Тоесть не в стандарт а именно в реализацию
и от нее - в обратку. Тесть если мы увидим в реализации то что нас шокирует или каким-то образом вызовет
вопросы - мы идем в стандарт и читаем.

Я считаю что дискуссия зашла в тупик и ходит по кругу. Petrav - господин очень настойчивый и целеустремленный.
Но имеет место некая зашоренность которая не позволяет ему просто выйти на уровень принятия той или иной
концепции работы со строками. Он считает что индексация строки очень важна. И в таком решиме мы еще 5-10 лет
проговорим.

А говорили уже на эту тему много.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984429
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Движок сломал красивое начертание композитной буквы. Я сделаю скриншот.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984431
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тесть если мы увидим в реализации то что нас шокирует или каким-то образом вызовет вопросы - мы идем в стандарт и читаем.
Это, типа, десяток леммингов должен найти косяки сотен (тысяч?) специалистов и десятков (сотен?) тысяч пользователей?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984432
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
mayton
Да petrav вроде и не спрашивал про составные. Его вопрос в основном касался оптимизации хранения (байты) и скорости доступа к производльному i-му символу в строке.
Так составные символы принципиально влияют на алгоритм и, соответственно, скорость доступа к i-му символу строки. Внезапно.
petrav желает сидеть на двух стульях: ему требуется индексный доступ и юникод одновременно . "Не бывает" (ц) комедия "Чародеи", голос скатерти-самобранки.

P.S.
Можно ещё и графа Калиостро из другой комедии вспомнить: "Седалища не хватит"

Именно поэтому я и апеллирую к практике применения композиций. А именно к документации
по Microsoft/Oracle технологиям. Ни в одной из них композиция не является частью самой строки.

А вынесена в отдельную прикладную библиотеку - нормализатор. И судя по дизайну его практика
применения - опциональна. Тоесть прикладной программист сам решает когда ему применять
нормализацию и когда нет. Нужны ли ему ударения? Нужен ли ему немецкий умляют как диактитика?
Это пойдет от прикладной задачи. Тоесть бизнес должен это отдельно заявить.

В обычных юзкейсах (99.9%) об которые бъется бедняга Петрав нормализация ему дай бог не понадобиться.
Какая у него там нормализация в самолётах? Чорт его знает. Ему бы лишних микросекунд наковырять...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984433
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Вопрос "что такое строка?" здесь приобретает диалектический, философский характер.


Насколько я помню стандарт Unicode, там и понятия, что такое "символ", "буква" , "получившаяся картинка на бумаге" приобретает диалектический, философский характер.

А Вы сразу на "строка" замахнулись ))) По поводу строк юникоде говорит следующее:
http://unicode.org/reports/tr14
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984440
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton


В 2004 сталкивался с ПРИКЛАДНОЙ задачей, когда сильно хотелось Unicode... но Unicode и компьютеры "не смогли".
Банальное описание надписей на предметах и нагробиях + поиск по ним

https://jalita.com/guidebook/kerch/istoriko-arkheologicheskiy_muzey.shtml
https://ru.wikipedia.org/wiki/Пантикапей
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984444
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
mayton


В 2004 сталкивался с ПРИКЛАДНОЙ задачей, когда сильно хотелось Unicode... но Unicode и компьютеры "не смогли".

Вы какраз попали на версию MS Net Framework 1.1. Одна из первых.

А на каком языке были разработки? Я не думаю что unicode не могли. Технически там не бох весть какая проблема.
Может со шрифтами был косяк? Я помню что ранние TrueType тоже работали только в национальном диапазоне.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984450
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

А на каком языке были разработки?

https://www.sql.ru/forum/110900/oracle-forms-6i-i-utf-8 )))


mayton

Я не думаю что unicode .... со шрифтами...

Нужного языка в Unicode просто НЕ БЫЛО (((

Ну не подумали в Unicode об древнегреческом языке и Precomposed characters (которые так милы сердцу Petrov) для греческого там просто НЕТ (((, соответственно и в шрифтах таких комбинаций символов нет.

Combining characters (отдельно греческая буква + акцент марки) ни одно средство в то время отрисовывать вообще не умело. Ни Rich Edit control, ни MS Word. А если бы даже я бы и отрисовывал (сдвинуть позицию и в одной позиции два раза нарисовать разные символы - ни бином ньютона запрограмировать) - то получилась бы полная порнография (((, т.ч. я даже заниматься этим не стал.

Сам Unicode в БД мы запихнули (потом пригодилось для украинского и казахского языка и прочих, хотя с казахским вроде тоже все было весело, там тоже нужных символов в стандартном "unicode" Windows не было), но в целом, для Керчи оно оказалось не сильно нужным ((( Но об этом узнали только уже у заказчика, когда на реальные тексты посмотрели. Надеялись текст вводит нормало, а пришлось вводить "как всегда" в транскрипции - вместо нормальных букв записывается та же фраза современными буквами в капcлоке.

В общем, разница такая-же как между H2O C2H5OH и H 2 O C 2 H 5 OH - жить можно, но счастья особого нет.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984454
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. Нам с вами повезло пройтись по граблям этой технологии.

Поддержка нормализации в Java была запихнута... эээ щас секунду сделаю блейм. Вот.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 108) public final class Normalizer {
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 109) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 110)    private Normalizer() {};
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 111) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 112)     /**
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 113)      * This enum provides constants of the four Unicode normalization forms
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 114)      * that are described in
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 115)      * <a href="http://www.unicode.org/unicode/reports/tr15/tr15-23.html">
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 116)      * Unicode Standard Annex #15 &mdash; Unicode Normalization Forms</a>
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 117)      * and two methods to access them.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 118)      *
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 119)      * @since 1.6
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 120)      */
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 121)     public static enum Form {
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 122) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 123)         /**
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 124)          * Canonical decomposition.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 125)          */
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 126)         NFD,
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 127) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 128)         /**
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 129)          * Canonical decomposition, followed by canonical composition.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 130)          */
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 131)         NFC,
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 132) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 133)         /**
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 134)          * Compatibility decomposition.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 135)          */
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 136)         NFKD,
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 137) 
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 138)         /**
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 139)          * Compatibility decomposition, followed by canonical composition.
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 140)          */
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 141)         NFKC
ce0984a87ec4 jdk/src/share/classes/java/text/Normalizer.java       (duke   2007-12-01 00:00:00 +0000 142)     }



В 2007 году некий Дюк закоммитил первые константы относящиеся к кодификатору этих четырех алгоритмов.

А вот матрица совместимости Unicode-стандартов и дотнета. Видно что было активное внесение изменений.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984456
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот самая олд-скульная версия документа касающася нормальных юникодовских форм

https://www.unicode.org/reports/tr15/tr15-22.html

Датируется 2002-03-26. Если кто знает более раниие - прошу отписать.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984457
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Ну не подумали в Unicode об древнегреческом языке
Вы бы, мопвашуять, уточняли версию стандарта юникода, с которым вы работали двадцать лет назад: Греческое и коптское письмо .

P.S.
Способность помнить события "времён очаковсксих и покоренья Крыма", безусловно, говорит о хорошей памяти, но ...цкая способность рассказывать о них, как о "только что случившихся"... Ну не старые же маразматики языки на завалинке чешут?..
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984469
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Я считаю что дискуссия зашла в тупик и ходит по кругу. Petrav - господин очень настойчивый и целеустремленный.
Но имеет место некая зашоренность которая не позволяет ему просто выйти на уровень принятия той или иной
концепции работы со строками. Он считает что индексация строки очень важна.

Я придумал хорошую аналогию. Знаете, золотое правило проектирования С++: если ты не используешь какой-то навороченный функционал С++, то ты и не платишь накладные расходы за этот функционал. Виртуальные функции кажутся не производительными? Не используй их. Потоки С++ медленные? Используй I/O из унаследованного Си. Разворачивание стека не нравится, отключи исключения, но тогда без STL. И т.д.

А с Юникодом всё наоборот. Мне не нужны акценты, какие-то составные символы, нюансы арабских языков и т.д. Но за всё за это я уже заплатил. У меня поломалась визуализация данных и печать отчётов. Я переписывал алгоритмы. И я считаю, что можно было сделать лучше. Не платить за то что не используешь.

Я, конечно, понимаю, что в системах вёрстки журналов, в текстовых редакторах, в поисковых движках, в браузерах — все навороты Юникода нужны. Я только За.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984473
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, ну и слава богу.

Я тебе очень сильно советую хотя-бы немного попрограммировать на C#. Чтоб просто посмотреть
как некоторые вещи реализованы. После этого вернись к С++ и превнеси какие-то идеи или принципы
какие ты увидел. Вариться всю жизнь в С++ - это означает быть флюсо-подобным специалистом.
Надо расширять кругозор.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984478
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Я тебе очень сильно советую хотя-бы немного попрограммировать на C#.

А ведь Java и JavaScript хранят строки в utf-16 и у классов String в этих языка есть оператор [] и метод length().

Вот в Европе какой процент программистов перед вызовом [] резко остановится и начнёт думать, а что там такое записано? Может суррогатная пара? Вот какой процент по вашему мнению? Я понимаю, что в вэбе это редко нужно.

PS: У меня около 8-ми лет стажа на SQL, JavaScript, C# (WinForms, ASP.NET). Но я уже мало что помню.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984486
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

Современная Java хранит строки чуть сложнее. У строки уже есть 2 варианта хранения. При едином интерфейсе снаружи.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984493
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Угу.
Правда от константы для charat они все равно не отказались.
Им самим это больно было бы.
И боролись там не за скорость, а за память.

Нюанс состоит в том, что всяка ява/basic исходит из того, что строка уже есть .
И за всяки плюшки, сорта длины строки или её хеш-кода уже заплачено к моменту,
когда пришло время за константу обращаться к её символам или определять длину/хеш-код.

Между тем, есть масса задач, для которых представление строки "стандартным" библиотечным типом - это слишком дорогой платеж за её построение.

Из этого не следует, что не требуется опознавать текущий символ в каком-нибудь CharSequence,
или даже опознавать в нём целый набор отслеживаемых слов.

Но топик, вообще-то имени switch.
Прочитал на днях, что уже после первой стандартизации ANSI ещё какое время goto case 5:
признавали за легальную, но не рекомендуемую конструкцию.

Потом зачем-то решили разделить метки на правые и левые.
Конструкция goto case 5: при таком разделении оказалась левой.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984501
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav,

Современная Java хранит строки чуть сложнее. У строки уже есть 2 варианта хранения. При едином интерфейсе снаружи.

А что возвращает оператор [] у Ява String?

PS: Если вам не интересно, то не отвечайте.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984503
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Вот в Европе какой процент программистов перед вызовом [] резко остановится и начнёт думать, а что там такое записано? Может суррогатная пара? Вот какой процент по вашему мнению? Я понимаю, что в вэбе это редко нужно.


Дональд Кнут считает что нужно сначала писать правильную и работающую
программу. А потом ее уже оптимизировать.

Моя точка зрения с этим вобщем совпадает. Ты должен в первую очередь прототипировать задачу.
Решать ее в виде теч-демо и предлагать заказчику. Дальнейшие улучшения - это технические дебты
которые можно пустить отдельной категорией. Разумеется я трачу время на обдумывание алгоритмов и
структур данных. Но поверь я ни секунды не думаю над строками. Их API в моих языках вылизан десятилетиями
и как правило он лучше чем я о нем думаю. Интринзики на ассемблере давно покрыли все строковые
операции типа compare, substing, indexOf e.t.c. даже в Java. Ну нету сегодня ни одного основания
думать о том как реализован get(i) для i-го символа. Он - константа уверяю тебя.

Все о чем писал Василий в части Unicode стандартов - это правильно. Другое дело что это правильно
в каком-то узком диапазоне кейсов. Я работал и DeucheBank и уверяю тебя ни секунды у меня не было
багов с нормализацией. Да я просто не ведал что это такое. Весь контент в Excel файлов и в базах
данных мы получали обычным utf-8 или unicode-16. И символы немецкого языка были в виде
ä, ö, ü (0x0228, 0x0246, 0x0252) односимвольных букв. Возможно немцы сами никогда
не используют эти combining characters или нам просто везло.

Попробуй полазить по немецким сайтам и посмотреть как отдается веб-содержимое. Найдешь хоть один
комбо-символ?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
petrav,

Современная Java хранит строки чуть сложнее. У строки уже есть 2 варианта хранения. При едином интерфейсе снаружи.

А что возвращает оператор [] у Ява String?

PS: Если вам не интересно, то не отвечайте.

Давай глянем. В последней транковой версии исходников OpenJDK.
Почему я беру именно эту версию? Это эстраполяция на будущие разработки. То что входит
в эту ветку потом релизится.

remote.origin.url=https://github.com/unofficial-openjdk/openjdk

Вот вобщем 2 разных реализации. Для UTF16 и латиницы.

src/java.base/share/classes/java/lang/String.java
Код: java
1.
2.
3.
4.
5.
6.
7.
 public char charAt(int index) {
        if (isLatin1()) {
            return StringLatin1.charAt(value, index);
        } else {
            return StringUTF16.charAt(value, index);
        }
    }


Operator[] отсуствует. Тоесть он есть но определён только для массивов. Перегрузку индексатора
для произвольного класса java не поддерживает. Java - это достаточно консервативный язык.
Те кто хотят синтаксических сахаров - идут в Scala/Kotlin. И получают более мощный ЯП но в принципе
байткод тот-же самый. Местами байткод будет хуже т.к. подтянет больше зависимостей.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984512
ВсеРазумный
ВсеРазумный
Для обычного switch это goto array pointer address.


Ну это в лучшем случае, при хорошем оптимизаторе. А так - да, может быть так что switch обычный будет перебираться пока не найдёт свой собственный элемент конструкцией else-If.

Так что вы были не далеки от правды.

и чё если там миллионы их
и всё это в цикле?
да это противоречит всей философии C/C++, где именно на программисте лежит ответственность за то, где он что разместит. Невозможность убрать такой неэффективный поиск - это какой-то нонсенс.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984515
petrav
ВсеРазумный
petrav,

Просто в тексте поиска заменяйте Й,И,E,Ё на X и в искаемом тексте. Проблемы не будет

Я собственно это и предлагаю. Просто Сидоров рассуждает так: UC-32 нам не подходит, потому что нам всё равно нужны составные символы для поиска. Типа для поиска нужно Ё заменить на два символа. И пока он не смог обосновать зачем это нужно.

а тут предлагается английский текст искать русскими буквами или мы всё таки сначала определяемся с таблицей, по которой ищем?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984522
mayton
Попробуй полазить по немецким сайтам и посмотреть как отдается веб-содержимое. Найдешь хоть один комбо-символ?

https://www.bike-components.de/
прям сразу в верхнем меню
но это utf, а не unicode
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984525
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonStringUTF16.charAt(value, index);

Теперь лезем глубей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public static char charAt(byte[] value, int index) {
         checkIndex(index, value);
         return getChar(value, index);
     }

     static char getChar(byte[] val, int index) {
         assert index >= 0 && index < length(val) : "Trusted caller missed bounds check";
         index <<= 1;
         return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) |
                       ((val[index]   & 0xff) << LO_BYTE_SHIFT));
     }


Внезапно никаких проверок на композиты, и прочую фигню, тупо пара байт по заданному смещению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984529
Алексей Роза,

Давайте на примере разберёмся что есть что. Возьмём к примеру GCC 10.2 так как я им пользуюсь в основном.

Возьмём для примера обычное извлечение из массива

Код: plaintext
1.
2.
3.
4.
5.
const static int HashIndex[] = {10, 20, 70, 40, 50};

int GetHashIndex(int i){
  return HashIndex[i];
}



Получаем
Код: sql
1.
2.
  mov eax, DWORD PTR [esp+4]
  mov eax, DWORD PTR HashIndex[0+eax*4]




Теперь испробуем конструкцию switch создав подобную ситуацию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 0: return 10;
        case 1: return 20;
        case 2: return 70;
        case 3: return 40;
        case 4: return 50;
    }
}



Получаем на выходе аналогичный код
Код: sql
1.
2.
  mov eax, DWORD PTR [esp+4]
  mov eax, DWORD PTR CSWTCH.8[0+eax*4]




А теперь имитируем через switch в плане else - if

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int  __attribute__ ((noinline)) CaseCall1(int i, int r) {
    return (i * i) * r;
};
int  __attribute__ ((noinline)) CaseCall2(int i, int r) {
    return r + (i * 10);
};
int  __attribute__ ((noinline)) CaseCall3(int i, int r) {
    return i / (i / 2) * r;
};
int  __attribute__ ((noinline)) CaseCall4(int i, int r) {
    return r / (i / 2);
};



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int SwitchElseIf(int i, int r){
  switch(i)
    {
        case 0: 
            return CaseCall1(i, r);
        break;
        case 1:
            return CaseCall2(i, r);
        break;
        case 2: 
            return CaseCall3(i, r);
        break;
        case 3: 
            return CaseCall4(i, r);
        break;
    }
}




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L7
  jg .L8
  test eax, eax
  jne .L9
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L8:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
main:
  xor eax, eax
  ret





На выходе получаем страшный и уродливый ASM представляющий из себя else - if конструкцию где если 10000 элементов, то он будет долго перебирать до последнего.

Ты пишешь


Алексей Роза
где именно на программисте лежит ответственность за то, где он что разместит. Невозможность убрать такой неэффективный поиск - это какой-то нонсенс.


Есть возможно контралировать. И вот тут как раз придуман goto array pointer, что бы не иметь миллион else - if

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int SwitchElseIf(int i, int r){
   static const void*Pointers[4] = {&&case0, &&case1, &&case2, &&case3};

goto *Pointers[i];
    case0: 
        return CaseCall1(i, r);
    case1:
        return CaseCall2(i, r);
    case2: 
        return CaseCall3(i, r);
    case3: 
        return CaseCall4(i, r);
}




На выходе мы получаем красивый код Прыжка Адресации
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  jmp [DWORD PTR SwitchElseIf(int, int)::Pointers[0+eax*4]]
.L10:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall4(int, int)
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall3(int, int)
.L8:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall2(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall1(int, int)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984531
Самая лучшая идея это создание goto array pointer

Теперь вспомним что большинство автоматов к примеру в PHP работает со стандартным switch.


Можно только представить на сколько скорость увеличится, если избавиться от switch конструкции в целом.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984546
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Я придумал хорошую аналогию.
А тут и придумывать ничего не надо: "Я бы взял частями, но мне нужно сразу".

P.S.
Насчёт "не пользуешься - не платишь" - это вы загнули. Платишь.
Необходимостью помнить семантику разных типов конструкторов, способов инициализации и всякой прочей неочевидной чешуи, которая мне, например - никуда не впилась.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984547
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
А что возвращает оператор [] у Ява String?
А нету у класса java.lang.String такого оператора.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984548
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Попробуй полазить по немецким сайтам и посмотреть как отдается веб-содержимое. Найдешь хоть один комбо-символ?
Я, вообще-то, специально цеплял скриншот. Сайт, правда, на русском, но вам же не язык нужен, а факт существования?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984549
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Внезапно никаких проверок на композиты, и прочую фигню, тупо пара байт по заданному смещению.
Внезапно, но char в java это 16-разрядный код, а не графема полного юникода и уж тем более не глиф.
Именно по этой причине в NIO (java 1.4+) существует CharSequence и "вот это вот всё".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984556
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
mayton
Попробуй полазить по немецким сайтам и посмотреть как отдается веб-содержимое. Найдешь хоть один комбо-символ?
Я, вообще-то, специально цеплял скриншот. Сайт, правда, на русском, но вам же не язык нужен, а факт существования?

Я не сомневаюсь что комбо существует.

Я говорю - если мы возьмём 100 немецких сайтов, и 97 из них не используют комбо - то я делаю вывод что практика их применения настолько редка, что ей можно пренебречь.

Именно это я хотел сказать Петраву.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984563
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А некоторые советуют размещать ветки в порядке возрастания значений. Это, якобы, позволяет
компилятору генерировать более оптимизированный код...
По идее, если после обработки каждой метки стоит break, то у компилятора есть шанс догадаться отсортировать их в порядке возрастания.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984594
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
SQL2008, кто тебе сказал такую глупость? :)

Существует определенный сложившийся стиль написания кода.
Разумеется никто не запрещает писать "через задницу", а нормальный текст назвать глупостью.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984595
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
SQL2008, кто тебе сказал такую глупость? :)

Давайте вернемся к коду
Итак, какой смысл в данном случае имеет оператор default?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984604
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008,

22172656
boobyСтартовый код прост как палка: для набора значений, известных как "хорошие случаи" просто goto на метку return True.
Иначе провести доп проверку (с побочным действием) и решить - true оно return или нет.

Если вы переместите default в конец, то либо увеличите число выходов из функции, ухудшив и читаемость и её размер, либо
если еще захотите структурированного "единственного выхода", добавите переменных для хранения возвращаемого результата.
Код в любом случае ухудшится и для чтения и для компиляции.
А в своем исходном виде он легко читается и компактно компилируется.

2Basil A. Sidorov
в интерфейсе строки в java есть работа с codepoints.
Нормальная в смысле возврата int в качестве значения

Но подозреваю, что там может оказаться подстава.
В том смысле, что у меня нет уверенности, что ява-строки умеют работать с набором кодовых плоскостей в одной строке.
Надо смотреть реализацию.
Если у кого-то есть ссылки на актуальные исходники, например для 8-ки, бросьте пожалуйста ссылку в этот топик.
Глянуть может быть и интересно было бы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984608
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008, ассемблер осилишь или транслировать в "ыудусе"? 22170869
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984609
ВсеРазумный
Есть возможно контралировать. И вот тут как раз придуман goto array pointer, что бы не иметь миллион else - if

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int SwitchElseIf(int i, int r){
   static const void*Pointers[4] = {&&case0, &&case1, &&case2, &&case3};

goto *Pointers[i];
    case0: 
        return CaseCall1(i, r);
    case1:
        return CaseCall2(i, r);
    case2: 
        return CaseCall3(i, r);
    case3: 
        return CaseCall4(i, r);
}





На выходе мы получаем красивый код Прыжка Адресации
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  jmp [DWORD PTR SwitchElseIf(int, int)::Pointers[0+eax*4]]
.L10:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall4(int, int)
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall3(int, int)
.L8:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall2(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall1(int, int)


А сравнить с другими вариантами, где case 2 выше всех, например?
Вы таки утверждаете, что в асме всегда будет "по-своему" отсортированный код и там не учтутся предпочтения программиста в упорядочивании поиска?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984621
Алексей Роза,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 1: return 20;
        default:
            return 100;
        case 0: return 10;
        case 2: return 70;
        case 3: return 40;
        case 4: return 50;
    }
}



=>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
GetSwitchHashIndex(int):
  mov edx, DWORD PTR [esp+4]
  mov eax, 100
  cmp edx, 4
  ja .L1
  mov eax, DWORD PTR CSWTCH.2[0+edx*4]
.L1:
  ret




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 0: return 10;
        default:
            return 100;
        case 1: return 20;
        case 2: return 70;
        case 3: return 40;
        case 4: return 50;
    }
}



=>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
GetSwitchHashIndex(int):
  mov edx, DWORD PTR [esp+4]
  mov eax, 100
  cmp edx, 4
  ja .L1
  mov eax, DWORD PTR CSWTCH.2[0+edx*4]
.L1:
  ret




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 0: return 10;
        case 1: return 20;
        case 2: return 70;
        case 3: return 40;
        case 4: return 50;
        default:
            return 100;
    }



=>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
GetSwitchHashIndex(int):
  mov edx, DWORD PTR [esp+4]
  mov eax, 100
  cmp edx, 4
  ja .L1
  mov eax, DWORD PTR CSWTCH.2[0+edx*4]
.L1:
  ret




Код: plaintext
1.
2.
3.
4.
5.
6.
CSWTCH.2:
  .long 10
  .long 20
  .long 70
  .long 40
  .long 50





В таком случае, в котором ты написал default выше... Ему всё равно где он стоит


Тоже самое но с switch - else - if

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int SwitchElseIf(int i, int r){
  switch(i) {    
        case 1:
            return CaseCall2(i, r);
        default:
            return 100;
        case 0: 
            return CaseCall1(i, r);
        case 2: 
            return CaseCall3(i, r);
        case 3: 
            return CaseCall4(i, r);
    }
}



=>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L7
  jg .L8
  test eax, eax
  je .L9
  cmp eax, 1
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L8:
  cmp eax, 3
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L6:
  mov eax, 100
  ret
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int SwitchElseIf(int i, int r){
  switch(i) { 
        case 0: 
            return CaseCall1(i, r);
        default:
            return 100;
        case 1:
            return CaseCall2(i, r);
        case 2: 
            return CaseCall3(i, r);
        case 3: 
            return CaseCall4(i, r);
    }
}



=>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L7
  jg .L8
  test eax, eax
  je .L9
  cmp eax, 1
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L8:
  cmp eax, 3
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L6:
  mov eax, 100
  ret
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int SwitchElseIf(int i, int r){
  switch(i) { 
        case 0: 
            return CaseCall1(i, r);
        case 1:
            return CaseCall2(i, r);
        case 2: 
            return CaseCall3(i, r);
        case 3: 
            return CaseCall4(i, r);
        default:
            return 100;
    }
}



=>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L7
  jg .L8
  test eax, eax
  je .L9
  cmp eax, 1
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L8:
  cmp eax, 3
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L6:
  mov eax, 100
  ret
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int SwitchElseIf(int i, int r){
  switch(i) { 
        default:
            return 100;
        case 0: 
            return CaseCall1(i, r);
        case 1:
            return CaseCall2(i, r);
        case 2: 
            return CaseCall3(i, r);
        case 3: 
            return CaseCall4(i, r);
    }
}



=>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L7
  jg .L8
  test eax, eax
  je .L9
  cmp eax, 1
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L8:
  cmp eax, 3
  jne .L6
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L6:
  mov eax, 100
  ret
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)






То есть теперь, глядя на это... Можно смело покрутить у виска человеку, который говорит что расположение DEFAULT в коде влияет на что - то.


И вроде ты просил поменять ещё сторонами goto array

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int SwitchElseIf(int i, int r){
   static const void*Pointers[4] = {&&case0, &&case1, &&case2, &&case3};

goto *Pointers[i];
    case2: 
        return CaseCall3(i, r);
    case0: 
        return CaseCall1(i, r);
    case1:
        return CaseCall2(i, r);
    case3: 
        return CaseCall4(i, r);
}



=>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  jmp [DWORD PTR SwitchElseIf(int, int)::Pointers[0+eax*4]]
.L10:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall4(int, int)
.L9:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall2(int, int)
.L8:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall1(int, int)
.L7:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], eax
  jmp CaseCall3(int, int)




Сохранил свой порядок
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984623
booby
Если вы переместите default в конец, то либо увеличите число выходов из функции, ухудшив и читаемость и её размер, либо...


rdb_dev
SQL2008, ассемблер осилишь или транслировать в "ыудусе"? 22170869


Компилятор не глупый. Давайте посмотрим что он на деле сделает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
bool testSwitch()
{
    char ch = 'c'; // Или 'a', например.
    char str[] = "bcd";
    char *ptr = nullptr;
    int count = 0;

    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }

    return true;
}






Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
testSwitch():
  sub esp, 36
  mov DWORD PTR [esp+20], 6579042
  push 99
  lea eax, [esp+24]
  push eax
  call strchr
  test eax, eax
  setne al
  add esp, 44
  ret



Никто не был прав) Потому что код - говнокод без логики
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984628
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный

... код - говнокод без логики

зачем же делать глупость , компилируя его?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984634
booby
ВсеРазумный

... код - говнокод без логики

зачем же делать глупость , компилируя его?


Что бы показать что он делает на данный момент. А делает он это, как раз таки не с проста.

Прошу обратить внимания на
Код: plaintext
1.
 switch (ch)



А мы помним что
Код: plaintext
1.
char ch = 'c'; 



И компилятор это знает.

А значит он просто берёт, вырезает всё до - того, что будет использовано вообще в коде..

Таким образом, мы должны обмануть компилятор, и сказать что ты ничего не знаешь, вот таким образом
Код: plaintext
1.
switch (ptr[0]) {



И переписать код, вот таким образом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
bool testSwitch()
{
    char ch = 'c'; // Или 'a', например.
    char str[] = "bcd";
    char *ptr = str;

    while(((ptr = strchr(ptr, ch)) != nullptr)) {
        switch (ptr[0]) {
            case '\0':
            case 'e':
            case 'f':
            case 'g':
                return false;
        }
    }

    return true;
}




И тогда мы увидим наш asm в виде switch else - if
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
testSwitch():
  sub esp, 28
  mov DWORD PTR [esp+12], 6579042
  lea eax, [esp+12]
.L3:
  sub esp, 8
  push 99
  push eax
  call strchr
  add esp, 16
  test eax, eax
  je .L4
  movzx edx, BYTE PTR [eax]
  test dl, dl
  je .L5
  sub edx, 101
  cmp dl, 2
  ja .L3
.L5:
  xor eax, eax
  add esp, 28
  ret
.L4:
  mov eax, 1
  add esp, 28
  ret

...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984645
ВсеРазумный
То есть теперь, глядя на это... Можно смело покрутить у виска человеку, который говорит что расположение DEFAULT в коде влияет на что - то.

ну вообще default то можно всегда в конец ставить, его место там.
но вот то что перемещение case никак не меняет асм - это странно конечно...
Может потому что мало значений и они типа в кеше помещаются?
Реально пробегать по всему циклу из миллиона значений это какая-то дичь

А если if/elseif/else ?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984649
Алексей Роза
Может потому что мало значений и они типа в кеше помещаются?


Неа..Как Я говорил раньше, компилятор не глупый... Так что да, он их сам сортирует как ему лучше будет использовать код.

Это в 2020г называется - оптимизацией.

Алексей Роза

Реально пробегать по всему циклу из миллиона значений это какая-то дичь

А если if/elseif/else ?


Если ты напишешь elseif конструкцию. То она будет аналогично со switch и это во всех компиляторах так... Включая Delphi и так далее.

Что бы реально избавиться от этой конструкции, надо использовать goto array pointer
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Если у кого-то есть ссылки на актуальные исходники, например для 8-ки, бросьте пожалуйста ссылку в этот топик.
Глянуть может быть и интересно было бы.

Я поищу в том-же OpenJDK бранч или тег с которого релизилась восьмерка. И можно даже
посмотреть какие были сделаны изменения в HEAD ревизии за прошедшие лет 6.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984653
Алексей Роза,

Компилятор создал дубликат функции

https://godbolt.org/z/zGEb7q

Он понял что ничем не отличается код
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984668
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
ElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 1
  je .L11
  test eax, eax
  je .L12
  cmp eax, 2
  je .L13
  cmp eax, 3
  jne .L10
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L12:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)
.L11:
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L10:
  mov eax, 100
  ret
.L13:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)


SwitchElseIf(int, int):
  mov eax, DWORD PTR [esp+4]
  mov edx, DWORD PTR [esp+8]
  cmp eax, 2
  je .L15
  jg .L16
  test eax, eax
  je .L17
  cmp eax, 1
  jne .L14
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 1
  jmp CaseCall2(int, int)
.L16:
  cmp eax, 3
  jne .L14
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 3
  jmp CaseCall4(int, int)
.L15:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 2
  jmp CaseCall3(int, int)
.L14:
  mov eax, 100
  ret
.L17:
  mov DWORD PTR [esp+8], edx
  mov DWORD PTR [esp+4], 0
  jmp CaseCall1(int, int)



Чёт прожал и не заметил

Там везде по = ровно было
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984670
ВсеРазумный
Неа..Как Я говорил раньше, компилятор не глупый... Так что да, он их сам сортирует как ему лучше будет использовать код.

Это в 2020г называется - оптимизацией.

ок, спрошу по-другому: а почему он ЭТО считает оптимизированным кодом?
Почему перебирать миллион значений каждый раз - это оптимально?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984674
Алексей Роза,

Потому что это универсально.

К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором)

И как ты хочешь, что бы он оптимизировал код, не перебирая ? Ну допустим он возьмёт "1,2,3" и запишет их как goto array pointer
А остальные "8343, 9453, 88667" ему всё равно придётся перепроверить через else-if]


Вот так и выходит, что изначально так и было сделано.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984676
Алексей Роза,

Вот кстати подтверждения, если раньше мы получали извлечение из массива

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 0: return 10;
        case 1: return 20;
        case 55674: return 70;
        case 3453: return 40;
        case 55675: return 50;
    }
}



Но если нарушить порядок, и сделать большие цифры. То мы получим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 mov eax, DWORD PTR [esp+4]
  cmp eax, 3453
  je .L9
  jle .L12
  cmp eax, 55674
  mov edx, 70
  mov eax, 50
  cmove eax, edx
  ret
.L12:
  cmp eax, 1
  sbb eax, eax
  and eax, -10
  add eax, 20
  ret
.L9:
  mov eax, 40
  ret
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984677
блин, а что это у вас такое
авторif (i = 1)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984678
ВсеРазумный
К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором)

да не надо мне их сортировать
я знаю, что 8343 случается в 10 раз чаще, и поставил его вперёд.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984680
Алексей Роза,

При этом, если радиус небольшой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 0: return 10;
        case 1: return 20;
        case 2: return 70;
        case 4: return 40;
        case 8: return 50;
    }
}



после 2 сразу 4 и потом 8 то он увеличивает табоицу массива
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
GetSwitchHashIndex(int):
  mov eax, DWORD PTR [esp+4]
  jmp [DWORD PTR .L9[0+eax*4]]
.L9:
  .long .L13
  .long .L12
  .long .L14
  .long .L8
  .long .L10
  .long .L8
  .long .L8
  .long .L8
  .long .L8
.L10:
  mov eax, 40
  ret
.L14:
  mov eax, 70
  ret
.L13:
  mov eax, 10
  ret
.L8:
  mov eax, 50
  ret
.L12:
  mov eax, 20
  ret





И вот это как раз тот самый случай Goto array to pointer


В таком случае оно работает
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984681
Алексей Роза
ВсеРазумный
К примеру у тебя есть "1, 2, 3, 8343, 9453, 88667" (Уже отсортированный компилятором)

да не надо мне их сортировать
я знаю, что 8343 случается в 10 раз чаще, и поставил его вперёд.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int GetSwitchHashIndex(int i){
  switch(i)
    {
        case 55675: return 50;
        case 0: return 10;
        case 1: return 20;
        case 55674: return 70;
        case 3453: return 40;
    }
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
GetSwitchHashIndex(int):
  mov eax, DWORD PTR [esp+4]
  cmp eax, 3453
  je .L9
  jle .L12
  cmp eax, 55674
  mov edx, 70
  mov eax, 50
  cmove eax, edx
  ret
.L12:
  cmp eax, 1
  sbb eax, eax
  and eax, -10
  add eax, 20
  ret
.L9:
  mov eax, 40
  ret



Компилятор сам знает. ASM не поменялся, от того что ты поставил выше Ручками.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984683
вот норм порядок и безо всякой компиляторской отсебятины
https://godbolt.org/z/P1Mzxn
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984685
и странно, что "умный компилятор" просто 52 не оставил, ведь там константа в compile-time
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984686
Алексей Роза
и странно, что "умный компилятор" просто 52 не оставил, ведь там константа в compile-time


Она же не inline функция, что бы таким баловаться.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984694
Алексей Роза,

Глянул что там у тебя.

Кстати, умный компилятор Пошёл дальше. И увидел что функция никак не используется. Ничего полезного не делает. И по этому
Код: plaintext
1.
2.
3.
main:
  xor eax, eax
  ret



Пустая процедура main

Код: plaintext
1.
2.
3.
4.
5.
int main()
{
int z = ElseIf(52);
std::cout << z << "!\n";
}




Код: plaintext
1.
2.
  push 52
  call ElseIf(int)



Однако сё работает.

Код: plaintext
1.
int inline ElseIf(int i){



Код: plaintext
1.
2.
3.
4.
5.
  push ecx
  sub esp, 12
  push 57
  push OFFSET FLAT:_ZSt4cout
  call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984706
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
У Кернигана можно найти упоминание о том, произвольность местоположения default была выбрана сознательно ,
в расчете на то, что при возникновении необходимости дописывать что-то в существующий switch,
корпоративные программисты хотели бы и будут размещать новые ветки ниже уже существующих,
а не произвольным образом втыкивать их между старыми, превращая старый код в неузнаваемый.

А куда втискивать новые CASE программистам, которые кодят после программистов, которые уже втыкнули свой код после default?
Мне кажется, что вы просто глумитесь
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984735
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть проще для логики кодо-генерации. Открыть оператор switch() и сразу
бросить дефолтную секцию и потом уже дописывать кейсы по мере поступления
фактов. Как опциональные аргументы. Минус 1 переменная в генераторе.

И по поводу количественных limitations. Тоже ведь никто не гарантирует что код на "C"
писал человек. Вполне может быть продукт biacc/byzon/antlr/Zubr генерации.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тупанул. Зачем качать когда и так онлайн доступно.

Вобщем вот так лучше

Актуальная версия.

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/lang/String.java

Версия примерно по релизному тегу JDK-8-b120

https://github.com/openjdk/jdk/blob/9a9add8825a040565051a09010b29b099c2e7d49/jdk/src/share/classes/java/lang/String.java
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984926
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
#include <cstdlib>
#include <cstring>
#include <stdio.h>

using namespace std;

  template <typename T>
  inline __attribute__((always_inline))
  void volatilize(T && ref)
  {
    asm volatile (";\n" : "=m"(ref) : "m"(ref) : );
  }

bool testSwitch
    (
      char   ch,
      int  & count
    )
    noexcept
{
  static const char * str = "abracadabra";
  char * ptr;

  switch (ch)
  {
  default:
    if (nullptr == (ptr = strchr(str, ch)))
  case '\0':
  case 'f':
  case 'j':
  case 's':
      return false;
    else
      count++;
    break;
  }
  return true;
}

int main(int argc, char** argv)
{
  char ch = 'a';
  int count = 0;

  volatilize(ch);
  printf
      (
        "\r\ncount : %i, testSwitch() == %s",
        count,
        testSwitch(ch, count) ? "true" : "false"
      );

  return 0;
}

g++ -m64 -O3 -S -c -std=c++11
(g++.exe (Rev2, Built by MSYS2 project) 9.2.0)

Судя по генерируемому коду, оптимизатор C++ пытается уменьшить количество инструкций перехода. Поэтому в результате получается откровенный маразм, больше похожий на работу какого-нибудь обфускатора.
результат
Код: asm
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
  .section .rdata,"dr"
.LC0:
  .ascii "abracadabra\0"
  .text
  .p2align 4
  .globl	_Z10testSwitchcRi
  .def	_Z10testSwitchcRi;	.scl	2;	.type	32;	.endef
  .seh_proc	_Z10testSwitchcRi
_Z10testSwitchcRi:
.LFB92:
  pushq	%rbx
  .seh_pushreg	%rbx
  subq	$32, %rsp
  .seh_stackalloc	32
  .seh_endprologue
  movl	%ecx, %eax
  movq	%rdx, %rbx
  testb	%cl, %cl
  je	.L8
  leal	-102(%rcx), %ecx
  cmpb	$13, %cl
  ja	.L5
  movl	$1, %edx
  xorl	%r8d, %r8d
  salq	%cl, %rdx
  testl	$8209, %edx
  jne	.L3
.L5:
  movsbl	%al, %edx
  leaq	.LC0(%rip), %rcx
  call	strchr
  testq	%rax, %rax
  je	.L8
  addl	$1, (%rbx)
  movl	$1, %r8d
.L3:
  movl	%r8d, %eax
  addq	$32, %rsp
  popq	%rbx
  ret
  .p2align 4,,10
  .p2align 3
.L8:
  xorl	%r8d, %r8d
  movl	%r8d, %eax
  addq	$32, %rsp
  popq	%rbx
  ret
  .seh_endproc

...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984936
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devСудя по генерируемому коду, оптимизатор C++ пытается уменьшить количество инструкций перехода.

Ну ты же сам ему сказал оптимизировать на скорость, а переходы плохо сочетаются со
спекулятивным выполнением в процессорах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984938
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Давно известно, что машинные оптимизаторы/генераторы далеки от совершенства.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984942
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

спасибо за ссылки.
Я так понимаю, что кишки у новой версии от 9ки тянутся.
В 8ке, в более поздних релизах, возможно, она тоже подтянута.
Актуальная версия, как база, годится для реализации любого типа кодировки и представления строки.

Впечатление у меня такое:
Понятно, что когда-то начиналось с того, что сейчас называют UCS-2.
Потом долепились составные символы и получился UTF-16.
Так как составные символы "практически никому не нужны" и "интерфейс charAt трогать нельзя",
то работа с кодепойнтами прилепилась нашлепкой - "если кому надо, за практическую константу со всем разберутся".

Встретил упоминание занятного документационного бага - исходный код обманка, показывающая "как оно было бы",
если бы на самом деле реализовывалось на java.
Кто-то раскопал, что в каких-то местах исходный код не соответствует работе фактически используемых интризиков, и "хорошо бы поправить".
Не знаю, стали исправлять исходник или нет, лень искать регистрацию этого бага...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984967
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шипилев ЕМНИП где-то рассказывал зачем нужен код-обманка но честно говоря я не очень запомнил.

Кажется в его докладах по Lord Of String. Или что-то в этом роде.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984981
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ну ты же сам ему сказал оптимизировать на скорость, а переходы плохо сочетаются со
спекулятивным выполнением в процессорах.
Я бы использовал
Код: sql
1.
2.
movq $4, %rcx
repne scasb

а дальше хоть по test rcx, rcx , хоть по таблице переходов.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devrepne scasb

Эта конструкция в современных процессорах существует только для взад совместимости и
тормозит как последний слоупок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39984997
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, есть ещё не менее простой способ:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
xor %rdx,%rdx
xor %rax,%rax
cmp %cl,'\0'
sete %rax
add %rax,rdx
cmp %cl,'f'
sete %rax
add %rax,rdx
cmp %cl,'j'
sete %rax
add %rax,rdx
cmp %cl,'s'
sete %rax
add %rax,rdx
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985112
rdb_dev,

А есть ещё проще и лучше И быстрее И качественнее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
bool testSwitch
    (
      char   ch,
      int  & count
    )
    noexcept
{
  static const void*Base[] = {&&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t,
    &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t, &&t};
    
  Base['\0'] = &&f;  
  Base['f'] = &&f;
  Base['j'] = &&f;
  Base['s'] = &&f;
  goto *Base[ch]; 
f:
  return false;
t:
  static const char * str = "abracadabra";

  bool is = nullptr != strchr((char*)str, ch);
  
  if (is)
        count++;

  return is;
}




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
testSwitch(char, int&):
  push rbx
  mov rbx, rsi
  movsx esi, dil
  movsx rdi, dil
  mov QWORD PTR testSwitch(char, int&)::Base[rip], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+816], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+848], OFFSET FLAT:.L2
  mov QWORD PTR testSwitch(char, int&)::Base[rip+920], OFFSET FLAT:.L2
  jmp [QWORD PTR testSwitch(char, int&)::Base[0+rdi*8]]
.L4:
  mov edi, OFFSET FLAT:.LC0
  call strchr
  mov r8, rax
  xor eax, eax
  test r8, r8
  je .L1
  add DWORD PTR [rbx], 1
  mov eax, 1
.L1:
  pop rbx
  ret
.L2:
  xor eax, eax
  pop rbx
  ret



Ты скажешь, чел, но тут много mov. А я тебе скажу, если тебе надо заполнить таблицу не 256 символами, а юникодом 65535 то MOV будет столько же. Но при этом скорость извлечение 65535 - 1 элемента будет ровна извлечению 1 символа. Что быстро в 65535 раз.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985141
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Впечатление у меня такое:
Понятно, что когда-то начиналось с того, что сейчас называют UCS-2.
Потом долепились составные символы и получился UTF-16.
Так как составные символы "практически никому не нужны" и "интерфейс charAt трогать нельзя",
то работа с кодепойнтами прилепилась нашлепкой - "если кому надо, за практическую константу со всем разберутся".

Конечно, скорее всего так и происходило. И не только с Явой, но с QString, WinApi, C# и т.д.

Это как раз то, о чём я и спорю на этом форуме. В развитых языках программирования существует простой способ работы с Unicode в формате utf-16 без учёта составных символов. И для большинства европейских программистов это нормально и правильно. Но когда я начинаю защищать "wchar_t" свидетели секты utf-8 начинают во все стороны извергать религиозный гнев и кричать, что "wchar_t" — это грехопадение, а истинно правильный только utf-8.

При этом сектанты кричат, что Петрав не понимает простейших вещей, что он зашоренный, что там какие-то великие умляуты и декомпозиция без которой вообще жизни нет, что длинна строки не нужна и индексация тоже и т.д. Ярко наблюдаемый религиозный экстаз во всю ширь и высь.

Но сами сектанты программируют на QString, Java и JavaScript — где есть индексация и strlen(). Где тот-же самый "wchar_t". А мне предлагают использовать utf-8 для которого нет API в C++ и отказаться от wchar_t для которого API в C++ есть.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985145
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java тащит на себе груз обратной совместимости. И UTF-16 и модифицированный UTF-8 - это всё "грехи" этого груза.
Да, ПетрАВ вправе "себе любимому" изготовить библиотеку для UTF-16 или даже для UCS-2. Для его личных целей это будет "норм".
Вот только "А ты не путай свою шерсть с государственной".
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985147
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Java тащит на себе груз обратной совместимости. И UTF-16 и модифицированный UTF-8 - это всё "грехи" этого груза.
Да, ПетрАВ вправе "себе любимому" изготовить библиотеку для UTF-16 или даже для UCS-2. Для его личных целей это будет "норм".
Вот только "А ты не путай свою шерсть с государственной".

Груз совместимости? Наверное, ты можешь дать ссылку где хотя бы рекомендуется воспринимать "charAt()" как deprecated.

PS: Интересно, почему ты решил, что это аббревиатура и она именно такая? Просто интересно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985158
rdb_dev,

Вот Она Мощь GCC 10.2 Про которую Я писал. Сам, взял, и сделал goto array pointer

https://godbolt.org/z/zT6nG3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <iostream>


using namespace std;

bool testSwitch(int   ch, int  & count) {
    static const char * str = "abracadabra";
  switch (ch)
  {
  default:
    if (nullptr ==strchr((char*)str, ch))
    case '\0':
    case 'q': 
    case 'i': 
    case 'l': 
    case 'x': 
    case '5': 
    case '1':
    case 'H':
    case 'X':
    case 'Z':
    case 'O':
    case 'P':
      return false;
    else
      count++;
    break;
  }
  return true;
}
 




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
.LC0:
  .string "abracadabra"
testSwitch(int, int&):
  test edi, edi
  je .L5
  lea eax, [rdi-49]
  push rbx
  mov rbx, rsi
  cmp eax, 71
  ja .L3
  jmp [QWORD PTR .L4[0+rax*8]]
.L4:
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L3
  .quad .L7
.L3:
  mov esi, edi
  mov edi, OFFSET FLAT:.LC0
  call strchr
  test rax, rax
  je .L7
  add DWORD PTR [rbx], 1
  mov eax, 1
  pop rbx
  ret
.L7:
  xor eax, eax
  pop rbx
  ret
.L5:
  xor eax, eax
  ret
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985180
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

попробую изложить то, что думаю, хотя мне сама идея что-то излагать не очень нравится.

Вы спрашивали про промышленный код.
Я считаю, что о промышленном коде речь идет всякий раз тогда, когда программист автоматически, не задумываясь тянется к "библиотечному коду", что бы это ни значило.
В этом смысле я сам "промышленный программист", и у меня в целом нет задачи задумываться
об адекватности используемого "библиотечного кода".

Про 16, 8 и прочие строки.
(Как промышленный программист, да ещё и пишущий на бейсике)
Строки для "обычного" программиста это то, что предоставляет либо "стандартная библиотека",
либо конкретная система, в своих кишках имеющая некоторое "стандартное" представление, что такое "строки" в памяти системы и как с ними работать.
Насколько я понимаю, Windows и iOS за строки именно utf-16 считают, а Linux оперирует с utf-8. Поэтому те кто давит за utf-8 просто рассказывает, что вы неудачник, если
программируете для ios или windows. Здесь белые нитки по всему чёрному полю.

Дальше все просто - хотите бесшовно обмениваться с системой "строками", располагайте такой "библиотечной реализацией", которая сможет это сделать без применения дополнительных преобразований.
Иначе такое взаимодействием будет облагаться налогом на преобразование.

С одной стороны, нельзя единственной "библиотечной" реализацией покрыть вообще все
возможные потребности, в контексте которых возникает термин "строки".
С другой, за построение "стандартной строки", при использовании "системных функций" налог все равно платится, если система работает с utf-16 как внутренним представлением в памяти и источником для построения строк является файл, например
(файлы с такой кодировкой практически не используются).
С другой стороны, счастливая жизнь в другой системе заканчивается, когда какой-то враг
подсовывает этой другой системе файл в кодировке, отличной от utf-8.
Очевидно, что такой враг должен быть проклят вместе со своим файлом.

Касательно wchar_t есть мутные моменты - зачем-то он заявлен платформно-зависимым.
Как точно думали об этом те, кто так сделал, не представляю.
Как не представляю, прилетит ли на самом деле какая-нибудь подстава с этой стороны тем, кто на этот тип положился.

В общем, то, что я хотел сказать состоит в том, что, может быть, это большое везение, что c++ так до с их пор и не обзавелся единым и закостенелым представлением о том, что такое строки и как с ними жить.
Конечно, это кустарщина, а не "промышленное программирование", но зато ты предупрежден
о том, что это твое дело, решать - что ты будешь в своих задачах принимать за "строки",
и как с ними обходиться.
Это не делает богом, но даёт возможность обжигать горшки.

Что касается строк с целью "интернационализации", была такая компания ICU, выпускавшая библиотеки, обеспечивающие работу со всеми видами юникодных кодировок.
Сейчас она принадлежит IBM, и уже с маркировкой от IMB выпуск таких библиотек для явы и си продолжается.
Если нужен (любой) юникод - бери используй, грубо насмехаясь над теми, кто этого не
делает (для utf-16, кажется, там именно wchar_t в качестве "символа")

// http://site.icu-project.org/
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985184
Unicode = evil.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
In this article I’ll fill you in on exactly what every working programmer should know. All that stuff about "plain text = ascii = characters are 8 bits" it’s hopelessly wrong.

Some people are under the misconception that Unicode is simply a 16-bit code where each character takes 16 bits and therefore there are 65,536 possible characters.
This is not, actually, correct. It is the single most common myth about Unicode, so if you thought that, don’t feel bad.

Until now, we’ve assumed that a letter maps to some bits which you can store on disk or in memory:
A -> 0100 0001 // 65 (hex:41)

Every platonic letter in every alphabet is assigned a magic number by the Unicode consortium which is written like this: U+0639.  This magic number is called a code point.
The U+ means "Unicode" and the numbers are hexadecimal. U+0639 is the Arabic letter Ain. The English letter A would be U+0041.
You can find them all using the charmap utility on Windows 2000/XP or visiting the Unicode web site. // http://www.unicode.org/

# РАЗНИЦА МЕЖДУ high-endian & low-endian в том, КАК читать слово "Hello"
// так:
00 48 00 65 00 6C 00 6C 00 6F   // high
// или так:
48 00 65 00 6C 00 6C 00 6F 00   // low
// разные CPU имеют разную скорость обработки
в начало каждой Unicode-строки кладутся 2 байта (Unicode Byte Order Mark): FE+FF (hiend) или FF+FE (loend) // http://www.unicode.org/faq/utf_bom.html
if you are swapping your high and low bytes it will look like a FF+FE and the person reading your string will know that they have to swap every other byte.
(НЕТ, не каждой! Not every Unicode string in the wild has a byte order mark at the beginning).
// в utf-8 НЕТ этих индейцев: There are no byte-order/endianness issues, since UTF-8 data is a byte stream.


тынц
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985185
Unicode vs UTF
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Using UCS-2 (or UCS-4) under Unix would lead to very severe problems. Strings with these encodings can contain as parts of many wide characters bytes like "\0" or "/" which have a special
meaning in filenames and other C library function params. In addition, the majority of UNIX tools expects ASCII files and cannot read 16-bit words as characters without major modifications.
For these reasons, UCS-2 is not a suitable external encoding of Unicode in filenames, text files, environment variables, etc.

The UTF-8 encoding defined in ISO 10646-1:2000 Annex D and also described in RFC 3629 as well as section 3.9 of the Unicode 4.0 standard does not have these problems.
It is clearly the way to go for using Unicode under Unix-style operating systems.

// UTF-8 has the following properties:
1. UCS characters U+0000 to U+007F (ASCII) are encoded simply as bytes 0x00 to 0x7F (ASCII compatibility).
    This means that files and strings which contain only 7-bit ASCII characters have the same encoding under both ASCII and UTF-8.
2. All UCS characters >U+007F are encoded as a sequence of several bytes, each of which has the most significant bit set.
    Therefore, no ASCII byte (0x00-0x7F) can appear as part of any other character.
3. The first byte of a multibyte sequence that represents a non-ASCII character is always in the range 0xC0 to 0xFD and it indicates how many bytes follow for this character.
    All further bytes in a multibyte sequence are in the range 0x80 to 0xBF. This allows easy resynchronization and makes the encoding stateless and robust against missing bytes.
4. All possible 2^31 UCS codes can be encoded.
5. UTF-8 encoded characters may theoretically be up to six bytes long, however 16-bit BMP characters are only up to three bytes long.
6. The sorting order of Bigendian UCS-4 byte strings is preserved.
7. The bytes 0xFE and 0xFF are never used in the UTF-8 encoding (little/big Endian).

// Examples: The Unicode character U+00A9 = 1010 1001 (copyright sign) is encoded in UTF-8 as
    11000010 10101001 = 0xC2 0xA9
// and character U+2260 = 0010 0010 0110 0000 (not equal to) is encoded as:
    11100010 10001001 10100000 = 0xE2 0x89 0xA0

The official name and spelling of this encoding is UTF-8, where UTF stands for UCS Transformation Format.
Please do not write UTF-8 in any documentation text in other ways (such as utf8 or UTF_8), unless of course you refer to a variable name and not the encoding itself.

An important note for developers of UTF-8 decoding routines: For security reasons, a UTF-8 decoder must not accept UTF-8 sequences that are longer than necessary to encode a character.
For example, the character U+000A (line feed) must be accepted from a UTF-8 stream only in the form 0x0A, but not in any of the following five possible overlong forms:
  0xC0 0x8A
  0xE0 0x80 0x8A
  0xF0 0x80 0x80 0x8A
  0xF8 0x80 0x80 0x80 0x8A
  0xFC 0x80 0x80 0x80 0x80 0x8A


wchar_t следует избегать практически во всех случаях (кроме тех, когда происходит взаимодействие с Windows API).
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985186
однако в C++ довольно странное превращение из utf-8 в utf-16, которое всё равно выливается в wchar_t...
https://stackoverflow.com/questions/7153935/how-to-convert-utf-8-stdstring-to-utf-16-stdwstring
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985206
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, четыре кэшлайна ради четырёх символов? Что-то я не уверен в оптимальности решения.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985209
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
где хотя бы рекомендуется воспринимать "charAt()" как deprecated
А каким боком "тащим груз обратной совместимости" и аннотация @deprecated??? Тем более, что UTF-16 внутри строк это следствие контракта, заявляющего, что charAt() имеет константную сложность, а вовсе не потому, что UTF-16 "лучше" UTF-8.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985227
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
rdb_devrepne scasb
Эта конструкция в современных процессорах существует только для взад совместимости и тормозит как последний слоупок.Глянул задержки, на каждый операнд в памяти они сравнимы с регистровым вращением через флаг переноса. 4 байта * 4 такта = 16 тактов - как один MUL.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985229
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
petrav
где хотя бы рекомендуется воспринимать "charAt()" как deprecated
А каким боком "тащим груз обратной совместимости" и аннотация @deprecated??? Тем более, что UTF-16 внутри строк это следствие контракта, заявляющего, что charAt() имеет константную сложность, а вовсе не потому, что UTF-16 "лучше" UTF-8.

Ну если это груз совместимости, то следовало бы написать в документации: "charAt()" считается устаревшим, не рекомендуется к использованию, вот вам итератор по символам. И так во всех книгах по Яве. Ведь utf-8 это круче, нужно готовить подрастающее поколение. Вот в Qt5 поступили по-взрослому: раз и кодировка по умолчанию utf-8 и это не обсуждается (не настраивается).

Кстати, а не подскажешь итератор по символам в Яве, который даёт доступ к четырёх байтовым символам? Если не сложно пример кода.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985239
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Насколько я понимаю, Windows и iOS за строки именно utf-16 считают, а Linux оперирует с utf-8. Поэтому те кто давит за utf-8 просто рассказывает, что вы неудачник, если
программируете для ios или windows. Здесь белые нитки по всему чёрному полю.

Я скажу во первых что - ничего подобного. Наш разговор распался на 2 бранча еще давно. Одна
часть - это интернационализация, сериализация и стандарты текстовых файлов и интернета.

И другая часть - это внутренняя форма представления строк в API вызовах конкретной операционной
системы. И наш технический спор - спор очень многосторонний и многогранный часто переходит
границы этих бранчей. Мы прыгаем то на одну тему то на другую.

Моя идея о том что строка это не массив а Stream<Char> это вообще философская идея от итераторов
и ФП и я ее продолжаю отстаивать как свое видение будущего для всех строковых типов данных
всех языков.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985259
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Не имеет значения, на что распался разговор.
Где switch и где итераторы...

исключительно в плане уточнения - правильно ли я понимаю, что сейчас вы называете итераторами то, что C++ называет итераторами, и не подразумеваете итераторов в java?

То что ты говоришь про итераторы - здорово.
Но поворачивает на несколько страниц назад.
Итератор, вероятно, должен уметь указывать на/возвращать символ.
А символ-то, в конце концов, это кто?

И вообще - сама строка состоит ли из символов или символ извлекается из неё, но неизвестно, из чего она там состоит?

В этом месте в utf-16 мы с разбегу утыкаемся лбом в грабли, брошенные со времен ucs-2
со строгими приговором - не сметь трогать charat.
Что бы вы ни думали там себе про символы - получите в качестве такового именно, что
вернет charat, или пользуйтесь дописанным после default новым интерфейсом.

От дырки во лбу спасают только заговоры - "да никогда в жизни вы своим кодом не упретесь ни в какие композиционный символы, поэтому фактически нигде никакой ваш код не сломается, если вы используете только charAt".

Может и правда оно так. Но в этом месте желательно хотя бы сознательно понимать, что ты для себя автоматически и бессознательно выбираешь.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985262
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
следовало бы
Кому следовало? Что за ...цкая привычка лазить по чужим огородам со своим уставом?
Есть концептуальная вещь: нельзя индексировать строку по "символам". По кодовым точкам можно, но "вам не понравится".
Эта концепция от языка не зависит и создаёт вполне обоснованные преференции для UTF8.
Поскольку зоопарк (даже всего трёх) кодировок - плохо, то UTF-16/-32 должны "сдохнуть". Это тоже концептуально и тоже не зависит от языка программирования.
А вот ваши домыслы про charAt() и java-доки - лучше удерживать при себе.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985270
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Есть концептуальная вещь: нельзя индексировать строку по "символам".
Не только можно, но, порой, даже нужно, если необходимо построить отношения при пересечении строковых множеств на основе символьного ключа.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985273
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема достойна пятничного топика. Я подниму завтра. Мы обсуждаем только одну сторону.
Оператор индекса или charAt. Это узко. Мы же не узко-мыслящие? Верно?

Строка это масссив или Stream?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985285
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Строка это масссив или Stream?

Как там в школе учили? Свет — это одновременно и волна, и частица. Дуалистическая теория?

Для простых применений массив. Для, например, сложного морфологического анализа — поток.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985286
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
Строка это масссив или Stream?

а по какой причине - не двусвязный список?
Он знает, для всякого символа - есть у конкретного символа предыдущий.

Раз уж ты сказал "итераторы",
в том смысле, в каком их "должно быть достаточно" для построения любого алгоритма, стой на
своем, то за вычетом причуд какой-то конкретной реализации,
разговор сводится к тому, какие алгоритмы на самом деле ломаются и не могут быть или
дорого переписываются при переходе от представлению строки "массивом" к "двусвязному" и
затем "односвязному" списку (здесь в качестве модели stream)

Конкретный выбор кодирующего представления можно и проигнорировать, хотя от него может
приходить какая-то своя степень сумятицы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985287
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
mayton
...
Строка это масссив или Stream?

а по какой причине - не двусвязный список?
Он знает, для всякого символа - есть у конкретного символа предыдущий.

Раз уж ты сказал "итераторы",
в том смысле, в каком их "должно быть достаточно" для построения любого алгоритма, стой на
своем, то за вычетом причуд какой-то конкретной реализации,
разговор сводится к тому, какие алгоритмы на самом деле ломаются и не могут быть или
дорого переписываются при переходе от представлению строки "массивом" к "двусвязному" и
затем "односвязному" списку (здесь в качестве модели stream)

Конкретный выбор кодирующего представления можно и проигнорировать, хотя от него может
приходить какая-то своя степень сумятицы.

Я думаю что мы начнем с односвязного.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985319
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
нужно, если необходимо построить отношения при пересечении строковых множеств на основе символьного ключа.
Не надо витать в высоких эмпиреях, когда речь идёт о примитивной индексации по элементам фиксированного размера. В языках программирования это, обычно, "массив". А когда (кто-то) работает с юникодом, то это будет массив кодовых точек. Которые, внезапно, ни разу не символы.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985354
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
rdb_dev
нужно, если необходимо построить отношения при пересечении строковых множеств на основе символьного ключа.
Не надо витать в высоких эмпиреях, когда речь идёт о примитивной индексации по элементам фиксированного размера.
Ничто не мешает строить красно-чёрное дерево по ключу произвольной длины - по строкам и делать по ним конъюнкцию множеств один-к-одному или один-ко-многим.

Basil A. Sidorov
В языках программирования это, обычно, "массив". А когда (кто-то) работает с юникодом, то это будет массив кодовых точек. Которые, внезапно, ни разу не символы.
Когда кто-то работает с юникодом и требуется сортировка строк с вариативной настройкой по CS/CI;AS/AI;LS/LI, то используется библиотека libicu для получения ключа сортировки - последовательности байт, определяющей положение элемента в списке сортировки.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985364
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby

Понятно, что когда-то начиналось с того, что сейчас называют UCS-2.
Потом долепились составные символы и получился UTF-16.
Так как составные символы "практически никому не нужны" и "интерфейс charAt трогать нельзя",
то работа с кодепойнтами прилепилась нашлепкой - "если кому надо, за практическую константу со всем разберутся".

Нет, совершенно странное представление. Составные символы, accent mark, разные control char и прочее были с самого начала Unicode

но вот кодовое пространство для всех вообще символов, определили в 2 байта - "65 536 кодов должно хватить всем" )))

но, как быстро оказалось, не хватило. И "wide char" легким движением руки... преврашается... преврашается... в UTF-16 ))) т.е. совершенно НЕ wide char

IMHO & AFAIK
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985369
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevИ "wide char" легким движением руки... преврашается... преврашается... в UTF-16 ))) т.е.
совершенно НЕ wide char

....а потом подавляющее большинство программистов довольствуются тем, что он обратно
совместим с интересным ИМ диапазоном символов и забивают на всё стальное. То есть
повторяется история с char, превратившимся в UTF-8, когда все знают, что шаг влево-шаг
вправо карается расстрелом, но делать полную и правильную поддержку - всем лень. Отсюда и
рождаются топики petrav-а.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985374
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну да, это общая проблема жизненного цикла интерфейсов,
когда "дописывать после default" приходится, потому что никто не берет на себя задачу, как "вставиться в середину"
(она и не решаема обычно толком, без выбрасывания всего нажитого непосильным трудом).

вот utf-16 и "вставился" в ucs-2, как сумел, и старые интерфейсы "сохранил", а новые, по вашим словам - "не символы"
(с чем я не согласен, но это не имеет значения)

Почитал сейчас первоначальный пропозал на то, что потом стало utf-8, в то время, когда ucs еще не знал, что такое составные символы.
Похоже текст опирается на одобренную консорциумом статью Кена Томпсона, текст которой я не нашел.
Похоже Томпсон и привнёс самое понятие составной кодировки, прилетевшей позже в ucs бумерангом.

Так вот ни на какой отъем у программиста прав работы с двухбайтными кодировками не претендуется.
Вы там работайте, как вам заблагорассудится, а с файловой системой обходитесь, пожалуйста, вот так...

http://www.open-std.org/Jtc1/sc22/WG20/docs/N193-FSS-UTF.pdf
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985382
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFFTOPIC Решил погуглить Java doc. Раз уж тут Java упоминули:

Вообще, отстой какой-то (((, как и предполагалось. Всегда считал String жутко дебильным классом ((( Вполне могли бы сделать нормальный интератор, что бы
for ( int ch : myString )
обеспечивал бы корректный проход по строке.

note 1: проверил, for ни с char, ни с int по String пробежать не может. foreach для строк не поддерживается. Ну не бред ли? Сложно было интератор для строки прикрутить?
note 2: даже официальный tutorial
https://docs.oracle.com/javase/tutorial/java/data/manipstrings.html
учит ходить по строкам с помощью индексов и charAt
ну и кто урод? (((


В последних версиях добавили

IntStream chars​()

Returns a stream of int zero-extending the char values from this sequence. Any char which maps to a surrogate code point is passed through uninterpreted.

Class Character

Unicode Character Representations

The char data type (and therefore the value that a Character object encapsulates) are based on the original Unicode specification, which defined characters as fixed-width 16-bit entities. The Unicode Standard has since been changed to allow for characters whose representation requires more than 16 bits. The range of legal code points is now U+0000 to U+10FFFF, known as Unicode scalar value. (Refer to the definition of the U+n notation in the Unicode Standard.)

The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary characters. The Java platform uses the UTF-16 representation in char arrays and in the String and StringBuffer classes. In this representation, supplementary characters are represented as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the low-surrogates range (\uDC00-\uDFFF).

A char value, therefore, represents Basic Multilingual Plane (BMP) code points, including the surrogate code points, or code units of the UTF-16 encoding. An int value represents all Unicode code points, including supplementary code points. The lower (least significant) 21 bits of int are used to represent Unicode code points and the upper (most significant) 11 bits must be zero. Unless otherwise specified, the behavior with respect to supplementary characters and surrogate char values is as follows:

The methods that only accept a char value cannot support supplementary characters. They treat char values from the surrogate ranges as undefined characters. For example, Character.isLetter('\uD840') returns false, even though this specific value if followed by any low-surrogate value in a string would represent a letter.
The methods that accept an int value support all Unicode characters, including supplementary characters. For example, Character.isLetter(0x2F81A) returns true because the code point value represents a letter (a CJK ideograph).
In the Java SE API documentation, Unicode code point is used for character values in the range between U+0000 and U+10FFFF, and Unicode code unit is used for 16-bit char values that are code units of the UTF-16 encoding. For more information on Unicode terminology, refer to the Unicode Glossary.


class String
int codePointAt(int index)
Returns the character (Unicode code point) at the specified index.

int indexOf(String str)
Returns the index within this string of the first occurrence of the specified substring.



но делать полную и правильную поддержку - всем лень. Отсюда и
рождаются топики petrav-а.
Так нормальную поддержку должны были бы сделать авторы языка/фреймворка, а не каждый программист самостоятельно пилить (((

Сначала насоздавали ненужных абстракций типа CharSequence непонятно зачем (единственный результат данной абстракии - тормозить на любом чихе), а как возникает задача банально обойти строку (классический интератор, б#$%^) тут один сплошной ВигВам.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985388
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevТак нормальную поддержку должны были бы сделать авторы языка/фреймворка

Так я про них и говорю. Что GLIBC, что WinAPI, что прочие RTL со старыми функциями
обращаются в стиле "работает - не трожь".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985392
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Leonid KudryavtsevТак нормальную поддержку должны были бы сделать авторы языка/фреймворка

Так я про них и говорю. Что GLIBC, что WinAPI, что прочие RTL со старыми функциями
обращаются в стиле "работает - не трожь".

А я про Java 9 ((( которую "со старыми функциями" назвать как-то сложно.

Unicode 2.0 это Июль 1996 (по русской википедии), а сейчас 2020
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985393
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Сложно было интератор для строки прикрутить?
Сложно .
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985395
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Ничто не мешает строить красно-чёрное дерево
Ещё раз - не надо витать в высоких эмпиреях.
Всё, чего хочет petrav - массив кодов, который будет совпадать с массивом символов.
Это другая концепция и сейчас уже можно вполне уверенно утверждать, что эту концепцию похоронила жизнь.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985397
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумал сейчас вот что:
Конструктивный подход, это всегда комбинация нежелания разговаривать с нежеланием переделывать.
То, что получается в итоге, называют инженерным решением.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть тоже мысль. Многие решения из тех которые не были удачны с инженерной точки зрения - внезапно внедрились
и работают. Возможно практика применения - слабо избирательна по отношению к инженерной эстетике.

Пример. Архитектура x86 . Крайне неудачная. Мало регистров широкого назначения. Практически только EAX. Все
остальные - узкой специализации. Нелепая сегментная адресация. Нахрена она нужна - непонятно.

Еще пример. Ядро Microsot Windows. Крайне неудачный API. Сравните функцию CreateFile(...) ее определение
и назначение параметров и функцию Unix open(..). Это земля и небо. Уродство против лаконичности.

И еще пример - файловые системы MS с точки зрения дизайна. Эти нелепые имена дисков. C:,D:...
Эта регистровая толерантность. Эти странные резервированные имена. NULL, COM, LPT. Эти нелепые симлинки
на директории. (Почему файлы не поддержали?). Эти перевернутые слеши.

Вобщем это все решения которые к моему вящему ужасу - удачно внедрились. Хотя смотреть на низ без слёз
невозможно. В них нет инженерной эстетики. Как знаете. Смотрите на какой-то механизм. И душа радуется.
Красиво. А бывает возьмешь другой... и видешь.. нагромождение заплаток и историю переделок.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985408
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Архитектура x86 ..... Нелепая сегментная адресация. Нахрена она нужна - непонятно.

I8086 наследник I8080 ( СССР K580ВМ80, Z80 )
памяти 64 Kb было мало, сделали "640 Kb должно хватить всем" ( C )

mayton

И еще пример - файловые системы MS с точки зрения дизайна. Эти нелепые имена дисков. C:,D:...
Эта регистровая толерантность. Эти странные резервированные имена. NULL, COM, LPT.
...Эти перевернутые слеши....


ВикипедияCP/M
...
Во второй половине 1970-х годов была наиболее популярной системой для компьютеров на базе Intel 8080 и Zilog Z80, позднее была вытеснена MS-DOS[⇨]. Стала основой операционной системы DR-DOS (1988).


удачно внедрились...
.. нагромождение заплаток и историю переделок...
...смотреть на низ без слёз невозможно
no comment. Ответ и так очевиден. Если удалить лишнее и переставить местами в порядке причинно-следственной связи. IMHO
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСравните функцию CreateFile(...) ее определение
и назначение параметров и функцию Unix open(..). Это земля и небо. Уродство против
лаконичности

Крайне неудачный пример. CreateFile() имеет такой функционал, который для open() не
обещают даже в следующем ядре. Достаточно упомянуть только FILE_ATRIBUTE_TEMPORARY и
FILE_FLAG_DELETE_ON_CLOSE. И это ещё придётся забыть, что для open() имя файла это всё ещё
просто кучка байт, которая сохраняется в файловой системе "как есть", что делает
использование файла из двух программ с разными локалями весьма забавным аттракционом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985431
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Тебе удобно использовать CreateFile ?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985434
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Dimitry Sibiryakov,

Тебе удобно использовать CreateFile ?

А что там неудобного?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985440
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
mayton
Dimitry Sibiryakov,

Тебе удобно использовать CreateFile ?

А что там неудобного?

Чувак! Функция с семью! Семью аргументами, Карл! Это что за дизайн вообще?
Мне чтобы открыть существующий бинарный файл на чтение нужно 3 аргумента. Это путь файла.
Режимы открытия (маска). И маска привилегий (опционально) если нужно создавать новый.

Да еслиб тебе на собеседовании кто-то придумал такую функцию - ты должен был его
за руку схватить. Остановить. Сказать - что ты вообще дизайнишь? Тебе.... это все... зачем?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985443
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТебе удобно использовать CreateFile ?

Да. Более того, я его и под линуксом использую. Но вот с вышеназванными флагами под
линухом напряг. Delete-on-close эмулируется исключительно криво через удаление сразу после
открытия, что не позволяет совместное использование временного файла, а на приоритеты
кэширования нельзя повлиять в сторону увеличения вообще никак.

То есть всё, что может open(), можно эмулировать через CreateFile(), но не наоборот. И это
ясно показывает кто чьё жалкое подобие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне чтобы открыть существующий бинарный файл на чтение нужно 3 аргумента.

И ещё два-три вызова совершенно левых функций чтобы установить недостающие флаги
дескриптора, файла и совместного доступа. "Поздравляю, Шарик."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985447
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы ребята, мозохисты.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985453
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Еще пример. Ядро Microsot Windows. Крайне неудачный API. Сравните функцию CreateFile(...) ее определение
и назначение параметров и функцию Unix open(..). Это земля и небо. Уродство против лаконичности.

И еще пример - файловые системы MS с точки зрения дизайна. Эти нелепые имена дисков. C:,D:...
Эта регистровая толерантность. Эти странные резервированные имена. NULL, COM, LPT. Эти нелепые симлинки
на директории. (Почему файлы не поддержали?). Эти перевернутые слеши.
Вообще не понимаю - нафига весь этот зоопарк, если в конечном итоге всё вырождается в концепцию all-is-database, а всё остальное - все эти pipes, streams, концепции all-is-file и т.д., лишь жрущие ресурсы и увеличивающие латентность прокладки.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985495
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pipes - вполне себе полезная штука.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985500
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

"Поздравляю, Шарик."

Эй. Это было обидно. И необоснованно. Может обоснуешь?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985522
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожет обоснуешь?

Обосновать, что один ядерный вызов быстрее трёх и не подвержен гонкам потоков? Это, как
бы, очевидно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonМожет обоснуешь?

Обосновать, что один ядерный вызов быстрее трёх и не подвержен гонкам потоков? Это, как
бы, очевидно.

Мой знакомый доцент математики говорил что когда говорят "этож очевидно" - в ответ надо бить в морду.



Кому-то очевидно что белые люди должны ставать на колени перед неграми и каяться за все свои
коллонизаторские деяния в прошлом. Мне вот - неочевидно.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985561
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМой знакомый доцент математики говорил что когда говорят "этож очевидно" - в ответ надо
бить в морду.

Он точно математик? У них половина доказательств теорем так делается.

Неверующие могут открыть "man 3 open" и прочитать список его флагов. Обращая особое
внимание на те, у которых написано "делает то же самое, что флаг Х функции У" и версию в
которой они появились.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985565
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonМой знакомый доцент математики говорил что когда говорят "этож очевидно" - в ответ надо
бить в морду.

Он точно математик? У них половина доказательств теорем так делается.

Неверующие могут открыть "man 3 open" и прочитать список его флагов. Обращая особое
внимание на те, у которых написано "делает то же самое, что флаг Х функции У" и версию в
которой они появились.

Хочешь джентльменское пари? Я просто докажу что open(..) делает меньше действий. По другому докажу.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985570
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХочешь джентльменское пари? Я просто докажу что open(..) делает меньше действий.

То есть Вы на спор подтвердите то, что я сказал выше о меньшем функционале open() по
сравнению с CreateFile()?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985572
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonХочешь джентльменское пари? Я просто докажу что open(..) делает меньше действий.

То есть Вы на спор подтвердите то, что я сказал выше о меньшем функционале open() по
сравнению с CreateFile()?..

Ну... я предполагаю что факты расставят все на свои места. Факты - упрямая вещь.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonФакты - упрямая вещь.

Звучит логично. Осталось только составить табличку в левом столбце которой будут флаги и
возможности CreateFile(), а в правом - их аналоги у open(). Начать можно с уже упомянутых
FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985589
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonФакты - упрямая вещь.

Звучит логично. Осталось только составить табличку в левом столбце которой будут флаги и
возможности CreateFile(), а в правом - их аналоги у open(). Начать можно с уже упомянутых
FILE_ATTRIBUTE_TEMPORARY и FILE_FLAG_DELETE_ON_CLOSE.

Мой спор основан не на возможностях о которых ты говоришь. И не на
"два-три вызова совершенно левых функций чтобы установить недостающие флаги".

А на перформансе. Я беру две эквивалентных конфигурации по железу. И смотрю где
быстрее идет компилляция крупного проекта. И дальнейшие аргументы заслушивать
уже как-то не особо интересно. Зачем нужна API богатый возможностями но которые
особо не нужны. Флаги, говоришь DELETE_ON_CLOSE? Вещь полезная. Но наверное
не в рамках моего пари.

Вот как-то так.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985597
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ беру две эквивалентных конфигурации по железу. И смотрю где
быстрее идет компилляция крупного проекта. И дальнейшие аргументы заслушивать
уже как-то не особо интересно.

То есть ты утверждаешь, что компиляция вызова функции с семью параметрами идёт медленнее,
чем компиляция вызова функции с тремя параметрами. И это всё? Объём и состав подключенных
заголовков тут как бы совсем ни при чём?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985598
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я утверждаю что дизайн функции CreateFile(..) в большинстве случаев - избыточен для практического применения.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985603
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В большинстве случаев при вызове этой функции шесть параметров из семи - нули.

PS: И таки да, если тебе не нужна функциональность CreateFile() - не пользуйся им. open() из стандартной CRT всё так же имеет три любимых тобой параметра, хотя я не представляю случаев когда требуется использовать последний из них.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985611
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(разводя руками)

Ну вот. Дернули переходник.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985648
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А на перформансе. Я беру две эквивалентных конфигурации по железу. И смотрю где быстрее идет компилляция крупного проекта.
И кого это колышет, если в "крупном проекте" нет функционала, который вы пытаетесь сравнить?
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39985650
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну значит моё джентльменское пари было совсем не про это.
...
Рейтинг: 0 / 0
236 сообщений из 236, показаны все 10 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]