OberonCore https://forum.oberoncore.ru/ |
|
зачем элементы массивов нумеруются с нуля? https://forum.oberoncore.ru/viewtopic.php?f=35&t=2595 |
Страница 1 из 2 |
Автор: | Сергей Прохоренко [ Суббота, 24 Апрель, 2010 11:25 ] |
Заголовок сообщения: | зачем элементы массивов нумеруются с нуля? |
Отделено: viewtopic.php?p=46413#p46413 Geniepro писал(а): igor писал(а): Казус, однако, состоит в том, что число 0 не входит в множество натуральных чисел. Есть две школы математики, одна из которых (французкая/немецкая, например) включает ноль в множество натуральных чисел, а другая (в частности, русская) -- не включает.Вопрос терминологии. http://ru.wikipedia.org/wiki/Натуральное_число Цитата: Существуют два подхода к определению натуральных чисел — числа, используемые при: * перечислении (нумеровании) предметов (первый, второй, третий…) — подход, общепринятый в большинстве стран мира (в том числе и в России); * обозначении количества предметов (нет предметов, один предмет, два предмета…). Принят в трудах Бурбаки, где натуральные числа определяются как мощности конечных множеств. Отрицательные и нецелые числа натуральными числами не являются. Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов? |
Автор: | Info21 [ Суббота, 24 Апрель, 2010 12:04 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Сергей Прохоренко писал(а): Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Давайте это в отдельную тему. То ли для начинающих, то ли Опять 25.
|
Автор: | igor [ Суббота, 24 Апрель, 2010 12:09 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Сергей Прохоренко писал(а): Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Когда элементы массива нумеруются с нуля, то вычисление относительных адресов этих элементов производися очень просто и естественно. ![]() |
Автор: | Валерий Лаптев [ Суббота, 24 Апрель, 2010 22:40 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Сергей Прохоренко писал(а): Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов? Нет. Тлетворное влияние организации оперативной памяти... ![]() Элементы памяти имеют адрес. Этот адрес - смещение элемента от начала. Естественно, есть элемент с нулевым смещением. Массивы С/С++ (а за ними и остальные) пошли по этому пути. Это не номер элемента, а его смещение относительно начала массива. |
Автор: | Info21 [ Воскресенье, 25 Апрель, 2010 08:05 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Теорию штудируйте. Дейкстру. Там написано про нумерацию с нуля и почему нужно именно так. |
Автор: | Сергей Прохоренко [ Воскресенье, 25 Апрель, 2010 12:04 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Столько слов написали, только чтобы не дать ответ. Наверное, еще сами не разобрались. ![]() |
Автор: | igor [ Воскресенье, 25 Апрель, 2010 15:49 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Пусть дан массив элементов, который размещён в памяти начиная с некоторого адреса base. Тогда адрес памяти, по которому расположен N-тый элемент массива, вычисляется по формуле: address := base + (N - 1) * size, где: size - размер элемента массива в байтах. Так вот, выражение N - 1 - это и есть индекс. Если индексы массива определить именно таким образом, то есть на единицу меньше, чем номер, то при доступе к массиву не надо будет каждый раз делать декремент. Эта операция очень быстрая, но использоваться она может очень часто. Уверен, что Вы ответите что-то типа: "Не, ну это-то понятно, это я и сам знаю, а ... (дальше Ваш выход) ...". Буду рад, если я ошибаюсь. ![]() PS: Штудируйте режимы адресации КР1810ВМ86 ![]() ![]() ![]() |
Автор: | kemiisto [ Воскресенье, 25 Апрель, 2010 16:40 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Edsger W. Dijkstra, Why numbering should start at zero. Если я правильно понял:
Теперь, разобравшись с предпочтительной формой неравенств, перейдём, вслед за Дейкстрой, к выбору схемы нумерации индексов. Для последовательности из N элементов (с учётом уже выбранной формы неравенств) есть два варианта:
Дейкстра считает, что второй диапазон лучше. Т.к. индекс элемента непосредственно равен количеству элементов, предшествующих ему. |
Автор: | kemiisto [ Воскресенье, 25 Апрель, 2010 16:44 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
igor писал(а): Так вот, выражение N - 1 - это и есть индекс. Если индексы массива определить именно таким образом, то есть на единицу меньше, чем номер, то при доступе к массиву не надо будет каждый раз делать декремент. Эта операция очень быстрая, но использоваться она может очень часто. Что-то мне подсказывает, что дело тут не в скорости операции вычитания. А в том, что если за индекс взять N, а не N - 1, то, скажем, для представления 64 индексов нужно будет уже 7 бит (от 1 до 64) с неплохим перерасходом. А если брать N - 1 то хватить 6 бит (от 0 до 63). Хотя... |
Автор: | igor [ Воскресенье, 25 Апрель, 2010 16:48 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
И это тоже. |
Автор: | igor [ Воскресенье, 25 Апрель, 2010 17:32 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Я где-то уже писал на этом форуме, но чувствую, что имеет смысл повторить. Для программиста никакой путаницы и никаких проблем не возникает, если раз и навсегда для себя установить, что с каждым элементом массива могут быть связаны два числа (понятия): "индекс" и "номер". Причём, индекс как бы является системной характеристикой, а номер - прикладной. Массивы очень полезно себе представлять как нагруженные множества. А именно: упорядоченное множество индексов и их нагрузки (сами данные). Здесь, с одной стороны не возникает никаких противоречий с математическим понятием множества; а с другой стороны, массив как бы является расширением уже введённого в язык понятия множества SET. Последнюю мысль поясню. То есть массив, как и SET, тоже является как бы множеством целых чисел от 0 до N-1 (индексов). Только, во-первых, N здесь может быть произвольным; во-вторых, массив является нагруженным множеством. PS: Про нагруженные множества можно почитать, например, у Борисенко: http://www.intuit.ru/department/se/pbmsu/12/2.html. |
Автор: | Валерий Лаптев [ Воскресенье, 25 Апрель, 2010 18:04 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Еще можно посмотреть со стороны линейного поиска. Если нумерация с нуля, то a[N] - это элемент-барьер. Аналогично сделано в stl для итераторов: элемент v.end() - это "адрес" фиктивного элемента за последним реальным элементом контейнера v. |
Автор: | Wlad [ Понедельник, 26 Апрель, 2010 22:32 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Сергей Прохоренко писал(а): Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов? Просто традиция. В плохом языке Бэйсик (во многих его реализациях), для преодоления этого "неудобства", был специальный оператор (функция?), который устанавливал индекс первого элемента массива - 0 или 1. Естественно, что в реализации нечто в выражениях вычисления смещения (внутри интерпретатора) всё равно вычиталось... но пользователи оставались довольными и внутренние противоречия их не терзали. В принципе, никто не мешает в компилирующих языках просто подставлять другие куски кода в кодогенерирующих частях компилятора. А начальный номер индекса в массивах определять через опции компилятора (в комментариях, например или - в командной строке). Хотя, в тех же Паскале и Модуле-2 и этой проблемы не существовало - там границы массивов при их объявлении задавались... |
Автор: | Сергей Прохоренко [ Вторник, 27 Апрель, 2010 21:58 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Wlad2 писал(а): Сергей Прохоренко писал(а): Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов? Просто традиция. В плохом языке Бэйсик (во многих его реализациях), для преодоления этого "неудобства", был специальный оператор (функция?), который устанавливал индекс первого элемента массива - 0 или 1. Естественно, что в реализации нечто в выражениях вычисления смещения (внутри интерпретатора) всё равно вычиталось... но пользователи оставались довольными и внутренние противоречия их не терзали. В принципе, никто не мешает в компилирующих языках просто подставлять другие куски кода в кодогенерирующих частях компилятора. А начальный номер индекса в массивах определять через опции компилятора (в комментариях, например или - в командной строке). Хотя, в тех же Паскале и Модуле-2 и этой проблемы не существовало - там границы массивов при их объявлении задавались... Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры. Мы ведь должны сделать приятное компилятору, чтобы тот, бедняга, не перетрудился, и для этого каждый раз должны свихивать свои мозги (типа, кроме индекса нужно держать в голове номер) и рисковать наделать ошибок. |
Автор: | igor [ Среда, 28 Апрель, 2010 05:36 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Сергей Прохоренко писал(а): Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры. Сказано было много, но Вы услышали только то, что хотели услышать.
|
Автор: | Валерий Лаптев [ Среда, 28 Апрель, 2010 06:52 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Сергей Прохоренко писал(а): Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры. Мы ведь должны сделать приятное компилятору, чтобы тот, бедняга, не перетрудился, и для этого каждый раз должны свихивать свои мозги (типа, кроме индекса нужно держать в голове номер) и рисковать наделать ошибок. Не... Я сам и некоторые мои знакомые программисты частенько делали ошибки, вычисляя количество элементов массива. Там же +1 надо обязательно. О которой частенько забываешь. У меня при переходе на С такие ошибки исчезли просто. Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое. |
Автор: | Info21 [ Среда, 28 Апрель, 2010 06:58 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Массивы не *нумеруются* с нуля. Указывается их позиция в массиве, измеряемая смещением -- числом элементов etc. И нефик время тратить. |
Автор: | Wlad [ Среда, 28 Апрель, 2010 19:30 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Валерий Лаптев писал(а): Сергей Прохоренко писал(а): Там же +1 надо обязательно. О которой частенько забываешь. У меня при переходе на С такие ошибки исчезли просто. Какие ошибки исчезли "при переходе на Си"? применительно к обязательности "+1"... Какие могут быть ошибки, если обязательно есть оператор (функция), возвращающий(-ая), длину по заданной размерности массива? Необходимость производить самому дополнительные манипуляции, сверх того, что требуется по элементарному описанию семантики операций моделируемой системы (вынесение операций не на свой уровень системы), лично для меня - "минус" языка... хотя, конечно, можно и кипятком писать по поводу #define LEN(a) ( sizeof (a) / sizeof ((a)[0]) ) ... однако кипяточек резко заканчивается после ухода со статически объявляемых массивов... |
Автор: | Сергей Прохоренко [ Среда, 28 Апрель, 2010 20:44 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Валерий Лаптев писал(а): Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое. Я обратил внимание, но мотивы Вирта мне не известны. Может быть, он просто решил не выделяться" - и так все вокруг обвиняли его в отрыве от мэйнстрима. Мне не нравится, когда технические решения обосновывают интуицией. Интуитивно правильно было бы вообще не создавать такой язык программирования, как Си. У меня есть четкая позиция: компилятор (и язык) для программиста, а не программист для компилятора. Несколько лет люди в вузах изучают линейную алгебру, где элементы матриц нумеруются с единицы, все математические модели используют нумерацию элементов с единицы. И вот вдруг ни с того ни с сего при программировании этих самых матмоделей требуют сдвинуть систему координат! Чего ради? Ради "сишных" программистов, которые скорее уйдут на пенсию, чем перейдут на новый язык? В современной индустрии программирования полно галиматьи и шаманства, и участники этого форума пишут об этом регулярно. А то, что "все программисты делают это", для меня ничего не значит - я не в восторге от "успехов" этой отрасли, которая находится в глубоком идеологическом кризисе уже многие десятилетия. |
Автор: | Валерий Лаптев [ Среда, 28 Апрель, 2010 21:10 ] |
Заголовок сообщения: | Re: зачем элементы массивов нумеруются с нуля? |
Сергей Прохоренко писал(а): Валерий Лаптев писал(а): Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое. Я обратил внимание, но мотивы Вирта мне не известны. Может быть, он просто решил не выделяться" - и так все вокруг обвиняли его в отрыве от мэйнстрима. Мне не нравится, когда технические решения обосновывают интуицией. Интуитивно правильно было бы вообще не создавать такой язык программирования, как Си. У меня есть четкая позиция: компилятор (и язык) для программиста, а не программист для компилятора. Несколько лет люди в вузах изучают линейную алгебру, где элементы матриц нумеруются с единицы, все математические модели используют нумерацию элементов с единицы. И вот вдруг ни с того ни с сего при программировании этих самых матмоделей требуют сдвинуть систему координат! Чего ради? Ради "сишных" программистов, которые скорее уйдут на пенсию, чем перейдут на новый язык? В современной индустрии программирования полно галиматьи и шаманства, и участники этого форума пишут об этом регулярно. А то, что "все программисты делают это", для меня ничего не значит - я не в восторге от "успехов" этой отрасли, которая находится в глубоком идеологическом кризисе уже многие десятилетия. 1. Математические модели и их реализация - это "две большие разницы". Просто поищите ПОДХОДЯЩИЙ вам инструмент. С задаваемыми границами массивов. 2. В то время, когда создавался С, только Дейкстра (и, может быть, еще пара-тройка человек) задумывался о том, что такое программы. И для чего они: для компьютера или для человека. Остальные в большинстве своем просто лабали проги. В С индекс элемента массива означает именно не номер, а смещение от начала - это естественно устройство адресуемой памяти. Хотя, например, в системе команд 8086 есть команда bound, с помощью которой можно проверить, попадает ли указанное целое в заданный интервал. Правда, пользоваться не очень удобно - прерывание надо обрабатывать. Аналог механизма исключений в языках высокого уровня... |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |