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

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

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

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

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

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

Цитата:
Сообщение от Helloween Посмотреть сообщение
внутри функции iinit никак не понять на какую функцию этот указатель.
А как передать указатель на init2. Вот так:
Код:
iinit(init2);
Можно менять ткнуть носом где не так?

мейн
Код:
#include <stdio.h>
#include "02.h"

struct _tip_ b={		
	(char)0xFF, 
	0xFF, 
	(char)0xFF, 
	(short int)0xFFFF, 
	0xFFFF,
	0xFFFFFF,
	0xFFFFFF,
	0xFFFFFFFF,
	0xFFFFFFFF,
	0xFFFFFFFF
					};

char str[]="12;1;14;55;645;17;28;9;93;890.92423523";
char sep[]=";";

int main()
{

	/*peremen(&b);	Вызов функции печати таблицы
	set_null(&st.b);
	peremen(&st.b);
	prnt_double(&db);
	set_str(&st);
	peremen(&st.b);*/
	if (!init_struct(&b,str,sep))
	{
		peremen(&b);
	}
	else 
	{
		printf("Ошибка\n");
	}
	return 0;
}
функции iinit

Код:
#include <stdio.h>
#include <string.h>
#include "02.h"
#include <stdlib.h>

/*
 *	Data definition:
 */
void init(struct _tip_ *a, char *str_array[]);
/*
 *	Function(s) definition:
 */
/*---------------------------------------------------------------------*

Name		- init_struct

Usage		- main.c

Prototype in	-     02.c

Description	-  Инициализирует структуру полученными от разбиения строки Str лексемами.

*---------------------------------------------------------------------*/
int init_struct(struct _tip_ *a,char *b,char *c, void (*pinit)(struct _tip_ *a, char *str_array[]))
{
	char *pstr;
	char *savestr;
	char *str_array[20];
	int i=0;
	int rc=0;
	/*void (*pinit)(struct _tip_ *a, char *k[]);*/
	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)
	{
		
	 	/*a->ch=atoi(str_array[0]);
	 	a->uch=atoi(str_array[1]);
	 	a->sch=atoi(str_array[2]);
	 	a->shi=atoi(str_array[3]);
	 	a->usi=atoi(str_array[4]);
	 	a->i=atol(str_array[5]);
	 	a->ui=atol(str_array[6]);
	 	a->li=atol(str_array[7]);
	 	a->uli=atol(str_array[8]);
	 	a->fl=atol(str_array[9]);*/
	 	(*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;

}
Функция init2

Код:
#include "02.h"
#include <stdlib.h>

/*
 *	Data definition:
 */



/*
 *	Function(s) definition:
 */

/*---------------------------------------------------------------------*

Name		- init		

Usage		- в 02.с 

Prototype in	- 05.с	

Description	- Функция присваивает токены от разбиения строки элементам структуры

*---------------------------------------------------------------------*/
void init(struct _tip_ *a, char *str_array[])
{
	a->ch=atoi(str_array[0]);
	a->uch=atoi(str_array[1]);
	a->sch=atoi(str_array[2]);
	a->shi=atoi(str_array[3]);
	a->usi=atoi(str_array[4]);
	a->i=atol(str_array[5]);
	a->ui=atol(str_array[6]);
	a->li=atol(str_array[7]);
	a->uli=atol(str_array[8]);
	a->fl=atol(str_array[9]);
	
}
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 14:27   #12
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

4м параметром нужно передать указатель на функцию init, он не передан

Код:
if (!init_struct(&b,str,sep , init))
	{
		peremen(&b);
	}
	else
и видимо перед main'ом дописать
Код:
extern void init(struct _tip_ *a, char *str_array[]);
Хотя не ясно, т.к. хидеров нет.
Помог? Оставляем отзыв =)

Последний раз редактировалось Helloween; 17.03.2015 в 14:31.
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 14:35   #13
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
4м параметром нужно передать указатель на функцию init, он не передан

Код:
if (!init_struct(&b,str,sep , init))
	{
		peremen(&b);
	}
	else
и видимо перед main'ом дописать
Код:
extern void init(struct _tip_ *a, char *str_array[]);
Хотя не ясно, т.к. хидеров нет.
Спасибо, но компилятор ругается из-за области видимости
Где тогда объявить функцию init и указатель на нее, чтобы можно было и в мейне указывать и в init_struct обращаться?
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 14:36   #14
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
4м параметром нужно передать указатель на функцию init, он не передан

Код:
if (!init_struct(&b,str,sep , init))
	{
		peremen(&b);
	}
	else
и видимо перед main'ом дописать
Код:
extern void init(struct _tip_ *a, char *str_array[]);
Хотя не ясно, т.к. хидеров нет.
а можно и в хидере прописать объявление функции инит?
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 14:46   #15
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Да, если объявить в хидере, то при включении его прототип уже прописывать не нужно, главное следить чтоб хидер 2 раза не включался или делать стражи включения. Когда прописываешь #include "2.h" препроцессор вставит полностью весь текст файла 2.h в файл, в который он включен.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 14:56   #16
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Да, если объявить в хидере, то при включении его прототип уже прописывать не нужно, главное следить чтоб хидер 2 раза не включался или делать стражи включения. Когда прописываешь #include "2.h" препроцессор вставит полностью весь текст файла 2.h в файл, в который он включен.
Лучше я буду тогда прописывать в нужных файлах объявление.

В результате мейн будет имеет вид

Код:
#include <stdio.h>
#include "02.h"


/*
 *	Data definition:
 */
struct _tip_ b={		
	(char)0xFF, 
	0xFF, 
	(char)0xFF, 
	(short int)0xFFFF, 
	0xFFFF,
	0xFFFFFF,
	0xFFFFFF,
	0xFFFFFFFF,
	0xFFFFFFFF,
	0xFFFFFFFF
					};

/*union _dabl_ db={0xFFFFFFFFFFFFFFFF};*/

char str[]="12;1;14;55;645;17;28;9;93;890.92423523";
char sep[]=";";

extern void init(struct _tip_ *a, char *str_array[]);

/*
 *	Function(s) definition:
 */
int main()
{
	/*peremen(&b);	Вызов функции печати таблицы
	set_null(&st.b);
	peremen(&st.b);
	prnt_double(&db);
	set_str(&st);
	peremen(&st.b);*/
	if (!init_struct(&b,str,sep,init))
	{
		peremen(&b);
	}
	else 
	{
		printf("Ошибка\n");
	}
	return 0;
}
а init_struct

Код:
#include <stdio.h>
#include <string.h>
#include "02.h"
#include <stdlib.h>

/*
 *	Data definition:
 */
 void init(struct _tip_ *a, char *str_array[]);
/*
 *	Function(s) definition:
 */
/*---------------------------------------------------------------------*

Name		- init_struct

Usage		- main.c

Prototype in	-     02.c

Description	-  Инициализирует структуру полученными от разбиения строки Str лексемами.

*---------------------------------------------------------------------*/
int init_struct(struct _tip_ *a,char *b,char *c, void (*pinit)())
{
	char *pstr;
	char *savestr;
	char *str_array[20];
	int i=0;
	int rc=0;
	/*void (*pinit)(struct _tip_ *a, char *k[]);*/
	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)
	{
		
	 	/*a->ch=atoi(str_array[0]);
	 	a->uch=atoi(str_array[1]);
	 	a->sch=atoi(str_array[2]);
	 	a->shi=atoi(str_array[3]);
	 	a->usi=atoi(str_array[4]);
	 	a->i=atol(str_array[5]);
	 	a->ui=atol(str_array[6]);
	 	a->li=atol(str_array[7]);
	 	a->uli=atol(str_array[8]);
	 	a->fl=atol(str_array[9]);*/
	 	(*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;

}
init

Код:
#include "02.h"
#include <stdlib.h>

/*
 *	Data definition:
 */



/*
 *	Function(s) definition:
 */

/*---------------------------------------------------------------------*

Name		- init		

Usage		- в 02.с 

Prototype in	- 05.с	

Description	- Функция присваивает токены от разбиения строки элементам структуры

*---------------------------------------------------------------------*/
void init(struct _tip_ *a, char *str_array[])
{
	a->ch=atoi(str_array[0]);
	a->uch=atoi(str_array[1]);
	a->sch=atoi(str_array[2]);
	a->shi=atoi(str_array[3]);
	a->usi=atoi(str_array[4]);
	a->i=atol(str_array[5]);
	a->ui=atol(str_array[6]);
	a->li=atol(str_array[7]);
	a->uli=atol(str_array[8]);
	a->fl=atol(str_array[9]);
	
}
И тут вылезает ошибка сегментации. Мне кажется, что в мейне нужно все-таки через указатель передавать init в init_struct.
Или может быть я неправильные аргументы передаю указателю pinit в struct_init?

Ведь смысл какой, что а - это всего лишь прототип структуры, а менять мне нужно значения элементов структуры b, которая у меня инициализирована в мейне
Ka2R вне форума Ответить с цитированием
Старый 17.03.2015, 15:24   #17
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Ты и передаешь по указателю.
Код:
pinit=init;
- это зачем?
В таком случае зачем указатель на функцию вообще? Не проще ли вызвать init?
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.03.2015, 16:20   #18
Ka2R
Пользователь
 
Регистрация: 19.10.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Ты и передаешь по указателю.
Код:
pinit=init;
- это зачем?
В таком случае зачем указатель на функцию вообще? Не проще ли вызвать init?
Дошло! Все работает! Спасибо!
Ka2R вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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