Надеюсь, это поможет вам заранее.Во-первых, извините за мой английский.В нем может быть несколько грамматических или орфографических ошибок.
Проблема, которую я вижу в вашем коде, состоит в основном в том, что вы смешиваете определение указателя и реализацию одного и того же.
От ANSI C до C99, дажев C ++ (не тестировался в C #) существует большой взлом, использование указателей может быть полезно заранее: думаю, что указатель является первым элементом вектора, [0] one .
Отличным сайтом, объясняющим эту концепцию, является: http://boredzo.org/pointers/
Этот хак - простой перевод и хороший инструмент для лучшего понимания указателей.
Начните действовать, парни.
Функция, которую вы используете для добавления элементов в список,
int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
QueuedAction *newQueuedAction;
// Create a new action in memory
if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
return 0;
// Make the old 'lastAction' point to the new Action,
// and the new Action to point to NULL:
*lastAction -> nextAction = newQueuedAction;
newQueuedAction -> nextAction = NULL;
newQueuedAction -> action = newAction;
newQueuedAction -> value = newValue;
// Designate the new Action as the new lastAction:
*lastAction = newQueuedAction;
return 1;
}
Содержит некоторые ошибки.Прежде всего, используйте
*lastAction -> ...;
как
lastAction[0] -> ...;
Как видите, вы не можете использовать оператор -> для доступа к внутренним элементам.
То же самое происходит и здесь:
lastAction[0] = newQueuedAction;
Вы не можете скопировать указатель внутри структуры. lastAction , использующий этот хак для лучшего понимания, больше не является указателем - фактически, это содержимое первого элемента в структуре, назначенной компилятором, поэтому вам также нужно изменить эту строку, чтобы изменить значение указателя:
lastAction = newQueuedAction;
Используя этот перевод и аннотации, ваш код будет теперь:
int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
QueuedAction *newQueuedAction;
// Create a new action in memory
if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
return 0;
// Make the old 'lastAction' point to the new Action,
// and the new Action to point to NULL:
lastAction[0] -> nextAction = newQueuedAction;
newQueuedAction -> nextAction = NULL;
newQueuedAction -> action = newAction;
newQueuedAction -> value = newValue;
// Designate the new Action as the new lastAction:
lastAction[0] = newQueuedAction;
return 1;
}
Теперь ошибки видны: вы пытаетесьиспользовать оператор -> неправильно.Это означает, что ваш код будет изменен двумя способами:
Это выглядит так:
int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
QueuedAction *newQueuedAction;
// Create a new action in memory
if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
return 0;
// Make the old 'lastAction' point to the new Action,
// and the new Action to point to NULL:
lastAction -> nextAction = newQueuedAction;
newQueuedAction -> nextAction = NULL;
newQueuedAction -> action = newAction;
newQueuedAction -> value = newValue;
// Designate the new Action as the new lastAction:
lastAction = newQueuedAction;
return 1;
}
- Используйте оператор . с [0] hack
Это выглядит так:
int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
QueuedAction *newQueuedAction;
// Create a new action in memory
if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
return 0;
// Make the old 'lastAction' point to the new Action,
// and the new Action to point to NULL:
lastAction[0].nextAction = newQueuedAction;
newQueuedAction[0].nextAction = NULL;
newQueuedAction[0].action = newAction;
newQueuedAction[0].value = newValue;
// Designate the new Action as the new lastAction:
lastAction = newQueuedAction;
return 1;
}
И не забудьте стереть код == NULL , вы столкнетесь с пассивно-агрессивным программистом, который определяет NULL как что-то еще.Всегда используйте скобки для обеспечения расширяемости.Эта строка - только рекомендация стиля кода.
Надеюсь, это поможет,