0 / 0 / 0
Регистрация: 24.12.2020
Сообщений: 4
|
|
1 | |
double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво24.12.2020, 18:28. Показов 4107. Ответов 81
Метки нет (Все метки)
double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво
0
|
24.12.2020, 18:28 | |
Ответы с готовыми решениями:
81
double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарвл Как написать на masm под х86 функцию поиска кол-ва вхождений последовательности байт в большом массиве байт? Нюансы синтаксиса: запись double *array - это указатель или что-то иное? Функция, принимающая указатель и число байт и выделяющая память под указатель |
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
31.12.2020, 16:04 | 21 |
Вы опять перепутали "указатель" и "адрес".
Понятие указателя четко определено: тип данных, который хранит адрес. Непознаваемым может быть "адрес". На самом деле он познаваемый, но только на уровне конкретной реализации с++. То бишь, когда речь идет о конкретной реализации в конкретном компиляторе.
0
|
Модератор
|
|
31.12.2020, 16:07 | 22 |
- так я
и имею дело с конкретным компилятором. А не со сферическим конем в вакууме. Возможно компиляторы с непознаваемым адресом и существуют, но мне что-то не попадались. А вам?
0
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
31.12.2020, 16:17 | 23 |
Попробуйте))
Код
1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 Не правда. Если бы вы подразумевали конкретный компилятор, то вы бы привели ссылку на спецификацию, или какой либо другой нормативный документ с описанием сабжа. Вместо этого вы привели код на языке с++, который якобы что-то там показывает.
0
|
Модератор
|
|
31.12.2020, 16:50 | 24 |
- "неправда" пишется слитно. Я посмотрел ваши посты. В них практически отсутствуют ссылки на спецификации... Так вы на чем программируете? На "банановом компиляторе"?
- это нетрудно. Но что это даст вам? Берем, в hex-вид и дальше дизассемблер. И что?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
31.12.2020, 17:18 | 25 |
Catstail, я бы просто обратил внимание на то, что вы с вашими собеседниками находясь на разных уровнях абстракции. Вы ведете речь о конкретной платформе и тех экспериментах, которые можете на ней поставить, а ваши оппоненты говорят о языке С++ как об отвязанной абстракции от платформы. Стандарт языка C++ описывает некоторую абстрактную машину, общее пресечение множеств платформ, которое можно использовать, чтобы сделать конкретную реализацию. С++ специально отвязан от конкретной платформы, чтобы быть переносимым. Отсюда возникают некоторые ограничения. Например упомянутые указатели на разные типы, которые, чтобы соблюсти переносимость в абстрактной машине С++ не конвертируются друг в друга, потому что существуют платформы, на которых разные данные могут находиться на разных адресных шинах. Тоже самое касается преобразования в одно целое число. С точки зрения С++ как языка, а не как его конкретной реализации, такого преобразования не существует, потому что С++ должно быть возможно реализовать для платформы, на которой это правда.
Очень просто на самом деле разобраться в этом, обратив внимание на то, какие преобразования в С++ оставлены неявными, а какие нужно делать принудительно. Все неявные преобразования условно выполнимы на всем множестве конкретных платформ, для которых возможно реализовать С++. А явные преобразования обращают внимание программиста на то, что он делает и согласовать это с конкретной платформой, на которой все это будет работать. Поэтому, я бы не спорил с тем, что на определенных платформах значение указателя - это некоторое число, но спорил бы с тем, что С++, как язык, это гарантирует. Исходя из стандарта С++ и вышеизложенных соображений.
1
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
31.12.2020, 18:15 | 26 |
Ваше исходное заявление:
Это - не правда, а ложь. Ну так и где моё предсказание ???? У меня есть возражение !!! Я вам последовательность предоставила, а предсказания так и не получила! Вы меня обманули !!!!
0
|
Модератор
|
|
31.12.2020, 18:22 | 27 |
DrOffset, Вы совершенно правы! Началу спора положил невинный вопрос ТС. А потом на меня набросились пуристы... Я давно понял, что мы с ними - на разных уровнях абстракции. Но когда мне говорят: "Вы неправы, т.к. путаете понятия", я, естественно, хочу разобраться. Если я ошибаюсь, чем мне грозит ошибка? К примеру, когда мне говорят не путай съедобные грибы и поганки, тут цена ошибки совершенно очевидна. Чем же я рискую, если буду считать, что указатель - это адрес, а адрес - это число? Да ничем! А если выяснится, что в каком-либо компьютере будущего адрес - это банан, то я не упаду в обморок и приму это к сведению. С наступающим Вас!
0
|
Модератор
|
|
31.12.2020, 18:39 | 28 |
- просто отвлекался. Для процессора x86 ваша последовательность из 50 битов - бессмысленна. Ибо:
11010110011100011110000110101010001010000111011101 = D6 71 E1 AA 28 77 (два последних бита отброшены) Берем онлайн дизассемблер и смотрим, что эта последовательность означает для x86 (на картинке). Первый байт не представляет нормальной команды. Дальше идет условный переход по адресу... Если же условие не соблюдено, то 8-битный аккумулятор сбрасывается по адресу es:[edi]. И еще два байта не представляют легальной команды x86 (распознаны как данные). Есть претензии?
0
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
31.12.2020, 20:00 | 29 |
Чем рискуют люди, которые думают, что земля плоская?
Так это уже происходит. Просто вы этого ещё не поняли. Не сумев осознать, что адрес - это банан, вы рискуете так и не суметь понять, что кроме бананов, есть ещё и кокосы. Например: Указатель-на-функцию-член принципиально отличается от указателя-на-данные. Различия настолько принципиально принципиальны, что их в принципе не корректно сравнивать. А размеры указателей-на-функции-члены могут варьировать в зависисмости от строения их классов. Например: Использовалось ли наследование? А если использовалось, то какое? Обычное? Множественное? Виртуальное? Указатель на функцию-член одного класса может отличаться от указателя-на-функцию-член другого класса, как небо и земля. Такие различия обусловлены тем, что в зависимости от строения классов, компилятор может оперировать адресами с принципиально различным устройством. Например: В простейшейм случае обычный указатель-на-функцию-член можно представить, как "смещение от начала класса". Но в более сложных случаях компиляторы вынуждены добавлять в адрес дополнительную информацию - смещение относительно предков для случая с виртуальным наследованием (например) Вот и получается, уже прямо сейчас, что некоторые адреса по своему устройству - более сложные штуки, нежели просто "целые числа". Добавлено через 2 минуты По-моему, это какая то бессмыслица.
0
|
Модератор
|
|
31.12.2020, 20:24 | 30 |
- можно конкретный пример?
- я понял, что вы имеете в виду. Но тут мы меняемся ролями: "смещение от начала класса" звучит не очень хорошо. - да вы приведите как выглядят эти "адреса с принципиально разным устройством"! Я понимаю, что вы имеете в виду. Но, вообще-то, речь шла про нативные типы (double, int). Их адрес - это просто число (номер байта начала в виртуальном адресном пространстве), нет? А указатели на сложные агрегаты данных - согласен, могут быть устроены сложнее (обычный адрес + флаги какие-нибудь) и что? Внутри адрес - это И, как я понял, к интерпретации битовой последовательности претензий нет? Добавлено через 9 минут Вообще объяснить - это сделать понятным. Что, в свою очередь, достигается разными приемами. Например, сведением новых понятий к уже известным. У вас же я замечаю противоположную тенденцию (была такая эпиграмма на одного поэта: "Поэт от слова внятного идет путем обратного. Чтоб из всего понятного все сделать непонятным" Почему-то вспомнилось ) - Те, кто не планирует поездок дальше, чем на 500 км - ничем. Потом будет иметь место нарастающая ошибка. Но вы не ответили на мой вопрос: чем рискую я в описанном выше случае? Вы бы, что называется, "положили меня на обе лопатки", если бы сказали примерно так: представление о том, что адрес - это просто число, не позволит вам Добавлено через 3 минуты - с моей т.з. большая часть ваших нападок - это... как бы сказать помягче... неуместная распальцовка.
0
|
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
|
|
31.12.2020, 21:14 | 31 |
Как вы это себе представляете?
Вам код написать, который проиллюстрирует, что такие указатели принципиально несовместимы? Или вслух почитать стандарт с++? Или достаточно будет отослать к быстрым делегатам? Я не знаю, как ещё донести эту мысль: адрес не обязан быть просто числом, и может быть чем угодно. double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво Я ни на кого не нападаю. Можете думать, что земля круглая, или что адрес - это число, мне без разницы. Но сейчас вы приходите в публичное поле, и заявляете будто бы адрес - это число. А я заявляю, что это - не правда, а ложь. Вы ссылаетесь на ассемблер, на дебаггер, на циферки в черно-белой консольке. Я ссылаюсь на правила языка. Некорректно судить о с++ глядя на ассм-выхлоп. Это так же некорректно, как и судить об исходной программе, глядя на нолики и единички в отрыве от контекста. Более того, не зная контекста, вы не знаете как правильно интерпритировать этот самый бинарный код. Вы рискуете увидеть бессмыслицу, как если бы это был просто случайный набор из ноликов и единиц. Добавлено через 1 минуту Не имеет значения. В правилах нигде не сказанно, что там под капотом будет именно "смещение". Там может быть всё, что угодно. А вы по прежнему можете считать, что там будут "просто цифры", которые "просто по другому" интерпретируются компилятором.
0
|
Комп_Оратор)
|
|
01.01.2021, 00:04 | 32 |
Catstail, приветствую)
Вам не переспорить. Это не имеет смысла, потому, что тут не прощают даже неверно поставленного ударения. По сути вы выбрали не тот тип который бы выбрал С++ "непурист". То есть, тот кто считатет что плохое состояние природы это непогода а не погода с плохим состоянием. Такой непурист выбрал бы size_t или unsigned int , что в общем-то по размеру соответствует вашему long (если иметь ввиду множество неотрицательных (не очень отрицательных ) значений. Вот тут https://en.cppreference.com/w/cpp/types/size_t
Сообщение от небожителей
Я помню наши с вами споры. Многое изменилось с тех пор) С Новым Годом!
0
|
DrOffset
|
01.01.2021, 00:49
#33
|
0
|
Модератор
|
|
01.01.2021, 09:34 | 34 |
IGPIGP, и Вас - с Новым годом! Необычайно приятен мне Ваш ответ! Да. Смиряюсь. Но не могу не вспомнить бессмертного А.П.Чехова. В "Скучной истории" (кажется) герой произносит фразу "Не представляю, как этот сухарь живет со своею женой". Можно перефразировать классика - не понимаю, как с такими представлениями о языке можно программировать с помощью конкретного компилятора.
- да, наконец дошло. Если говорить только о стандарте языка, то конечно. Но какое отношение это имеет к практическому программированию - непонятно. Осознание кривизны Земли для навигации - ключевой момент. А то, что адрес может быть чем угодно - что это мне даёт? Да ничего! В конкретных реализациях C/С++ адрес - это число. Даже если (как говорил бравый солдат Швейк), вы бы... Впрочем, стоп. Думаю, здесь уместно будет поставить точку в этой явно затянувшейся новогодней дискуссии! Если захотите еще
1
|
Комп_Оратор)
|
|
01.01.2021, 12:52 | 35 |
Catstail, мы живём в дискретном мире, где всё что не возьми - целое число. Да. Это набор нулей и единиц. Но язык С++ постоянно удаляется от предметной области - физической модели вычислительной системы в сторону построения некой абстрактной машины. То есть, понятие типа объекта размягчилось и сменилось понятием выражения. Понятие ссылки (способа доступа, в частности) сдаёт позицию понятию значения. В человеческой логике, значение - контекстно зависимый информационный набор связанный с физическим объектом. То есть, это способ интерпретации некоторой сущности существующей объективно (независимо от нашего сознания). В стандарте С++ значения это категории существующие независимо от чего бы то ни было, связанного с физикой системы.
Я надеюсь, что не подниму слишком большого шума, - на мелкий стараюсь не реагировать. Однако, всё сказанное к тому, что недалеко то время, когда компилятор не даст вам ни какой гарантии о том, что значение указателя не связанного с каким либо объектом, сохраняется как некоторое значение. Это трудно представить, но задекларировать в стандарте - раз плюнуть. Что касается контекста и значения в контексте, то в С есть указатель на char. Этот тип имеет целый набор значений с которыми он может быть связан. 1. Указатель - целое число для хранения представления адреса символа; 2. Указатель по п.1. для доступа к строке символов (реализуется на уровне библиотек, но это не важно, поскольку набор операций предоставляемый библиотеками типа string.h де-факто, стандартное свойство языка С).3. Указатель для доступа к массиву char без терминатора (массиву, который запросто может содержать терминаторы внутри и не содержать оный в конце). Последнее, это значение разделяемое системой и программистом. Ибо кроме программиста, размера ни кто не знает. То есть, значение высокого уровня может быть субъективно(!). *** А внутренне, - в части представления, такой указатель содержит (всегда и независимо от инициализации или оптимизации кода, где целевого объекта фактически нет) целое число, которое язык позволяет использовать для доступа к объекту типа char (символу на данной системе), вне зависимости от контекстно зависимых значений более высокого уровня. Хух... О чём тут спорить? - Oбовсём (слитно т.к. раздел форума как контекст присутствует). И это отличная причина, не делать этого. Даже самая сложная предметная логика, может быть описана простыми принципами. Но может быть и иначе и тогда только талмуд спасает праведную душу. Добавлено через 1 час 4 минуты Вот простая неточность, которая может вызвать возражение. Форма может быть любой, что прискорбно. Да. Существует значение представимое целочисленным литералом 0. Оно не должно проецироваться ни в какой адрес. Это исключение и я не упомянул о нём. И такой момент может поломать любую тему, уведя её в сторону. Но само по себе, - наличие высокоуровневой абстракции "nullptr" как раз хороший пример, который показывает неизбежность присутствия таких вещей. Есть системы, где нулевой адрес существует физически и защитить этот ноль призван nullptr . Это тот случай, когда указатель не есть адрес, а есть отсутствие адреса. Спор о том, считать ноль адресом или нет, неразумен. Но факт есть факт - указатели это уникальный тип, имеющий в наборе значение которое интерпретируется как отсутствие значения. Представьте как славно было бы, если бы у всех целых типов было уникальное значение вроде "nothing". И именно указатели позволяют осуществить полноту такой логики. Но их заменили ссылками почти повсеместно и говорить о том, что это сделано из злонамеренных побуждений - риск прослыть конспирологом. Впрочем, в нормальных языках ссылки существуют как неконстантные объекты и их также можно занулять как и указатели. Я верю, что наступит день, когда С++ станет в ряд с такими языками. Подобное расширение для ссылок расширяет функциональность не влияя на совместимость с ранее написанным кодом. Борцы за безопасность могут придти в ярость, но им это просто необходимо (гормонально). Бог с ними)И ещё по одной (фигурально, конечно)
2
|
Модератор
|
||||||
01.01.2021, 13:14 | 36 | |||||
- почему же трудно представить? Можно представить. Но зачем его менять? Разве что из-за сборки мусора... Но я с этим смирюсь. (Кстати, при этом адрес останется числом! )
Вот еще пример в тему: чему равно значение переменной цикла сразу после завершения цикла? Пурист скажет: "надо читать стандарт!". А я скажу: не обязательно. Просто присваивайте переменной цикла нужное значение, а что там после цикла осталось - неважно! И не пользуйтесь тем, что там лежит, сразу после завершения цикла. Я при этом ничего не потеряю. А пурист пусть вычисляет,
Под занавес - две цитаты из классиков, которые мне близки: "Плюньте на совершенство, иначе вы не сдвинетесь с места и никогда не доберетесь до сути вещей" (Ж-П Сартр); "Не верь ничему, но сомневайся только в том, в чем стоит сомневаться" (Д.Пойа).
1
|
Комп_Оратор)
|
|
01.01.2021, 13:33 | 37 |
У нас оно недоступно ибо вышло из области. Если выше цикла объявить указатель и внутри цикла его установить, то по выходе из области попытка разыменования приведёт к неопределённому результату.
Выполнение кода с операциями модифицирующими lvalue но не разделёнными точками следования неопределено и... Я не против пуризма. Программист это в определённом смысле (контексте) пурист. Я против пуризма, уводящего тему в сторону. Я против пуризма для самоутверждения. Я против пуризма вне разумного контекста, иными словами. Я люблю военное:
Сообщение от из наставлений одного мудрого артеллериста
Это совершенство в сути своей. Ведь что бы понять что такое нужно строго и без сомнения определить что к чему. И сомневаться только в том, что ты правильно определил в чем стоит сомневаться а в чём - категорически не стоит. Это как ни разу не подумать о белой обезьяне. Контекст - бог истины. Белый Гендальф, с белой обезьяной на белом плече. Что принесёт нам белый бык? Сказку про белого бычка? Посмотрим.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
01.01.2021, 16:19 | 38 |
В общем смысле это дает возможность писать переносимые программы.
Есть реализации, где адрес - это пара чисел. Или, где адрес - это число, но в регистр для данных его загрузить нельзя, не поместится. Максимальная разрядность целого числа на такой платформе меньше, чем разрядность указателя. Но тут даже не в этом дело. Выше вы упомянули long, и к этому тоже были вопросы. Очень много "боли" было от кода "непуристов", которые в течении десятка лет писали код для 32-битных платформ в святой уверенности, что long всегда будет помещать в себя значение указателя. Несколько лет назад мы как раз переводили огромный проект для с 32 бит на 64. И я бы предпочел, чтобы его писали пуристы, пусть даже с некоторыми перегибами в формализме. По теме: https://www.viva64.com/ru/a/0004/ На всякий случай, для корректного преобразования указателя в число в C++ существует специальный целый тип uintptr_t. Этот тип специально сделан опциональным как раз для тех случаев, когда на платформе нет возможности осуществить такое преобразование. Если в вашей реализации такой тип присутствует, значит преобразовывать в целое можно, но использовать надо именно этот тип, чтобы потом, когда ваш код, например, будут портировать на большую разрядность, не было проблем. "пурист" скажет, что в этом выражении UB, и рассматривать его с точки зрения вычислимости не имеет смысла.
2
|
Комп_Оратор)
|
||||||
01.01.2021, 16:51 | 39 | |||||
Пуриcт попытается щёлкнуть по носу говорящего (непуристически) про:
и свести тему с рельс на десятки страниц. Я прекрасно понимаю желание Catstail, защищаться. Вот почему я стал рядом. Про size_t и uintptr_t в этой теме было вот тут:double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво 7 постов вверх) Catstail, раз уж я опять выполз - хочу про нулябельность, контекст и ненулябельный тип сказать ещё.У типа size_t такое значение присутствует именно в контексте применения в качестве индекса. Причина именно в том, что индексация начинается с 0 и максимальное значение для типа size_t в типичной реализации (четыре фантомаса) не может быть индексом ни какого элемента, поскольку количество элементов не может быть больше максимумв для size_t. То есть заклинание:
std::string значение npos так и реализовано (обычно). Если посчитать всё
0
|
DrOffset
|
01.01.2021, 17:07
double*p показать, что операция p++ передвигает указатель по памяти на определенное кол-во байт впарво
#40
|
Не по теме: Справедливости ради, ответвление началось из кода, который содержит ошибку. На ошибку указали, но автор кода это не принял. Дальше начались попытки объяснить ситуацию, конечно у каждого в меру своей терпимости. Попытки "щелкнуть по носу", тут случились гораздо позже обозначенного момента, т.е. когда суть спора отошла на второй план, а уже стоял вопрос принципа: "прав я или не прав".
0
|
01.01.2021, 17:07 | |
01.01.2021, 17:07 | |
Помогаю со студенческими работами здесь
40
Зачем тут создается указатель p? И что за "странная" операция *p = *p = 1? Почему на указатель в 64-разрядной системе выделяется 8 байт памяти, а в 32-разрядной системе - 4 байта? Как заставить программу принимать цепочку байт из оперативной памяти, в виде массива байт ? Как JVM понимает, что определенный объект занимает определенное количество байтов памяти? Указатель на массив строк - В функции Test печатается непонятно что из памяти WriteAllBytes записать определенное число байт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации
В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
|
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира
В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
|
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин
История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
|
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией
В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
|
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации
В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
|
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий
В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
|
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO
/ / https:/ / leetcode. com/ studyplan/ top-interview-150/
package topInterview
. . .
|
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
|
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
|
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
|
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
|
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации.
Исполнитель Чертежник работает на координатной плоскости, где может. . .
|