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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 21:23   #1
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
Смех Рассудите функцию, работа с указателями

тут структура содержащая указатель на массив указателей на структуры и функция перебирающая массив указателей по указателю, возвращающая адрес структуры на которую указывает указатель в массиве указателей на который указывает указатель.
Вопрос в следующем, действительно ли возвращается адрес структуры на которую указывает указатель массива указателей на структуры, на который указывает указатель?

Код:
typedef unsigned char byte;

struct Node{
	byte 				n;
	struct Node**		next;
	struct Node*		prev;
};

struct Node receive(byte data, struct Node* node){
	while(*node -> next++ != NULL && (*node -> next) -> n != data);
	return **node -> next;
}
do not use your brain

Последний раз редактировалось Кащей; 20.08.2013 в 21:30.
Кащей вне форума Ответить с цитированием
Старый 20.08.2013, 21:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А отладчик что говорит?
Как по мне тут все верно если на глаз оценивать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.08.2013, 22:13   #3
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Цитата:
А отладчик что говорит?
В том то и херня, что я отладчиком(gdb) пользоваться так и не научился и ето пока единичная функция, а чтобы проверить надо структурок поназаполнять, а ето долго, лучше остальных функций за тоже время наделаю.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 21.08.2013, 00:16   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

А может лучше сначала этот код отладить?
Igor95 вне форума Ответить с цитированием
Старый 21.08.2013, 01:38   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
А может лучше сначала этот код отладить?
Это не есть путь настоящего джедая.
Настоящему джедаю некогда разбираться с отладчиками отладкой и тестированием.

Ему нужно фигачить километры кода не имея предсталений, работает ли он вообще.

Он не думает о том, как потом будет разгребать, когда там что-нибудь где-нибудь протухнет по дороге.
_Bers вне форума Ответить с цитированием
Старый 21.08.2013, 02:17   #6
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Это не есть путь настоящего джедая.
Настоящему джедаю некогда разбираться с отладчиками отладкой и тестированием.

Ему нужно фигачить километры кода не имея предсталений, работает ли он вообще.

Он не думает о том, как потом будет разгребать, когда там что-нибудь где-нибудь протухнет по дороге.
Да, что-то я протупил... про настоящих джедаев подзабыл
Igor95 вне форума Ответить с цитированием
Старый 21.08.2013, 04:15   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
тут структура содержащая указатель на массив указателей на структуры и функция перебирающая массив указателей по указателю, возвращающая адрес структуры на которую указывает указатель в массиве указателей на который указывает указатель.
Вопрос в следующем, действительно ли возвращается адрес структуры на которую указывает указатель массива указателей на структуры, на который указывает указатель?
Цитата:
Код:
struct Node receive(byte data, struct Node* node){
нет, адрес тут не возвращается.

Последний раз редактировалось rrrFer; 21.08.2013 в 04:23.
rrrFer вне форума Ответить с цитированием
Старый 21.08.2013, 21:01   #8
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Мозг свернулся, вроде как возвращается либо указатель на элемент массива указателей либо, что мне кажется вероятнее значение этого элемента на который указывает возвращаемый указатель, тоесть адрес структуры. В чём я ошибся?
Код:
typedef unsigned char byte;

struct Node{
	byte 				n;
	struct Node**		next;
	struct Node*		prev;
};

struct Node* traversal(byte data, struct Node* node){
	while(*node -> next != NULL && (*node -> next) -> n != data && *node -> next++ != NULL);
	return *node -> next;
}

int main(void){
	struct Node node[4];
	struct Node* t_node;
	
	node[0].n = 10;
	node[1].n = 20;
	node[2].n = 30;
	node[3].n = 40;
	
		node[0].next = malloc(sizeof(struct Node*) * 4);
		node[1].next = malloc(sizeof(struct Node*) * 4);
		node[2].next = malloc(sizeof(struct Node*) * 4);
		node[3].next = malloc(sizeof(struct Node*) * 4);
		
			node[0].next[3] = NULL;
			node[1].next[3] = NULL;
			node[2].next[3] = NULL;
			node[3].next[3] = NULL;
				
				node[0].next[0] = &node[1];
				node[0].next[1] = &node[2];
				node[0].next[2] = &node[3];
				
				node[1].next[0] = &node[2];
				node[1].next[1] = &node[3];
				node[1].next[2] = &node[0];
				
				node[2].next[0] = &node[3];
				node[2].next[1] = &node[0];
				node[2].next[2] = &node[1];
				
				node[3].next[0] = &node[0];
				node[3].next[1] = &node[1];
				node[3].next[2] = &node[2];

	t_node = traversal(10, &node[0]);
	printf("%d\n", t_node -> n);
	
	free(node[0].next);
	free(node[1].next);
	free(node[2].next);
	free(node[3].next);
	
	return 0;
}
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 21.08.2013, 23:42   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Возвращается адрес объекта, хранящийся в указателе, на который указывает Node **next.
Так нужно было, как я понял:
Код:
return *(node -> next)
Возможно ошибаюсь! Поправьте
+ после освобождения памяти нужно избавиться от висячих указателей
Igor95 вне форума Ответить с цитированием
Старый 22.08.2013, 00:16   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Начал разбирать Ваш код. Свернул всё в циклы для удобства.
Код:
#define COUNT 4
...
int
main(void)
{
    struct Node node[COUNT];
    struct Node* t_node;
    int i, j;

    for (i = 0; i < COUNT; ++i) {
        node[i].n = (i + 1) * 10;
        node[i].next = malloc(sizeof(struct Node*) * COUNT);
        node[i].next[COUNT - 1] = NULL;
        for (j = 0; j < COUNT - 1; ++j)
            node[i].next[j] = &node[(i + j + 1) % COUNT];
    }

    t_node = traversal(10, node);
    if (t_node != NULL)
        printf("%d\n", t_node->n);

    for (i = 0; i < COUNT; ++i) {
        free(node[i].next);
        node[i].next = NULL;
    }

    return 0;
}
Запнулся на функции поиска. Возник вопрос, а что собственно Вы хотите получить? Для чего нужна такая непонятная структура?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с указателями compiler90 Visual C++ 1 04.06.2012 18:52
Работа с указателями yaapelsinko Общие вопросы Delphi 3 15.02.2012 01:13
Работа с указателями Byurrer Общие вопросы C/C++ 8 02.04.2011 21:09
Работа с указателями stas135642 Общие вопросы C/C++ 2 21.11.2010 15:05
Работа с указателями Mango Помощь студентам 2 23.11.2008 10:33