Я не могу понять, почему приведенный ниже код возвращает указатель 0x1. Узел запаса найден нормально, как показано в следующем выводе:
ticket_name passed comparison.
ticket_type passed comparison.
ticket_zone passed comparison.
Но возвращенный указатель равен 0x1, и я пытаюсь сравнить этот указатель с указателями в связанном списке, чтобы удалить узел, что явно не работает. При компиляции тоже есть предупреждение о функции:
tm_options.c:85: warning: assignment makes pointer from integer without a cast
tm_options.c:190: warning: assignment makes pointer from integer without a cast
Насколько мне известно, это предупреждение связано с тем, что в функции отсутствует прототип функции, а тип возвращаемого значения по умолчанию для функций без прототипов — int. Но у меня есть прототип функции в tm_utility.h
EDIT: вот pastebin моего Makefile на всякий случай, если это как-то связано с ним http://pastebin.com/UFw9B4Hd
struct stock_node * find_ticket(tm_type_ptr tm, char *, char, char *);
Ниже приведена функция, которая возвращает значение ошибки:
struct stock_node * find_ticket(tm_type * tm, char * ticketName, char ticketType, char * ticketZone) {
struct stock_node * curr;
BOOLEAN found = FALSE;
curr = tm->stock->head_stock;
while (curr != NULL && found == FALSE) {
printf("curr: %p\n", (void *) curr);
printf("curr->ticket_name: %s\n", curr->data->ticket_name);
printf("curr->ticket_type: %c\n", curr->data->ticket_type);
printf("curr->ticket_zone: %s\n", curr->data->ticket_zone);
if (strncmp((char *)curr->data->ticket_name, ticketName, TICKET_NAME_LEN + 1) == 0) {
printf("ticket_name passed comparison.\n");
if ((char) curr->data->ticket_type == ticketType) {
printf("ticket_type passed comparison.\n");
if (strncmp((char *)curr->data->ticket_zone, ticketZone, TICKET_ZONE_LEN + 1) == 0) {
printf("ticket_zone passed comparison\n");
found = TRUE;
return curr;
}
}
} else {
curr = curr->next_node;
}
}
return NULL;
}
Любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать меня.
Код вызова:
struct stock_node * stockNode;
((stockNode = find_ticket(tm, ticketName, ticketType, ticketZone) != NULL))
По запросу: определение структуры stock_node:
typedef struct stock_node
{
struct stock_data * data;
struct stock_node * next_node;
} stock_node;
Кроме того, tm_type_ptr:
typedef struct tm * tm_type_ptr;
tm_utility.h
, чтобы избавиться от этих предупреждений? Компилятор может сгенерировать некорректный код, когда ему нужно угадать, как вызвать функцию без прототипа. - person user694733   schedule 12.11.2013tm_type_ptr
в вашем файле tm_utility.h? Разве это не должно бытьtm_type *
? Кроме того, можете ли вы показать нам структуруstruct stock_node
? - person Chandranshu   schedule 12.11.2013tm_utility.h
в файл, который вызываетfind_ticket
. Или вы получаете эти предупреждения отtm_utility.c
? В любом случае всегда сначала исправляйте предупреждения. - person user694733   schedule 12.11.2013find_ticket
вtm_utility.c
или каком-то другом модуле компиляции? - person user694733   schedule 12.11.2013#include "tm_utility.h"
вtm_options.c
тоже. - person user694733   schedule 12.11.2013