Nano Hash - криптовалюты, майнинг, программирование

Массив структур переменного размера?

Я хочу сделать массив структур, размер которых известен только во время выполнения

NSMutableArray *styleSettingsArray = [NSMutableArray array];

NSString *fontAlignmentAttribute = [element attributeNamed:@"TextAlignment"];
if(fontAlignmentAttribute)
{
    CTTextAlignment alignment = [self getTextAlignment:fontAlignmentAttribute];
    CTParagraphStyleSetting styleSetting = {kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment};
    [styleSettingsArray addObject:[NSValue valueWithBytes:&styleSettings objCType:@encode(CTParagraphStyleSetting)]];
}

// other posible attributes

CTParagraphStyleRef paragraphStyleRef = CTParagraphStyleCreate((__bridge const CTParagraphStyleSetting *)(styleSettingsArray), [styleSettingsArray count]);
[dictionary setObject:(__bridge id)(paragraphStyleRef) forKey:(NSString*)kCTParagraphStyleAttributeName];
CFRelease(paragraphStyleRef);

Этот код не работает.

РЕДАКТИРОВАТЬ:

CTParagraphStyleCreate принимает указатель на массив CTParagraphStyleSetting, например

CTParagraphStyleSetting styleSettings[] = {
    { kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), alignment},
    {...},
    {...}
};

Как я могу выделить этот массив и добавить в него что-то, не зная, сколько в нем будет материала? (как мне использовать malloc?)

14.03.2013

  • Это работает, когда я использую CTParagraphStyleSetting styleSettings[] = {{kCTParagraphStyleSpecifierAlignment,sizeof(CTTextAlignment),alignment}}; , но когда я передаю NSMutableArray в CTParagraphStyleCreate, атрибуты не применяются к тексту 14.03.2013
  • Был ответ с упоминанием непрозрачных типов, не знаю, почему он удален. Если вы посмотрите на CTParagraphStyleCreate документацию, там есть ссылка на CTParagraphStyleSetting typedef, вы не можете просто привести NSArray к CTParagraphStyleSetting. 14.03.2013
  • Да. Не знаю, что случилось с вашим ответом. Я видел это, пытался добавить комментарий (редактирование). Я просмотрел документы, но не могу понять, что делать вместо NSArray 14.03.2013
  • @A-Live Я удалил ответ (фактически отредактировал его сейчас), так как он был неправильным. 14.03.2013
  • как сказал @trojanfoe в исходном ответе, вы захотите использовать специальный метод для создания переменных непрозрачного типа. Поиск в Google для CTParagraphStyleCreate дал мне пример за секунды :) 14.03.2013
  • @A-Live Это то, о чем я думал в первой части своего ответа, пока не понял, что ОП говорит о CTParagraphStyleSetting, которые на самом деле не непрозрачны (отсюда и необходимость отредактировать мой ответ). 14.03.2013

Ответы:


1

Чтобы избежать необходимости собирать количество атрибутов, а затем создавать их во втором проходе, я предлагаю использовать NSMutableData вместо простого массива C или malloc. Этот стиль позволит вам использовать существующий код с минимальными изменениями:

NSMutableData *styleSettingsArray = [NSMutableData array];

NSString *fontAlignmentAttribute = [element attributeNamed:@"TextAlignment"];
CTTextAlignment alignment;
if (fontAlignmentAttribute)
{
    alignment = [self getTextAlignment:fontAlignmentAttribute];
    CTParagraphStyleSetting styleSetting = { kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment};
    [styleSettingsArray appendBytes:&styleSetting length:sizeof(styleSetting)];
}

// other posible attributes
CTParagraphStyleRef paragraphStyleRef = CTParagraphStyleCreate([styleSettingsArray bytes], [styleSettingsArray length] / sizeof(CTParagraphStyleSetting));

Изменить. Обратите внимание на увеличение времени жизни переменной alignment по сравнению с вашим кодом. Это необходимо, потому что на него ссылаются после того, как заканчивается блок, в котором он был объявлен ранее.

14.03.2013
  • Я тоже не думаю, что это очень привлекательно; Я не вижу, как классы Objective-C/Core Foundation могут помочь с этой проблемой, которая существует в любом C API. Во всяком случае, С++ vector может оказаться лучшим решением, однако это выходит за рамки. 14.03.2013
  • @trojanfoe Я не уверен, какую проблему вы видите с этим кодом, но я думаю, что он точно решает проблему: потребность в массиве C, который растет по мере необходимости. Кроме того, это дает вам автоматическое управление памятью objc (нет необходимости освобождать какой-либо буфер). 14.03.2013
  • Больше всего мне не нравится преобразование нативных экземпляров struct в массивы байтов. Это кажется громоздким. Я не говорю, что это не сработает; просто это непривлекательно. 14.03.2013
  • @trojanfoe Мне это кажется гораздо более привлекательным, чем 1) подсчитать количество необходимых элементов, 2) выделить буфер, 3) скопировать структуры в буфер и 4) освободить буфер. Создается впечатление, что это предложение значительно упрощает задачу, особенно за счет отсутствия необходимости в двух проходах. 14.03.2013
  • Ну тогда каждому свое. 14.03.2013

  • 2

    Вы не можете смешивать коллекции Objective-C или Core Foundation с простыми массивами C таким образом. Кроме того, как вы узнали, вам нужно обернуть эти CTParagraphStyleSetting structs в NSNumber объекты, чтобы сохранить их. Какой беспорядок.

    Подход, который я бы выбрал, состоял бы в том, чтобы сделать 2 прохода; первый, чтобы определить, сколько атрибутов у вас есть, а второй, чтобы сгенерировать эти атрибуты.

    1. Повторите ваши условия, чтобы узнать, сколько атрибутов есть
    2. Выделите массив C (см. malloc()).
    3. Повторите ваши условия и сохраните атрибуты в динамическом массиве.
    4. Используйте массив для создания стиля.
    5. Освободите массив (см. free()).

    ПРИМЕЧАНИЕ Я отредактировал этот ответ, так как мой предыдущий ответ был далеко.

    14.03.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..