nixp.ru v3.0

22 октября 2017,
воскресенье,
07:44:04 MSK

DevOps с компанией «Флант»
dvig написал 17 января 2008 года в 20:39 (428 просмотров) Ведет себя как мужчина; открыл 5 тем в форуме, оставил 39 комментариев на сайте.

Здравствуйте. Изучаю С++. Такая задача: написать определение функции, которая принимает в качестве аргумента указатель на функцию и возвращает так же указатель на функцию.

Вот мое решение.

#include

typedef void (*IND_FUNC)(char*,int&); /* void* IND_FUNC(char*,int&); */

/***********************************/

void func(char* simvol,int& values);

IND_FUNC back_index(IND_FUNC);

int main()

{

IND_FUNC arg;

arg=func;

back_index(arg);

}

/**********************************/

IND_FUNC back_index(IND_FUNC)

{

IND_FUNC d;

return d;

}

/**********************************/

void func(char* simvol,int& values)

{

char a=’Y';

*simvol=a;

int b=1010;

values=b;

}

Мне кажется что допустил ошибку, нельзя вернуть локальную переменную d из определения IND_FUNC back_index(IND_FUNC).

Что-то я запутался, пните что не так.

myst

typedef void (*pfunc_t)(char*, int&);

pfunc_t my_func(pfunc_t)

{

}

Почему нельзя возвращать локальную переменную? Можно. Только осторожно.

dvig

Спасибо. Про осторожность обьясни, чтоб знать на какие грабли по возможности не наступать.

myst

А ты сам подумай почему нельзя делать:

int *f(void)

{

int var;

return &var;

}

dvig

Чтоб нельзя было изменить значение int var.

Code Monkey

не совсем. почитай про выделение памяти для локальных переменных и через new

З.Ы. вообще да, можно, но П-Ц как осторожно :)

dvig

Еще раз спасибо :)

dvig
myst
А ты сам подумай почему нельзя делать:

int *f(void)

{

   int var;

   return &var;

}

Потому что вернули ссылку на уже не существующую переменную и если попытаться присвоить ее(ссылку) какой либо переменной то будет допущенна ошибка

Code Monkey

не совсем верно. этот кусок памяти при вызове другой функции перезапишется ее локальными переменными. т.е. там, куда ты вернул из своей функции ссылку, может оказаться хрен знает что.

myst, поправь, если я неправ :)

myst

Не вдаваясь в тоноксти аппаратной реализации стека, мы вернули указатель на не существующую (после выхода из функиции) переменную. При попытке его разыменования поведение системы не определено, вплоть до SIGSEGV.

dvig

Посоветуйте пожалуйсто, в таком случае, литературу где «вдаются» в тонкости реализации. Если что-то будет не понятно сейчас, естественно, думаю, с накоплением знаний прояснится.

В свою очередь пойду гуглить.

P.S. За ответы естественно благодарен.

myst

Ну если ты понимаешь как устроен машинный стек, то вопросов быть не должно. Если не понимаешь, <font color=«blue»>тут</font> можешь поковыряться.

dvig

Вот. По Стеку, чуток погуглил и нашел вагон с телегой информации.

Еще вопрос. Учусь по Страуструпу. Есть такая задача. написать программу из нескольких функций, вызывающий друг друга до опр. глубины волженности.Ввести аргумен для каждой функции, который в свою очередь определял на какой глубине вложенности сгенерировано исключение. Кое-какие соображения есть, сейчас пытаюсь вырзить в виде кода.

Прошу кинуть пару общих концепций по решению поставленной задачи. НЕ КОД.

myst

Ну а чо? Вызываешь типа так:

f1(x): f2(x+1)

f2(x): f3(x+1)

f3(x): f1(x+1)

и в каждой проверяешь какой сейчас уровень.

Что сложного? Что неочевидного?

dvig

Как оказалось -ничего. Теория и практика.

myst

Вот именно.

dvig

Допустим есть два класса, у каждого есть статичиский член, можно ли в качестве аргумента конструктора статичиского члена использовать ссылку  на статичиский член другого класса? Обновлено: Можно =)

Здорово было если подсказали сырцы где можно подобное встретить, чтоб разобраться.

metal

Сорцы ты вряд ли найдешь, такое в голову редко кому приходит, вот пример разбирайся:

#include
class B
{
  public:
  B(int& input){value=input; input++;}
  std::ostream& print(std::ostream& out)
  {
    out << "value = " << value;
    return out;
  }
  private:
  int value;
};
class A
{
  public:
  A(){};
  static int static_a;
};
int A::static_a = 0;
int main(int argc, char* argv[])
{
  A a;
  std::cout <<" static a1 = " << A::static_a << " ;";
  B b(A::static_a);
  b.print(std::cout) << "; static a2 = " << A::static_a << std::endl;
  return 0;
}
dvig

Благодарен, буду дерзать ;)