Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Объясните пожалуйста про указатели на функцию .  (Прочитано 2216 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Цитировать
Да извиняюсь, действительно функция возвращает 1 значение, просто я хотел сказать что она может иметь несколько return. И я не могу понять почему не написать бы такой компилятор , произвести модификации  который позволял бы возвращать например 2 числа например так ruturn a; return b а они бы последовательно шли б в ячейках памяти. В чем сложность?
А чем тебя не устраивает использование структур? Возвращай столько значений, сколько тебе нужно. Это как раз то, о чем ты говоришь - одно и более значений последовательно в ячейках памяти, функция возвращает адрес этого куска памяти...
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
А ешё есть указатели. Думаю это то, чего ТС не хватает. По теме нечего прогуливать лекции.
« Последнее редактирование: 11 Апреля 2014, 18:56:30 от peregrine »

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
А ешё есть указатели. Думаю это то, чего ТС не хватает. По теме нечего прогуливать лекции.
В ПТУ С++ не было был только хёскель.

Пользователь решил продолжить мысль 13 Апреля 2014, 20:11:58:
То есть вы хотите сказать что
int * n1=&a;  // ???
Да: *n1 == &a, то есть n1 содержит адрес переменной "а" в стеке, но вот значение "а" может уже быть изменено.
А ты мощный програмер?? а то как-то мне друг говорил что нельзя возвращать указатель из функции на локальную переменную, и я вот не знаю кому верить.
« Последнее редактирование: 13 Апреля 2014, 20:11:58 от olegRomanuk »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
olegRomanuk, ты главное не удаляй объект, а компилятор его удалить не додумается.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
olegRomanuk, ты главное не удаляй объект, а компилятор его удалить не додумается.
думаю додумается удалить и меня не спросит даже что я думаю по этому поводу.

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
Если возвращать указатель на локальную переменную функции, то компилятор сильно ругается по этому поводу. И он таки прав.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Чем более низкоуровневый язык - тем меньше делает компилятор. У Visual Basic'a делает все сам, без всяких указателей. У меня этот Vala код прекрасно работает.
Код: (vala) [Выделить]
void main()
{
    int a = *aa();

    stdout.printf(a.to_string());
}

int* aa()
{
    var a = 10;
    return &a;
}
Хоть это и не плюсы, но указатели здесь есть.

Пользователь решил продолжить мысль 13 Апреля 2014, 23:27:27:
olegRomanuk, ты главное не удаляй объект, а компилятор его удалить не додумается.
думаю додумается удалить и меня не спросит даже что я думаю по этому поводу.
А откуда тогда берутся утечки памяти? К тому же указатель можно обернуть к примеру в другой тип. Ну это я для примера.
Код: (vala) [Выделить]
void main()
{
    int i = 42;
    int* i_ptr = &i;
    int ii = (int)i_ptr;
    int* jj = (int*)ii;
    int j = *jj;
    stdout.printf(j.to_string()+"\n");
}
« Последнее редактирование: 13 Апреля 2014, 23:27:27 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
alsoijw, но дело-то в плюсах. Крайне нежелательно возвращать адрес в стеке, который меньше, чем в rsp, ибо данные могут быть перезаписаны вызовом функции и это приведет к труднопредсказуемому, да и в целом, неверному результату.

UPD: И да, сваливать на компилятор работу по исправлению явных косяков в коде - моветон.
« Последнее редактирование: 13 Апреля 2014, 23:42:39 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
alsoijw, но дело-то в плюсах. Крайне нежелательно возвращать адрес в стеке, который меньше, чем в rsp, ибо данные могут быть перезаписаны вызовом функции и это приведет к трудно предсказуемому, да и в целом, неверному результату.
А кто функции вызывает? Можно пример?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1690
  • А чего вы так смотрите?..
    • Просмотр профиля
alsoijw, а какая разница? Есть определенные принципы и стандарты. Никто тебе не запрещает их нарушать, но зачем? Да, можно такое в качестве примера показывать, но не использовать же подобное в практике.
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
olegRomanuk, да, перечитав еще раз топик хочу сказать: после первого же return выполнение функции прерывается. Несколько return нужно только если есть несколько вариантов выполнения.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Шикарно только интересно как локальная переменная была жива после завершения функции фу, если я не ошибаюсь после она же должна быть типа уничтожена.

Что такое по твоему "она же должна быть типа уничтожена"? Что должно быть с указателем на "типа уничтоженную" переменную?
Указатели сами по себе не обнуляются и не знают, что творится с областью памяти, на которую они указывают.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Шикарно только интересно как локальная переменная была жива после завершения функции фу, если я не ошибаюсь после она же должна быть типа уничтожена.
Что такое по твоему "она же должна быть типа уничтожена"? Что должно быть с указателем на "типа уничтоженную" переменную?
Указатели сами по себе не обнуляются и не знают, что творится с областью памяти, на которую они указывают.
Указатель будет. Место - нет. Даже если обнулить указатель, то кто сказал что нужно обнулить объект?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Указатель будет. Место - нет. Даже если обнулить указатель, то кто сказал что нужно обнулить объект?
Никто не сказал. =) Вот переменная при некоторых условиях и оставалась в памяти. А вот что ТС имеет ввиду, когда говорит об уничтожении переменной, не понятно.

В приведённом примере в функции не исползовалась статическая переменная, поэтому после завершения функции место, выделенное ранее для этой переменной, освобождается. Не обнуляется место, не уничтожается переменная, а просто освобождается место в памяти для возможного использования другими переменными. Ссылка, возвращённая функцией, указывает на место, где была переменная, но это место в дальнейшем может быть переписано другим значением другой переменной, а может быть и не переписано. Поэтому по данному адресу может (но не обязательно должно) храниться предыдущее значение.
« Последнее редактирование: 14 Апреля 2014, 18:30:02 от unimix »

Оффлайн Виталий Голованов

  • Новичок
  • *
  • Сообщений: 19
  • Я мненью общества вращенье придавал и стержнем был
    • Просмотр профиля
если правильно высчитать место, то, возможно, выйдет прочитать  значение а. При выходе из функции просто увеличивается адрес esp.
Толпа не любит одиночек;она признает только фальшивых людей,подражающих во всем друг другу. © Ошо

 

Страница сгенерирована за 0.079 секунд. Запросов: 25.