Как передать двумерный массив структур в функцию? - PullRequest
0 голосов
/ 27 октября 2011

Существует двумерный массив структур, я передаю указатель массива на функцию:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(&result.capabilities);

Вызов функции вызывает ошибку:

Необработанное исключение при0x003c10f9 в solution.exe: 0xC0000005: Место записи о нарушении доступа,Оказалось, что 1х6.Часовая головная боль из-за этого.Покажите, как изменить тип аргумента или как ссылаться на элементы моего массива, чтобы все стало на свои места?

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Вы передаете указатель на указатель на возможности указателем.Вот почему у вас есть три звездочки вместо двух.

Попробуйте:

void init_capabilities(Capabilities ***capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %d\n",i,j);
            // Note: extra dereference:
            (*capabilities)[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

Или это:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(result.capabilities); // Note NO address-of operator

// Note: two stars, not three
void init_capabilities(Capabilities **capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %d\n",i,j);
            capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

Или, так каквы кодируете на C ++, а не на C:

// Assuming that result.capabilities and Capabilties::room_capabilities are declared
// vectors of the appropriate types ...
result.capabilities = std::vector<std::vector<Capabilities> >(std::vector<Capabilities>(8),6);
init_capabilities(result.capabilities);

void init_capabilities(std::vector<std::vector<Capabilities>& capabilities) {
    for(int i=0;i<capabilities.size();i++){
        for(int j=0;j<capabilties[i].size();j++){
            printf("%d %d\n",i,j);
            capabilities[i][j].room_capabilities.resize(rooms_count);
        }
    }
}
1 голос
/ 27 октября 2011

Объявите

void init_capabilities(Capabilities ***capabilities)

как

void init_capabilities(Capabilities **capabilities)

и вызовите

init_capabilities(result.capabilities); 

Вам просто нужно передать указатель на структуру массива, а не указательна указатель вашей структуры массива.

Редактировать : И, как уже отмечали другие, если вы собираетесь использовать C ++, вам действительно следует использовать new, как в:

result.capabilities = new (Capabilities *)[6];
for(int i=0;i<6;i++) {
  result.capabilities[i] = new Capabilities[8];
}
init_capabilities(result.capabilities);

...

void init_capabilities(Capabilities **capabilities) {
  for(int i=0;i<6;i++) {
    for(int j=0;j<8;j++) {
      capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
    }
  }
} 

И не забудьте использовать delete[].Более того, делайте так, как предлагает Роб, и используйте заранее определенные контейнеры C ++ для обработки такого рода вещей.Но если вы действительно хотите использовать небезопасные указатели, то, что у меня есть выше, должно помочь вам сделать это.

0 голосов
/ 27 октября 2011

У вас здесь целый ряд проблем:

  1. Вы выделяете место для каждой отдельной возможности, а затем создаете новый, превращающий выделенное пространство в мусор
  2. Вы относитесь возможности как 2d-массив, когда это на самом деле массив указателей в массивы
  3. Вы передаете адрес этого общего массива, но делаете нечего его почитать в функции

Пока вы не поймете, что вы пытаетесь сделать, КАК это сделать, придется подождать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...