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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

Оффлайн alsoijw

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

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
с помощью указателя вызываем функцию, какой она тип возвратит?
а с каких пор тот или иной метод вызова функции влияет на тип данных которые возвращает эта функция?
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Вот читаю эту ветку и думаю,
большинство вы люди грамотные
в искусстве программирования.
***
Давайте замутим новый язык программирования,
и общими усилиями напишем для него
и интерпретатор и компилятор,
и в конце концов - удобную среду.
***
Зачем? Пусть Будет!
Заинтересованным прошу писать в личку.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Señor_Gaga,
(Нажмите, чтобы показать/скрыть)
Извините, я все еще учусь

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Señor_Gaga,
(Нажмите, чтобы показать/скрыть)


Пройдет.
Одно НО.
Реальный компилятор (рус-Forth) был
мною в полном одиночестве
написан в течении 2-х месяцев,
и примерно за две недели был
переписан на нем самом, и успешно
прошел тестовые проги + компиляцию
самого себя.
---
Интересно? Пиши в личку - дам ссылку,
где его можно скачать и в тексте.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Señor_Gaga,
А смысл нового языка? Важна цель
Извините, я все еще учусь

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Señor_Gaga,
А смысл нового языка? Важна цель

Ну вопрос как у К.Маркса.
Выскажу свое мнение - Движение (не дай себе засохнуть),
но я не практичный англо-американец.
Человек не может есть пять раз в день,
и спать одновременно на двух кроватях.
Нужна простота в жизни и конечно цель в жизни.
Вот отвечая на ваш штрих, вдруг у меня упал взгляд
на книгу (зажатую из библиотеки) : Л.Дао, из "Мир" 1988г
"Программирование микропроцессора 8088"
и думаю, что я принес человечеству больше пользы,
чем понесла потерь наша библиотечная система.

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
Señor_Gaga, а у меня взгляд упал на книжку М.Сингер "Мини-ЭВМ PDP-11: программирование на языке ассемблера и организация машины" (купленную), которой долгое время пользовался, а теперь это макулатура. :( И что?
Извините, я все еще учусь

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
PDP-11
В свое время машинка была Супер!
Но время идет.
В свое время я был помешан
на ZX Spectrum — 8-разрядный.

Помню, был огромный коммерческий успех.
Но все прошло.

Дальше все будет сложнее, но интереснее.

Но дело в том, что по ходу времени
сфера интересов куда-то смещается.
Не всегда - куда мы думаем.
(Нажмите, чтобы показать/скрыть)

Оффлайн Delit

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
olegRomanuk, лучшее средство для понимания - практика. Возьми vim gedit и напиши код, скомпилируй и посмотри.

Написал скомпилировал и попробовал
#include <stdio.h>

int* foo()
 { int a = 10;
   int b = 20;
   b++;
   return &a;
 }

int main()
 { int* n1 = foo();
   int* n2 = n1 + 1; //вычисляется на этапе компиляции скорее всего
  // printf("Тест\n");
   printf("число а = %i, b = %i\n", *n1, *n2);
   return 0;
 }
Я надеюсь, что правильно понял мысль Señor_Gaga.
Результат получился ожидаемый. Компилятор выдал предупреждении, но пример скомпилировал. Пример даже нормально отработал, но если раскоментировать строку printf("Тест\n"); то получите совсем не те значения что ожидали так как эта функция уже перепишет часть стека процесса на который указывают переменные n1 и n2 фактически они указывают на кусок дампа стека процесса. Ну и само сабой нет ни какой гарантии что локальные переменные сохраняться после выхода из функции даже если вы сразу попытаетесь получить их значения.
Вообщем так делать нельзя, я тока не понимаю почему все таки компилятор скомпилировал этот код.

Оффлайн olegRomanuk

  • Автор темы
  • Участник
  • *
  • Сообщений: 120
    • Просмотр профиля
...А если функция возвращает указатель не на 1 число , а скажем так на 2.То есть return возвращает 2 оператора...
Как вы return-ом хотите вернуть два результата функции? При чём тут название темы?

Да извиняюсь, действительно функция возвращает 1 значение, просто я хотел сказать что она может иметь несколько return. И я не могу понять почему не написать бы такой компилятор , произвести модификации  который позволял бы возвращать например 2 числа например так ruturn a; return b а они бы последовательно шли б в ячейках памяти. В чем сложность? 

Пользователь решил продолжить мысль 11 Апреля 2014, 00:11:55:
Señor_Gaga,
(Нажмите, чтобы показать/скрыть)


Пройдет.
Одно НО.
Реальный компилятор (рус-Forth) был
мною в полном одиночестве
написан в течении 2-х месяцев,
и примерно за две недели был
переписан на нем самом, и успешно
прошел тестовые проги + компиляцию
самого себя.
---
Интересно? Пиши в личку - дам ссылку,
где его можно скачать и в тексте.
Молодец
А он возвращает 2 указателя ??

Пользователь решил продолжить мысль 11 Апреля 2014, 00:14:27:
olegRomanuk, лучшее средство для понимания - практика. Возьми vim gedit и напиши код, скомпилируй и посмотри.

Написал скомпилировал и попробовал
#include <stdio.h>

int* foo()
 { int a = 10;
   int b = 20;
   b++;
   return &a;
 }

int main()
 { int* n1 = foo();
   int* n2 = n1 + 1; //вычисляется на этапе компиляции скорее всего
  // printf("Тест\n");
   printf("число а = %i, b = %i\n", *n1, *n2);
   return 0;
 }
Я надеюсь, что правильно понял мысль Señor_Gaga.
Результат получился ожидаемый. Компилятор выдал предупреждении, но пример скомпилировал. Пример даже нормально отработал, но если раскоментировать строку printf("Тест\n"); то получите совсем не те значения что ожидали так как эта функция уже перепишет часть стека процесса на который указывают переменные n1 и n2 фактически они указывают на кусок дампа стека процесса. Ну и само сабой нет ни какой гарантии что локальные переменные сохраняться после выхода из функции даже если вы сразу попытаетесь получить их значения.
Вообщем так делать нельзя, я тока не понимаю почему все таки компилятор скомпилировал этот код.


Шикарно только интересно как локальная переменная была жива после завершения функции фу, если я не ошибаюсь после она же должна быть типа уничтожена.
« Последнее редактирование: 11 Апреля 2014, 00:14:27 от olegRomanuk »

Оффлайн SergeyIT

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

Оффлайн olegRomanuk

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

То есть вы хотите сказать что
int * n1=&a;  // ???

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5589
  • Все по палатам!
    • Просмотр профиля
То есть вы хотите сказать что
int * n1=&a;  // ???
Да: *n1 == &a, то есть n1 содержит адрес переменной "а" в стеке, но вот значение "а" может уже быть изменено.
Извините, я все еще учусь

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Код: (cpp) [Выделить]
#include <stdio.h>

int* foo()
 { int a = 10;
   int b = 20;
   b++;
   return &a;
 }

int main()
 { int* n1 = foo();
   int* n2 = n1++; //Арифметическая операция с указателем!!!
   printf("число а = %i, b = %i\n", *n1, *n2);
   return 0;
 }
И да где подсветка кода?? Не читаемо.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

 

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