Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2015, 12:31   #1
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию Передача функции в качестве аргумента через указатель

Здравствуйте!
Пытаюсь освоить передачу функции в качестве аргумента
Для этого набросал две простые функции. И пытаюсь из одной вызвать другую. Подскажите правильно ли указываю аргументы функции, где планирую вызывать

вызываемая функция
Код:
void init(struct _tip_ *z, char *k[])
{
	z->ch=atoi(k[0]);
	z->uch=atoi(k[1]);
	z->sch=atoi(k[2]);
	z->shi=atoi(k[3]);
	z->usi=atoi(k[4]);
	z->i=atol(k[5]);
	z->ui=atol(k[6]);
	z->li=atol(k[7]);
	z->uli=atol(k[8]);
	z->fl=atol(k[9]);
}
Где вызываю

Код:
int init_struct(struct _tip_ *a,char *b,char *c, void (*pinit)(struct _tip_ *z, char *k[]))
{
	char *pstr;
	char *savestr;
	char *str_array[20];
	int i=0;
	int rc=0;
	/*void (*pinit)();*/
	pinit=init;
 
	pstr=(char *)strtok_r(b,c,&savestr);
	

	while (pstr != NULL)
	{
		str_array[i]=(char *)malloc(strlen(pstr));
		/*printf("%p\n\n", &str_array[i]);*/
				 
		if(str_array[i] == NULL)
		{
			rc=-1;
			break;
		}

		strcpy(str_array[i],pstr);
		pstr =(char *)strtok_r(NULL,c,&savestr);
		i++;
	}
	
	if (rc==0)
	{
		
	 	
	 	(*pinit)(&a, str_array);
	 
	 	while (i>0)
	 	{
	 		i--;
	 		free(str_array[i]);
	 		/*printf("\n%p\n", &str_array[i]);*/
	 		
	 	}
	}

	else 
	{
		printf("Malloc вернул Null");
	}

	return rc;

}
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 12:48   #2
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Код:
void init(char* val)
{
    printf(val);
}

typedef void (*pinit)(char*);

void iinit(pinit ppinit)
{
    ppinit("123");
}


int main()
{
    iinit(init);
	return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 13:10   #3
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Код:
void init(char* val)
{
    printf(val);
}

typedef void (*pinit)(char*);

void iinit(pinit ppinit)
{
    ppinit("123");
}


int main()
{
    iinit(init);
	return 0;
}
Тут без бутылки не разберешь. Эти тайпдефы я не использую пока - не хватает знаний.

Как я вижу Ваш код. Сначала описываем вызываемую функцию. Затем создаём тип указателя. Но где сам указатель и его связь с первой функцией?

У меня функции в разных файлах
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 13:21   #4
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Тогда так

Код:
void init(char* val)
{
    printf(val);
}

void iinit(void (*pinit)(char*))
{
    pinit("123");
}


int main()
{
    iinit(init);
	return 0;
}
Разыменовывать указатель на функцию не обязательно, можно писать как обычный вызов, транслятор сам добавит необходимые инструкции
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 13:23   #5
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Дружище, ты можешь общаться не кодом?
Код я и сам напишу, мне нужно понять как это работает
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 13:28   #6
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

А что тут непонятно?
void iinit(void (*pinit)(char*)) // параметр указатель на функцию
iinit(init); // передаем указатель на функцию init
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 13:41   #7
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Если у нас указатель pinit, почему мы в функцию передаем init?
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 13:45   #8
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

это тип указателя, мы можем передать указатель на любую функцию, соответствующую по сигнатуре. В этом и смысл указателей на функции.
Код:
void init(char* val)
{
    printf(val);
}
void init2(char* val)
{
    printf("init2");
}

void iinit(void (*pinit)(char*))
{
    pinit("123");
}


int main()
{
    iinit(init);
    iinit(init2);
	return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 13:52   #9
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
это тип указателя, мы можем передать указатель на любую функцию, соответствующую по сигнатуре. В этом и смысл указателей на функции.
Код:
void init(char* val)
{
    printf(val);
}
void init2(char* val)
{
    printf("init2");
}

void iinit(void (*pinit)(char*))
{
    pinit("123");
}


int main()
{
    iinit(init);
    iinit(init2);
	return 0;
}
А как мне понять на какую именно функцию это указатель? Как мне в iinit передат ьуказатель именно на init2?
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 13:56   #10
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

внутри функции iinit никак не понять на какую функцию этот указатель. Да и зачем оно?
А как передать указатель на init2. Вот так:
Код:
iinit(init2);
Помог? Оставляем отзыв =)

Последний раз редактировалось Helloween; 17.03.2015 в 14:01.
Helloween вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача части массива в качестве аргумента функции Evgenuych96 Общие вопросы C/C++ 24 02.02.2013 17:49
Передача функции в качестве аргумента maks12 Помощь студентам 5 10.05.2012 08:13
Имя функции в качестве аргумента Artem_Kokos Помощь студентам 1 25.04.2011 00:20
Как массив передать в качестве аргумента функции Mixim C# (си шарп) 7 10.03.2011 09:53
Передача object в качестве аргумента moknomo Microsoft Office Excel 3 14.12.2010 09:35