Здравствуйте, Mystic Artifact, Вы писали:
V>>Согласно своей физической природе, отрицательных адресов не существует, бо так спроектирована аппаратура. V>>(принципиально не запрещено иметь и отрицательные адреса, ес-но, но в классических гарвардской и фон-неймановских архитектурах уже приняли указывать адреса неотрицательным смещением) MA> Чего-то тема задела. Позволю себе тебя дополнить не влезая в срач: собственно говоря в адресной арифметике нет знакового или беззнакового сложения (да и вообще в процессорах нет разных команд для этого). Есть просто сложение.
Индекс массива унутре всегда приводится к ширине адреса, где последующим вычислениям, происходящим в дополнительном двоичном коде, ГЛУБОКО ДО ФЕНИ насчёт того, знаковый был тип второго слагаемого или нет.
Здравствуйте, vdimas, Вы писали:
V>Ага, только не мне это надо было объяснять.
Так, я и говорю, что, я только лишь в дополнение тобою сказанному. А в срач я вступать не хочу. Реакция оппонента, как минимум не соответствует правилам форума, да и вообще, не культурно так себя вести, кто бы там ни был прав или нет. Я написал твоему оппоненту два сообщения, но нашел в себе силы их не отправлять. Я сам токсичен адски, и борюсь с собой.
Здравствуйте, vdimas, Вы писали:
TB>>Смотри, индекс — это смещение.
V>Смотрю — для массива [1..10] это уже не так.
В С/С++ и ещё куче языков это так, не уводи тему в сторону, твои познания в паскалоидах — оффтоп.
V>Я нигде не вижу беззнаковых индексов, ни в С/С++, ни в си-подобном C#, где индекс массива привоится либо к int, либо к long.
О, ты ни разу не пользовался std::vector и std::array? Плохо, очень плохо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Mystic Artifact, Вы писали:
MA> Так, я и говорю, что, я только лишь в дополнение тобою сказанному. А в срач я вступать не хочу. Реакция оппонента, как минимум не соответствует правилам форума, да и вообще, не культурно так себя вести, кто бы там ни был прав или нет. Я написал твоему оппоненту два сообщения, но нашел в себе силы их не отправлять. Я сам токсичен адски, и борюсь с собой.
Ну напиши. Только давай без вот этих вот а-ля вдимас:
Что, ты написал, что сфера это граница шара? Ах ты неуч, ничего не знаешь про геометрию, чему тебя только учили, сейчас я на скиле ворвусь и расскажу тебе, как на самом деле, заодно показав, какой я классный.
... 10 строк болтовни про определение топологии, причём всё криво и косо
... ещё 10 строк описания метрического пространства
... ещё 10 строк описания что такое граница множества
Под конец: и такие образом мы получаем, что граница шара таки является сферой. А не как в твоих бреднях!
Короче давай без самолюбования, без демонстрации скила в демагогии, без завуалированных наездов на оппонента (после которых я перехожу к прямым, да), без засирания философией и оффтопом, ок? Я считаю всё это тоже крайне некультурным поведением, странно что ты этого не замечаешь.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, vdimas, Вы писали:
V>Ну какие в опу "мнимые" и "действительные"? )) V>Никаких действительных и мнимых частей комплексного числа нет, есть некая алгебра поверх 2D-векторов.
Ну прижился термин. Сколько лет уже существует. Меня больше напрягает термин виртуальная функция. Которая вызывается, отрабатывает и возвращает результат. Придумал же кто-то!
Здравствуйте, T4r4sB, Вы писали:
TB>>>Смотри, индекс — это смещение. V>>Смотрю — для массива [1..10] это уже не так. TB>В С/С++ и ещё куче языков это так, не уводи тему в сторону, твои познания в паскалоидах — оффтоп.
В дотнете тоже можно создать массивы с индексом не от 0-ля.
V>>Я нигде не вижу беззнаковых индексов, ни в С/С++, ни в си-подобном C#, где индекс массива привоится либо к int, либо к long. TB>О, ты ни разу не пользовался std::vector и std::array? Плохо, очень плохо.
Мде...
Давай-ка я тебя и тут выпорю. ))
#include <iostream>
#include <vector>
using namespace std;
int main()
{
{
int vec[] = {1, 2};
auto ptr = begin(vec);
ptr++;
auto x = ptr[-1];
cout << x << endl;
ptr++;
x = *(ptr-1);
cout << x << endl;
}
{
vector<int> vec = {1, 2};
auto ptr = begin(vec);
ptr++;
auto x = ptr[-1];
cout << x << endl;
ptr++;
x = *(ptr-1);
cout << x << endl;
}
return 0;
}
Здравствуйте, vdimas, Вы писали:
V>В русском "виртуальный" значает только "мнимый", "не существующий" и т.д. V>В ООП "virtual" означает "фактический".
А сие из чего следует? И зачем в таком случае понадобился термин pure virtual? Это что? Чистый фактический?
Слово "виртуальный" может означать: "возможный", "воображаемый", "реализованный программно". Но про "фактический" — это ты просто открыл мне и остальным глаза.
Здравствуйте, Privalov, Вы писали:
V>>В русском "виртуальный" значает только "мнимый", "не существующий" и т.д. V>>В ООП "virtual" означает "фактический". P>А сие из чего следует? И зачем в таком случае понадобился термин pure virtual? Это что? Чистый фактический?
Это не русскоязычный термин.
Английские значения virtual я приводил.
P>Но про "фактический" — это ты просто открыл мне и остальным глаза.
Дык, в русском языке "фактический" имеет несколько смыслов:
— существующий на самом деле (не подходит);
— выбранный из нескольких возможных альтернатив (оно!).
Здравствуйте, LaptevVV, Вы писали:
LVV>Ну, начиная с Си массивы — это просто модель памяти. И индекс (как и адрес) просто обозначает смещение от начала. LVV>Обратите внимание, что в паскале изначально можно было делать индексы произвольно
А ещё в Паскале с самого начала были многомерные массивы, строки как внутренний тип (со всеми необходимыми операциями), строгая типизация с контролем присваивания (а не вот эти вот ваши алиасики) и т.п. Вирт вообще умный дядька.
Ладно, допустим что virtual в английском языке означает фактический. Я по словарям не смотрел, но дупустим.
Но тогда почему одни функции в том же C++ определены с virtual, а другие — нет. Те функции, которые не virtual — они какие?
Так что все равно напрягает.
LVV>>Обратите внимание, что в паскале изначально можно было делать индексы произвольно MD>А ещё в Паскале с самого начала были многомерные массивы, строки как внутренний тип (со всеми необходимыми операциями), строгая типизация с контролем присваивания (а не вот эти вот ваши алиасики) и т.п. Вирт вообще умный дядька.
1. Я читал все книжки Вирта еще в Советском Союзе...
2. И еще тогда понял, что он таки да — ОЧЕНЬ умный дядька.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>2. И еще тогда понял, что он таки да — ОЧЕНЬ умный дядька.
Дядька то умный. И его вклад в ИТ да — реально большой. Но. Всегда все достижения и все условия нужно привязывать к конкретному времени. Меня ужасает в людях инерция мышления. Когда они свой опыт в совсем другом времени в совсем других условиях пытаются 1 в 1 перенести на настоящее. И получается как правило полная фигня, можно решить задачу в современных условиях гораздо легче и главное быстрее. Инерция мышления реально огромна. В ИТ инерция мышления получается лет 40. В других вопросах зачастую превышает 100 лет. Обстоятельства изменились, все перевернулось с ног на голову, но поведение осталось тем же, и оно в данных текущих обстоятельствах совсем не оптимально.
Здравствуйте, T4r4sB, Вы писали:
S>>Т.е. для всего достаточно натуральных чисел. Остальное — выдумки.
TB>Вот ты ржёшь, но к сожалению, именно так думали дебилы, которые сделали беззнаковые индексы в STL и в Русте. Из-за них теперь миллионы программистов либо пердолятся с кастами на каждый чих, засирая код мусором, либо ловят паники на невинных на первый взгляд операциях.
Я чего-то не понял. Беззнаковые в C++ — размеры, обычно используют для этого size_t. Для индекса ты можешь любой тип использовать. В операторе []/at() тоже используется беззнаковый, но твой знаковый к нему автоматом кастится, максимум что получишь — это варнинг. Хочешь без варнинга — касть явно. А твои вычисления никто тебе в size_t не заставляет делать. Или ты мучаешься с кучей вычислений индекса, используя size_t, только для того, чтобы избежать одного каста при обращении по этому индексу? Ну, такое себе.
А отрицательные индексы так-то значения не имеют. Потому что индекс всегда в диапазоне [0,N). И в библиотеке идёт одна проверка — на превышение размера (который size_t), вместо двух проверок. Для библиотеки, которая не заставляет тебя платить за то, что ты не используешь — разумное решение.
Опять же, npos удобно объявлять.
Зачем пердолиться с кастами на каждый чих — не понятно.
Здравствуйте, Marty, Вы писали:
M>Для индекса ты можешь любой тип использовать.
Чтоб поиметь неявный каст на входе в []? Любитель игнорить варнинги?
M>А отрицательные индексы так-то значения не имеют. Потому что индекс всегда в диапазоне [0,N). И в библиотеке идёт одна проверка — на превышение размера (который size_t), вместо двух проверок. Для библиотеки, которая не заставляет тебя платить за то, что ты не используешь — разумное решение.
Задание: напиши проверку (index >= 0 && index < size) для знакового типа так, чтоб оно скомпилировалось в один бранч
M>Зачем пердолиться с кастами на каждый чих — не понятно.
Вот я хочу перебрать элементы с конца
for (auto i = vec.size() - 1; i >=0; --i)
Ну я вот записал цикл самым естественным образом. И подорвался на мине. Оказывается, вот именно для такого случая нужна именно особенная форма записи
А ещё я хочу перебрать все элементы, кроме последнего
for (auto i = 0; i < vec.size() - 1; ++i)
Упс, опять подорвался, потому что именно в этом случае надо записывать цикл ещё одним особенным способом.
А вот я перебираю возможные ходы коня, чтобы по координате обратиться к элементы 2-мерного массива. Раз у нас массив, то координаты должны быть size_t (а ещё, как говорят теоретики, координаты шахматной фигуры не могут быть отрицательными, значит мы должны использовать беззнаковый тип!).
Дальше я заводу массив возможных ходов коня, его тоже делаю size_t, чтоб работала операция сложения с координатами.
Здравствуйте, Privalov, Вы писали:
P>Ладно, допустим что virtual в английском языке означает фактический.
Я обратил прошлый раз внимание, что "фактический" имеет несколько смыслов даже в русском.
Перечислил не все оттенки, разумеется, вот пример, где по смыслу подходит наречие "почти":
The angry peasants were a virtual army as they attacked the castle.
Разгневанные крестьяне представляли собой фактически армию, напавшую на замок.
... практически армию
... чуть ли не армию
и т.д.
P>Но тогда почему одни функции в том же C++ определены с virtual, а другие — нет.
Могу разве что повториться:
в русском языке "фактический" ...
... выбранный из нескольких возможных альтернатив
Здравствуйте, vdimas, Вы писали:
V>Ну или в смысле "почти что функция" ))
То есть virtual — это функция, а не virtual — почти функция? А что такое почти функция в языках программирования? Мне приходит в голову только ENTRY из Фортнана. Это оно?
Здравствуйте, T4r4sB, Вы писали:
TB>И если мы боремся за идеологическую чистоту, то и надо использовать специальный тип, у которого диапазон значений ровно такой, хотя практической пользы от этого тоже не будет никакой.
Практический смысл преизрядный: такому типу даже теоретически невозможно присвоить значение, выходящее за пределы диапазона. В зависимости от дизайна языка это может быть либо статическое ограничение, либо динамическое. Причем последнее логично организовать через обработчик:
#default implementation
array_index_out_of_bound(index, retry) -> throw OutOfBoundException("index {index} out of bound [0, {length})")
#user's implementation
array_index_out_of_bound(index, retry) ->
index > length: retry(index - length)
index < 0: retry(length + index)
А еще можно таким способом сделать нецельночисленные индексы, разреженные индексы, бесконечные индексы для генераторов и т.п.