Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос из теста 
V
    Опции темы
jimbo
Дата 23.4.2010, 12:12 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



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

Какое значение примет переменная result1 и result2 после выполнения следующиего фрагмента кода:

int array[10];
int * a = array;
int * b = &array[9];
int result1= b - a;



char array[10];
char* a = array;
char* b = &array[9];
int result2= b - a; 

Это сообщение отредактировал(а) jimbo - 23.4.2010, 13:08
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
triclosan
Дата 23.4.2010, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



9

второй код не скомпилируется.

первый в принципе тоже.

PM MAIL   Вверх
SenkraD
Дата 23.4.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: нет
Всего: 23



jimbo, ну будут в обоих случаях ошибки компилятора -
    - (в первом) компилятор не будет знать что такое chararray[10]
    - (в втором) компилятор будет кричать что то типа can't assign value to rvalue: 2 = b - a;

Это сообщение отредактировал(а) SenkraD - 23.4.2010, 12:24


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
azesmcar
Дата 23.4.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



jimbo
а чем отличаются первый и второй код?

Цитата(triclosan @  23.4.2010,  12:17 Найти цитируемый пост)
второй код не скомпилируется.

почему?

Добавлено через 36 секунд
Цитата(SenkraD @  23.4.2010,  12:24 Найти цитируемый пост)
jimbo, ну будут в обоих случаях ошибки компилятора -
    - (в первом) компилятор не будет знать что такое chararray[10]
    - (в втором) компилятор будет кричать что то типа can't assign value to rvalue: 2 = b - a;

а... smile в таком смысле, ну полагаю это опечатки.
PM   Вверх
jimbo
Дата 23.4.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



я проперся. виноват.

int array[10];
int *a = array;
int *b = &array[9];
int result1= b - a;



char array[10];
char* a = array;
char* b = &array[9];
int result2 = b - a;

Добавлено через 2 минуты и 38 секунд
Да ребят, опечатки. я просто вручную писал код. да еще и ошибся при копировании. все исправил и ответ дал только  один человек. что у остальных скомпилировать не получилось из за опечаток?smile)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
borisbn
Дата 23.4.2010, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



jimbo, исправленный код компилится нормально.
Ты пишешь второй код вместо первого или вместе с первым. если второе - тогда нормально, что не компилится


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
KOHCEPBATOP
Дата 23.4.2010, 14:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: 1
Всего: 1



jimbo, для любых типов получится 9, т.к. результат приводится к размерности массива.
PM MAIL   Вверх
jimbo
Дата 23.4.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Ребят, вы вопрос читаете? я ж не спрашиваю ответ, я знаю как программировать. 

Вопрос заключался в том, что разница в адресах в 2-х примерах разная. это видно даже не компилируя! но результат одинаковый. т.е. вот если бы я решал эту задачу на бумаге - я бы сказал что в первом случае это будет 9*sizeof(int), во втором 9*sizeof(char). И я до сих пор уверен в этом. Только почему ответ всегда 9? Компилятор т.е. всегда показывает разницу не между адресами а между элементами массива. Т.е. когда происходит вычетание адресов, разница преобразуется с учетом размерности типа - почему? это же не явно! если бы я писал программу, я бы обязательно делил на размерность инта, чтобы получить индекс в массиве. допустим у нас быбыло:

int array[100];
int * ptr = &array[50];
int ptr2 = func(ptr);
int diff = ptr2-ptr;
int result = array[50+diff/sizeof(int)];

где func - функция каким-либо образом изменяющая адрес.допустим плюс 5 элементов.

а в итоге компилятор бы давал мне diff = 5. и result был бы не тем элементом что я хотел бы увидеть!


КОНСЕРВАТОР, объясни пожалуйста, почему результат автоматом приводится к размерности массива, в следствие чего это происходит?
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, 
Код

int* x = 0;
int* y = x + 1;

assert((char*)y == 4);
assert(y - x == 1);

PM MAIL ICQ   Вверх
mes
Дата 23.4.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(jimbo @  23.4.2010,  14:41 Найти цитируемый пост)
Только почему ответ всегда 9? 


переведу Ваши задачи и вопрос по ним с "программного"  на "человеческий": 

Задача 1 :
Сколько арбузов в ряду арбузов между 3м и 10м ?
Задача 2:
Сколько апельсинов в ряду апельсинов между 3м и 10м ?

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

smile


--------------------
PM MAIL WWW   Вверх
djamshud
Дата 23.4.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Это адресная арифметика. Сделайте для int-а
(char*)&a[9]-(char*)a
и в разности получите свои волшебные байтики.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Sosed
Дата 23.4.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.8.2009

Репутация: 1
Всего: 1



Цитата

Только почему ответ всегда 9? 

Результат операции с адресами - значение уже кратное типу(int, char).
PM MAIL   Вверх
jimbo
Дата 23.4.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Цитата

Цитата

Только почему ответ всегда 9? 

Результат операции с адресами - значение уже кратное типу(int, char). 


Ок. я как бы понимаю что ответ всегда 9, и что разница между адресами уже приводится к типу. я не совсем понимал, для чего это сделано?

Теперь я понял. Попытаюсь объяснить. это делается автоматически, для удобства программирования видимо.

когда мы используем указатель таким образом:

char* ptr;
char massiv[20];
ptr = massiv[0];
while(*ptr!=0)
{
     ptr++; // т.е. в этом месте мы инкрементируем значение по указателю, в зависимости от типа попадаем на нужный адрес. Вот только тут я вижу надобность текущей адресной арифметики
}



--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, такая адресная арифметика сделана для массивов, т.к.
&a[1]
эквивалентно
a+1
PM MAIL ICQ   Вверх
jimbo
Дата 23.4.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Да, я это уже понял. как бы сам и объяснил. просто никто до этого не заикнулся что сделано это из удобства, как и система little endian. PROFIT от такого использования адресов - очевиден, но математически он ни разу не очевиден. 

Это сообщение отредактировал(а) jimbo - 23.4.2010, 19:19
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 23.4.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



профит тут только для случая массивов.
для всех остальных случаев - одни неудобства, т.к. надо приводить к (char*) чтобы использовать нормальную адресную арифметику.
PM MAIL ICQ   Вверх
mes
Дата 23.4.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(jimbo @  23.4.2010,  18:19 Найти цитируемый пост)
но математически он ни разу не очевиден. 

в задаче с арбузами и апельсинами то же не очевидно ?


--------------------
PM MAIL WWW   Вверх
jimbo
Дата 26.4.2010, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Цитата(jimbo @  23.4.2010,  18:19 Найти цитируемый пост)
но математически он ни разу не очевиден. 

в задаче с арбузами и апельсинами то же не очевидно ?

Нет, не очевидно. мы же спрашиваем не количество апельсинов или арбузов между 1 и 10, а расстояние, скажем в метрах. т.е. если апельсин в 4 раза Уже чем арбуз - то какое расстояние между 1 и 10?

Добавлено через 11 минут и 10 секунд
Цитата(GoldFinch @ 23.4.2010,  19:30)
профит тут только для случая массивов.
для всех остальных случаев - одни неудобства, т.к. надо приводить к (char*) чтобы использовать нормальную адресную арифметику.

Цитата

для всех остальных случаев - одни неудобства, т.к. надо приводить к (char*) чтобы использовать нормальную адресную арифметику.


можно изъезженный примерчик? с утра плохо соображается:(
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
djamshud
Дата 26.4.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



jimbo, вам же уже объяснили, что измеряется смещение не в байтах, а в количестве объектов. А чтобы измерять расстояние между арбузами в апельсинах, приводите тип от арбуза к апельсину.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
GoldFinch
Дата 26.4.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, пример - это когда надо обходить не массив, а структуру с полями разной длины
PM MAIL ICQ   Вверх
triclosan
Дата 26.4.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(jimbo @  26.4.2010,  09:31 Найти цитируемый пост)
Нет, не очевидно. мы же спрашиваем не количество апельсинов или арбузов между 1 и 10, а расстояние, скажем в метрах. т.е. если апельсин в 4 раза Уже чем арбуз - то какое расстояние между 1 и 10?

Для расстояний используйте диаметры фруктов/ягод - 
Код

sizeof

PM MAIL   Вверх
jimbo
Дата 26.4.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

Репутация: нет
Всего: нет



Цитата(djamshud @ 26.4.2010,  09:53)
jimbo, вам же уже объяснили, что измеряется смещение не в байтах, а в количестве объектов. А чтобы измерять расстояние между арбузами в апельсинах, приводите тип от арбуза к апельсину.

Цитата

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


 smile  ребят, вопрос уже давным давно не сюда. вы как бы читаете вообще что я пишу?


Цитата


Цитата

Нет, не очевидно. мы же спрашиваем не количество апельсинов или арбузов между 1 и 10, а расстояние, скажем в метрах. т.е. если апельсин в 4 раза Уже чем арбуз - то какое расстояние между 1 и 10?

Для расстояний используйте диаметры фруктов/ягод - 


вот это то и обсуждается! что расстояние для разных типов разное, но из-за адресной арифметики, мы получаем расстояние в нужных нам диаметрах. Вы что, действительно не понимаете суть вопроса? Рассмотрите задачу с точки зрения математики а не программирования. если адрес первого элемента 1000, а десятого - 1036. Вычитая из адреса 10 элемента адрес 1 элемента, мы, математически, получаем 36. это и было в коде result = b - a. никакие преведения к типу тут не стоят. компилятор, изначально, видит, что вычисляется разница между адресами указателей типа int, размерностью 4 байта, приводит разницу в число, кратное размерности, и это, блин, очень логично с точки зрения программирования, но не очевидно с точки зрения математики. вы же не получаете 9 если вычтете из 100-10? а вот в программировании получите, если размерность указателя будет 10 байт. И это очень даже хорошо, для пробега по любому виду массивов. 
char *c_ptr;
int* i_ptr;
struct item *si_ptr;
c_ptr = c_ptr+1;
i_ptr = i_ptr +1;
si_ptr = si_ptr + 1; 
везде эта единичка не одинакова. по сути она равна 1*sizeof(char), 1*sizeof(int), 1*sizeof(struct item)
Видите математическое несоответствие?


Цитата

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


в смысле? 
Код

struct tmp
{
int a;
double b;
};

struct tmp * ptr = new struct tmp[666];
ptr[100].b = 0.1;


и что тут?  как раз тут опять адресная арифметика помогает упростить код. без нее вы бы писали что-то типа:

ptr [ 100* sizeof(struct tmp)+4] = (double)0.1; разве нет?


--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
GoldFinch
Дата 26.4.2010, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



jimbo, 
я имел ввиду структуры вида
Код

int x;
char y[x];
int z;

PM MAIL ICQ   Вверх
djamshud
Дата 26.4.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



>это, блин, очень логично с точки зрения программирования, но не очевидно с точки зрения математики

Если вы еще не заметили, адресная арифметика - программерская забава:). Хотите заниматься математикой - вычитайте инты, а адреса оставьте в покое.

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

Это сообщение отредактировал(а) djamshud - 26.4.2010, 13:19


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
xvr
Дата 27.4.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Смысл программы на языке программирования определяется языком програмирования, а не математикой.
В математике x=x+1 невозможно, а в програмировании - на каждом шагу  smile Вот такой вот парадокс  smile 

PM MAIL   Вверх
Albor
Дата 27.4.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(jimbo @  26.4.2010,  12:59 Найти цитируемый пост)
из-за адресной арифметики

Понятия адреса и указателя не эквивалентны, отсюда и непонятки. Арифметика указателей не то же самое, что адресная арифметика (такой в срр вроде как и нет вообще). Во так я вижу данный вопрос.
PM MAIL ICQ   Вверх
Albor
Дата 27.4.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Взглянув на арбузы и апельсины, встречная задача: допустим (как говорят математики) что для хранения объектов есть некая коробка-контейнер, способная вместить 10 апельсинов или 2 арбуза. Вопрос - в чём измерять, вместимость контейнера?  smile  Получается, что если указатель имеет тип указателя на арбуз, то, очевидно, что в данном случае ответ будет 2, а если тип указатель на апельсин - то 10. А если приведём тип к указателю на вишню, то вообще ого-го. Всё очень даже логично и правильно и с точки зрения математики и с точки зрения программирования  smile .
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.