![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Доброго здравия, друзья!
Есть два варианта реализации функции compare - см. ниже (прошу не обращать внимания на то, что одна функция сравнения вызывает другую, баян не мой, да и не в этом суть..). Почему обе версии функции будут вполне работоспособны, какова же специфика реализации указателей на void? согласно первого варианта функции могу заключить, что указатель на void фактически есть указатель на указатель на нечто (это нечто будет определено во время выполнения программы), с другой стороны, второй вариант функции противоречит данному сделанному выводу... К сожалению, не нашел для себя ответа в стандарте, подскажите, пожалуйста.
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
никакой специфики нет. void* это просто указаетль на нетипизированную память. что противоречит чему не понятно. как ты преобразуешь указатели не важно, важно то что изначально есть текст char* и в strcmp попадает тоже char*. все промежуточные преобразования не имеют значения. |
|||
|
||||
| FiMa1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Для меня они сейчас имеют значение, т.к. хотелось бы разобраться... Пусть a - указатель на нетипизированную память, но я точно знаю, что по данному адресу в памяти находится переменная типа char, тогда почему я не могу написать так:
|
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
там не находится переменная типа char, там находится переменная типа char*, т.е. строка. Это сообщение отредактировал(а) Daevaorn - 4.8.2007, 18:23 |
|||
|
||||
| Ln78 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
FiMa1, а почему ты решил, что не можешь так написать? Можно написать и без использования дополнительных переменных:
Этот вопрос в каком-то смысле связан с тем, что так активно обсуждался, в конце апреля: указатель - число, приведением типа ты говоришь, как его следует воспринимать. void здесь особых отличий не имеет. Это некоторый оффтоп, но думаю, ты не обидишься: Тонкости преобразований проявляются при множественном наследовании. Например, посмотри под отладчиком код:
|
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Daevaorn, я что-то не понял, почему другой? Я сейчас под отладчиком посмотрел пример:
Разницы не увидел: в функцию strcmp (у меня VS, смотрел файл crt\src\intel\strcmp.asm) в регистр esp передаются в обоих случаях одинаковые числа. В чём отличие? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
Да, я невнимательно посмотрел: только на функцию compare (Я не заметил, что в первом посте код - прокручивающийся список, поэтому main совсем не видел, бывает
|
|||
|
||||
| FiMa1 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Ага, логично, спасибо.
Ммм.. ошибка, я так понимаю в получении не ожидаемого результата от преобразования ( py2 0x0012ff58 {y=5 }, py3 0x0012ff58 {y=5 } см. вариант ниже). Вряд ли разберусь почему такие результаты.. Это как-то пересекается с Апрельской темкой? Что за темка, где почитать?
Это сообщение отредактировал(а) FiMa1 - 4.8.2007, 19:47 |
||||||
|
|||||||
| Ln78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
FiMa1, ну та самая тема, про массивы. Но я, из-за своей невнимательности не полностью прочитал твой этот вопрос, поэтому и неправильно его понял (Кстати, qsort - функция, которая во времена BC3.1 и Windows NT 4.0 разрушила мои представления о мощности NT, подвесив компьютер при эксперименте с неправильной подачей аргументов для неё).
По поводу множественного наследования: когда ты делаешь первые 3 преобразования
компилятор знает, с какими типами он оперирует, и адреса-числа у px и py разные. А если ты вводишь промежуточный посторонний тип (неважно какой, в примерах и void, и int), то компилятор уже такие преобразования чисел не делает, поэтому результат получается не тот, который можно ожидать |
|||
|
||||
| FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Все понятно. Ln78, Daevaorn, спасибо вам пребольшое!
Было определяющей фразой |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |