Як перадаць двухмерных масіў структур функцыянаваць?

Існуе двухмерных масіў структур, я перадаю паказальнік масіва ў функцыю:

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 :. Парушэнне правоў доступу месца для запісу 0xfdfdfdfd

Вось мая функцыя:

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];
        }
    }
}

Я думаў, што памернасць масіва магчымасці - 6x8. Аказалася, што 1x6. Гадзіну галаўны боль з-за гэтага. Паказаць вам, як змяніць тып аргументу ці як спасылацца на элементы майго масіва, так што ўсё ўстала на свае месцы?

0
Ня быць тры зоркі праграміста . Гэта прыносіць толькі боль.
дададзена аўтар R. Martinho Fernandes, крыніца
Гэта сапраўды дрэнна ++ код сумесі C/C. І калі я кажу дрэнна, я <�я> значыць . Не выкарыстоўвайце Таноса у C ++. Выкарыстоўвайце спасылкі ў C ++ кожны раз, калі гэта магчыма, і устроиств магчымая.
дададзена аўтар Xeo, крыніца
Ці з'яўляецца гэта C ці C ++? Таму што я думаю, што я магу вам дапамагчы, калі вы пішаце ў C ++, выкарыстоўваючы новы замест Таноса() , які C ++ забяспечвае (што дае больш чысты, просты сінтаксіс і бяспечней чым Таноса() IIRC).
дададзена аўтар dmn, крыніца

3 адказы

Вы перадаеце свой паказальнік на паказальнік на Capabilities паказальніка. Менавіта таму ў вас ёсць тры зорачкі замест двух.

Паспрабуйце гэта:

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];
        }
    }
}

Or this:

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(8),6);
init_capabilities(result.capabilities);

void init_capabilities(std::vector& capabilities) {
    for(int i=0;i
2
дададзена
. У init_capabilities , не павiнна быць замест -> ?
дададзена аўтар anatolyg, крыніца
@anatolyg - вы, верагодна, маюць рацыю. Я змяніў яго.
дададзена аўтар Robᵩ, крыніца

дэклараваць

void init_capabilities(Capabilities ***capabilities)

у якасці

void init_capabilities(Capabilities **capabilities)

і патэлефанаваць па

init_capabilities(result.capabilities); 

You just need to pу якасціs the pointer to your array structure, not a pointer to the pointer of your array structure.

Edit: And у якасці others have pointed out, if you're going to use C++ you should really be using new у якасці in:

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];
    }
  }
} 

And don't forget to use delete[]. Better yet, do у якасці Rob suggests and use the pre-defined C++ containers to handle this sort of thing. But if you really want to use unsafe pointers, what I have above should get it done for you.

1
дададзена

У вас ёсць цэлы шэраг праблем тут:

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

Да таго часу, пакуль вы не атрымаеце прама, што вы спрабуеце зрабіць, як зрабіць гэта прыйдзецца пачакаць.

0
дададзена