Передача международного массива переменной длины как параметр функции в Objective C

Существует библиотека TimeZone общественного достояния для.NET . Действительно полезный. Это ответит на Ваши потребности.

Решение проблемы часового пояса общего случая более трудно, чем Вы думаете.

7
задан 9 September 2009 в 21:38
поделиться

4 ответа

Я бы написал это так:

- (void) testCall: (int *) aMatrice;

Это позволяет избежать множественных маллоков, а математика для вычисления единственного смещения в линейном массиве на основе координат x, y в 2D-массиве банально. Он также позволяет избежать множественных маллоков, подразумеваемых int **, и ограничений синтаксиса 2D-массива, закрепленных в языке.

Итак, если вам нужен массив 4x5, вы можете сделать:

#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)

int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW);

Затем вы можете инициализировать массив линейно или с вложенным циклом for:

for(int x=0; x<width; x++)
    for(int y=0; y<height; y++)
        myArray[INDEXOF(x,y)] = ... some value ...;

И вы должны передать его методу, например:

[foo testCall: myArray];

Хотя вы можете также перенести ширину и высоту или, еще лучше, создать подкласс IntMatrix для NSObject, который охватывает все арифметика указателей и хранение за пределами красивого чистого API.

(весь код введен в SO)

6
ответ дан 6 December 2019 в 21:17
поделиться

C arrays can't be variable in more than one dimension.

You can't have this:

int testarr[][] = {
  {1,1,1},
  {1,0,1,2},
  {1,1}
};

But you can have this:

int testarr[][3] = {
  {1,1,1},
  {1,0,1},
  {1,1,1},
  {4,5,6},
  {7,8,9}
}

foo(testarr);

void foo(int param[][3])
{
    printf("%d", param[3][1]); // prints 5
}
3
ответ дан 6 December 2019 в 21:17
поделиться

You can't use int[][] because the size of the second dimension affects how the array is laid out in memory. If you know the second dimension you can use int[][x], otherwise you'll have to use int** which can be accessed just like an array.

2
ответ дан 6 December 2019 в 21:17
поделиться

Why don't you just use NSArray or NSMutableArray with NSIntegers? Those array classes are of variable length, and much easier to use.

This would result in

- (void)testCall: (NSArray *) arr {
    NSLog(@"cell value is %u", [[arr objectAtIndex:1] objectAtIndex:1]);
}

(Of course, you would also have to define testarr using NSArray.)



If you really want to use C arrays, making the method argument a pointer to an int with

- (void)testCall: (int*) arr {

will probably work (with the rest of the code staying the same).

1
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: