вернуть ссылку на динамически сгенерированный 2D массив - PullRequest
0 голосов
/ 16 апреля 2011
//header file

CGPoint **positions;

//Implementation file
int rows = 10;
int columns = 6;

positions = malloc(rows * sizeof(CGPoint));

for(int i=0; i<rows; i++){
    positions[i] = malloc(columns * sizeof(CGPoint));
}

positions[0][0] = CGPointMake(682, 0);
positions[0][1] = CGPointMake(682, 336);
positions[0][2] = CGPointMake(0, 0);
positions[0][3] = CGPointMake(-341, 336);
positions[0][4] = CGPointMake(0, 336);
positions[0][5] = CGPointMake(341, 0);

positions[1][0] = CGPointMake(341, 0);
positions[1][1] = CGPointMake(341, 336);
positions[1][2] = CGPointMake(682, 336);
positions[1][3] = CGPointMake(-341, 336);
positions[1][4] = CGPointMake(0, 336);
positions[1][5] = CGPointMake(0, 0);

//and so on..

Мне нужна помощь в написании следующей функции, которая будет возвращать случайное 2-е измерение позиций, подобных этой. возврат полных позиций подмассива [0] или позиций [1],

- (CGPoint *)point {
    return positions[arc4random() % rows];
}

1 Ответ

0 голосов
/ 16 апреля 2011
  • Вы должны распределить размер указателя, а не размер структуры.
  • CGPointMake(x, y) создать структуру в стеке, а не в куче. Спасибо @Bavarious за указание, что это такне правда.Смотрите комментарий ниже.:)

Код для выполнения того, что вы хотите:

unsigned int row = 10;
unsigned int column = 10;
CGPoint **points = malloc(row * sizeof(CGPoint *));
for (int r = 0; r < row; ++r) {
    points[r] = malloc(column * sizeof(CGPoint));
    for (int c = 0; c < column; ++c) {
        points[r][c].x = 0.0;
        points[r][c].y = 0.0;
    }
}

ВНИМАНИЕ: вы должны помнить об освобождении 2D-массива, когда он вам больше не нужен.Один из способов - обернуть его в оболочку Obj-C и сделать это в ваших init и dealloc.

...