Немного фона:
- Я давний читатель, но впервые постер. У меня скромный опыт в Java, но очень мало в C.
- Я создал двусвязный список, где данные в каждом узле на самом деле являются структурой игрока.
- Я успешно заполнил структуры для каждого узла в списке.
- Я провел обширное тестирование самого списка, и он ведет себя так, как ожидалось.
- Я хочу, чтобы каждый узел в связанном списке имел пустой указатель, так как я планирую использовать этот код для нескольких различных типов списков, которые в конечном итоге взаимодействуют друг с другом.
- Мой подход заключался в том, чтобы сначала хранить значения, считанные из файла, в массиве, а затем считывать эти данные в элемент данных каждого узла. Кажется, это удалось.
Моя проблема: когда я пытаюсь получить доступ к значениям отдельных элементов в структуре игрока, я получаю ерунду. Я почти уверен, что это проблема с указателем, так как до сих пор это была моя самая большая слабость с C. Соответствующий код:
Я показываю структуры на всякий случай, если я не понял. Обратите внимание на указатель void в Node, который в итоге указывает на структуру Player:
struct Node;
typedef struct Node {
void *data;
struct Node *prev;
struct Node *next;
} Node;
typedef struct Player {
char *name;
char *pos;
double *num;
} Player ;
Я включаю написанный мной код, в котором я добавляю данные из массива в список и распечатываю результаты. Я также показываю результирующий вывод консоли.
// char *vals[linesInFile][3] has already been declared.
// List playerList has already been created and initialized; it currently has 0 nodes.
// int i represents the number of nodes in the list.
// getNode and addNode do just what you'd expect them to do. Both functions have been thoroughly tested.`
Player *player = calloc(1, sizeof(Player));
int n;
for(n = 0; n < i; n++) {
if(vals[n][0] != NULL) {
addNode(playerList, n, NULL);
getNode(playerList, n)->data = &player;
((Player *)getNode(playerList, n)->data)->name = vals[n][0];
((Player *)getNode(playerList, n)->data)->pos = vals[n][1];
((Player *)getNode(playerList, n)->data)->num = vals[n][2];
printf("%d: %s\n", n, ((Player *)getNode(playerList, n)->data)->name);
printf("%d: %s\n", n, ((Player *)getNode(playerList, n)->data)->pos);
printf("%d: %s\n", n, ((Player *)getNode(playerList, n)->data)->num);
printf("\n");
}
}
0: Майк Траут
0: CF
0: 42761: Брайс Харпер
1: LF
1: 45992: Хосе Фернандес
2: СП
2: 5023
Пока все работает нормально. Наконец, я включаю написанный мной фрагмент кода, который пытается найти значения структуры player из функции main.
// The getSize method has been tested and correctly returns the size of a list.
int i;
for(i = 0; i < getSize(playerList); i++) {
printf("%d: %s\n", i, ((Player *)getNode(playerList, i)->data)->name);
// The output from this is garbage.
char *playerName = ((Player *)getNode(playerList, i)->data)->name;
printf("%d: %s\n", i, playerName);
// The output from this is garbage.
}
Я не уверен, что весь код, предшествующий этому последнему блоку, верен, но, по крайней мере, кажется, что он дает желаемый результат. Надеюсь, это просто простая проблема с указателем в последнем блоке кода. В любом случае, любая помощь будет принята с благодарностью.
strdup
не является стандартной функцией (C-) и может быть недоступна на ваша платформа. 09.03.2014strdup
полеnum
, которое является указателем наdouble
? Вероятно, это было неправильно с самого начала, но это только усугубляет проблему. 09.03.2014