Вопрос по arrays, objective-c – Декларация двухмерного массива - Цель C

1

Есть ли способ объявить 2D массив целых чисел в два этапа? У меня проблема с областью применения. Вот что я пытаюсь сделать:

<code>//I know Java, so this is an example of what I am trying to replicate:

int Array[][];
Array = new int[10][10];
</code>

Теперь, в OBJ-C я хочу сделать что-то подобное, но я не могу понять синтаксис правильно. Прямо сейчас у меня есть это в один шаг, но я не могу использовать его вне If-Statement, в котором я в настоящее время имею это:

<code>int Array[10][10]; //This is based on an example I found online, but I need 
                   //to define the size on a seperate line than the allocation
</code>

Кто-нибудь может мне помочь с этим? Я знаю, что это, вероятно, более простой вопрос, но вы не можете использовать ключевое слово & quot; new & quot; за пределами сообщения (насколько мне известно), и вы не можете отправлять сообщения в Ints. :(

*EDIT 1:**

Моя проблема связана с объемом.

<code>//Declare Array Somehow
Array[][] //i know this isn't valid, but I need it without size

//if statement
if(condition)
Array[1][2]
else
Array[3][4]

//I need to access it outside of those IFs

//... later in code
Array[0][0] = 5;
</code>
Вы Не должны использоватьnew вообще в Objective-C. rid

Ваш Ответ

2   ответа
4

если вы знаете размер одной из границ:

int (*myArray)[dim2];

myArray = calloc(dim1, sizeof(*myArray));

И его можно освободить одним вызовом:

free(myArray);

К сожалению, одна из границ ДОЛЖНА быть исправлена, чтобы это работало.

Однако, если вы не знаете ни одной из границ, это тоже должно сработать:

static inline int **create2dArray(int w, int h)
{
    size_t size = sizeof(int) * 2 + w * sizeof(int *);
    int **arr = malloc(size);
    int *sizes = (int *) arr;
    sizes[0] = w;
    sizes[1] = h; 
    arr = (int **) (sizes + 2);

    for (int i = 0; i < w; i++)
    {
        arr[i] = calloc(h, sizeof(**arr));
    }

    return arr;
}

static inline void free2dArray(int **arr)
{
     int *sizes = (int *) arr;
     int w = sizes[-2];
     int h = sizes[-1];

     for (int i = 0; i < w; i++)
         free(arr[i]);

     free(&sizes[-2]);
}
Первый метод сработал для меня. (К счастью, у меня было 1 фиксированное измерение !!) Большое спасибо !! MrHappyAsthma
this - прекрасное решение для создания 2d массивов переменного размера. обратите внимание, что h не используется в free2dArray (•) Arseniy Banayev
0

int Array[10][10];) в порядке и будет действительным для области, в которой оно было объявлено, если вы сделаете это в области действия класса, то оно будет действительным для всего класса.

Если размер массива меняется, либо используйте динамическое распределение (например,malloc и друзья) или используйтеNSMutableArray (для непримитивных типов данных)

Мне нужен доступ к нему за рамками. Размер массива варьируется в зависимости от набора операторов If-Else, но тогда я не могу использовать переменную вне зависимости от того, какой IF / Else используется. MrHappyAsthma
смотри редактировать ... ... MByD
Я отредактировал основной пост, чтобы лучше описать свой вопрос, но, полагаю, я мог бы использовать NSMutableArray. Я работаю исключительно со значениями "int", поэтому я пытался придерживаться примитивных типов, чтобы мне не приходилось постоянно отправлять сообщения для [intValue] и подобных MrHappyAsthma
@ MrHappyAsthma Вы НЕ должны использовать NSArray для хранения целых чисел, он не предназначен для этого. Вы всегда должны использовать массивы C для такого рода вещей или вектор / массив C ++. Richard J. Ross III
Это то, что я считал лучшим. Я просто не могу найти способ удовлетворить мою ситуацию с помощью примитивного массива. Я не знаю размер массива до условных операторов IF, но мне все еще нужен доступ к нему вне области действия оператора IF. MrHappyAsthma

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