2015-03-01 2 views
-1

Я только начал изучать C, исходя из фона Java. У меня возникают проблемы с несколькими строками в моем коде. Я пытаюсь скопировать то, что я видел в других потоках, но, честно говоря, он все еще дает ошибки.Проблема с указателем в C

В любом случае, я просто пытаюсь передать эти структуры по ссылке, но я получаю эти четыре ошибки.

Errors

printCard(&shuttleArray[i][j]); // Line 183 

где printCard() 'заголовок s выглядит следующим образом:

void printCard(struct Card* card) 

Тогда

struct Card shuttleArray[14][4]; 
initMapping(&shuttleArray); // Line 199 
initMapping(&mapping); // Line 343 

Где initMapping()' заголовок s является

void initMapping(struct Card* array[14][4]) 

И, наконец, линия 229

printSpaceShuttleWithoutWings(&shuttleArray, shuttleCount); // Line 229 

Где его заголовок

void printSpaceShuttleWithoutWings(struct Card* shuttleArray[14][4], int shuttleCount) 

Спасибо за вашу помощь.

+2

Прочитайте то, что сообщения об ошибках говорят вам, и решить проблемы, которые они описывают. –

+1

В c нет такой вещи, вы не можете передавать что-либо по ссылке, потому что этого не существует на языке c, вы передаете указатель, указывающий на адрес параметра, который вы получаете с помощью ** адреса ** оператор '&'. Для программистов, начинающих с таких языков, как Java, всегда очень важно понять эти вещи, поэтому, когда кто-то спрашивает меня, какой язык мне следует изучать первым? _ Я отвечаю -> c. –

+1

@Robert, теперь, если бы я смог их интерпретировать, я бы не стал публиковать здесь сейчас, если бы я ... Ты помог - это непреодолимо полезно. – Peter

ответ

2
void initMapping(struct Card* array[14][4]) 

объявляет функцию, которая принимает двумерный массив указателей на struct Card.

struct Card shuttleArray[14][4]; 

не является массивом указателей на struct Card, поэтому толкая его в этом слоте параметра не представляется возможным. То же самое относится к printSpaceShuttleWithoutWings, так и внутри, где printSpaceShuttleWithoutWingsshuttleArray объявлен как массив указателей,

printCard(&shuttleArray[i][j]); 

попытки совать struct Card** в качестве параметра struct Card*.

самый здравомыслящий способ решить эту проблему, я думаю, было бы написать

void initMapping(struct Card array[14][4]); 
// or, equivalently, one of 
// 
// void initMapping(struct Card array[][4]); 
// void initMapping(struct Card (*array)[4]); 
// 
// The same needs to be done for printSpaceShuttleWithoutWings. 

... 

initMapping(shuttleArray); 

Это заявляет, что array должен быть указателем на одномерные массивы четыре struct Card s каждый, и shuttleArray является , в вызове функции, затухает до указателя на его первый подмассив. array[i] является тогда i-м подмассивом shuttleArray, и выражения array[i][j] и &array[i][j] работают так, как вы ожидали.

В объявлениях параметров функций синтаксис массива предназначен для удобочитаемости; объявленный параметр по-прежнему является указателем. Внешняя степень массива, если она задана, игнорируется.

Примечание стороны: Было бы возможно сделать вызов

initMapping(&shuttleArray) 

компиляции, объявив initMapping в

void initMapping(struct Card (*array)[14][4]); 

... который объявляет array быть указателем на два -мерный массив struct Card s. Однако это сделало бы использование его внутри функции более громоздким; где с вышеуказанным кодом вы можете написать array[i][j], вам нужно будет написать (*array)[i][j].

0

Другой способ сделать это с помощью typedef. Добавьте следующую строку в свой код, а затем отправьте arr.

typedef struct Card arr[14][4]; 

, а затем объявить функции, как показано ниже

void printCard(arr *array) 
void initMapping(arr *array) 
void printSpaceShuttleWithoutWings(arr *shuttleArray, int shuttleCount) 
Смежные вопросы