Создание частного двумерного массива с плавающей точкой - Цель C - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь создать частный двумерный массив с плавающей точкой и инициализировать его в конструкторе. Я получаю ошибку "Ожидаемое выражение". Я долго искал и ничего не мог найти.

Вот мой код:

@interface SampleClass : NSObject{
@private
    float stops[2][2];
}

@end

@implementation SampleClass

- (id) init{
    self = [super init]; // Edited
    stops = { {1.0, 1.0}, {1.0, 2.0} }; // It gives "Expected Expression" at this line
    return self;
}

@end

Я пробовал разные версии, такие как:

stops = { {1.0, 1.0}, {1.0, 2.0} };
stops = { 1.0, 1.0, 1.0, 2.0 };
stops[][] = { {1.0, 1.0}, {1.0, 2.0} };

Ни один из них, похоже, не работает.

Я новичок в Задаче C, поэтому любая рекомендация приветствуется.

1 Ответ

0 голосов
/ 03 июля 2018

(Objective-) C не поддерживает присвоение одного массива другому, есть обходные пути, включающие struct, так как они назначаемы, но вам не нужно идти туда.

Если вам нужен постоянный массив, который будет использоваться экземплярами, вы можете просто объявить его как static:

static const float stops[2][2] = { {27.3, 51.7}, {93.2, 42.24}};

static делает stops доступным только для кода в том же файле. Вы можете поместить объявление между @implementation и @end, чтобы хотя бы визуально связать его с принадлежностью к классу.

Выше не подходит, если вам нужен массив переменных, но он является частью решения. Сохраните переменную вашего экземпляра:

@private
   float stops[2][2];

должен быть массивом, а не каким-либо указателем, так как он должен распределять пространство для ваших float. Затем используйте вышеуказанное объявление, но дайте ему другое имя:

static const float _stops_init[2][2] = { {27.3, 51.7}, {93.2, 42.24}};

и затем в вашем init используйте стандартную функцию C memcpy(), чтобы скопировать значения в памяти, занятой _stops_init, в память, занятую stops:

memcpy(stops, _stops_init, sizeof(_stops_init));

Здесь sizeof() вернет общий размер в байтах памяти, используемой вашим массивом с плавающей запятой _stops_init, а memcpy() копирует эти байты по сравнению с байтами, связанными с stops - то есть реализует присвоение массива, которое C не делает т напрямую поддерживаю.

Используя массив static const вместо локальной переменной, определите в init(), поскольку источник ваших значений сохраняет воссоздание источника при каждом вызове init().

Приведенный выше код не выполняет всех проверок, которые он должен выполнять - рекомендуется, как минимум, assert() проверка того, что размеры stops и _stops_init одинаковы.

НТН

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