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

Размер опубликованного набора '%s' составляет ›4 байта. Как исправить эту ошибку компилятора?

У меня есть набор значений перечисления, которые имеют 138 значений. Что-то вроде:

type
  TSomething = (sOne, sTwo, sThree, ..., ..., sOnehundredAndThirtyeight);
  TSomethings = set of TSomething;

....

  TSomething = class(TPersistent)
  private
    fSomethings: TSomethings;
  published
    property Somethings: TSomethings read fSomethings write fSomethings;
  end;

При компиляции я получаю следующее сообщение об ошибке:

[DCC Error] uProfilesManagement.pas(20): E2187 Size of published set 'Something' is >4 bytes

Любая идея о том, как включить набор такого размера в опубликованное свойство?

Мне нужно включить этот набор в опубликованный раздел, потому что я использую OmniXMLPersistent для сохранения класса в XML, а он сохраняет только опубликованные свойства.

23.01.2010

  • Действительно ли в сообщении об ошибке указано %s? Если да, вы должны сообщить об этом в Центр качества как об ошибке, поскольку они, по-видимому, забыли вызвать Format или не передали имя свойства с этим сообщением об ошибке. 23.01.2010
  • Нет, сообщение об ошибке [Ошибка DCC] uProfilesManagement.pas(20): E2187 Размер опубликованного набора «Что-то» составляет >4 байта, как указано в тексте вопроса. 24.01.2010

Ответы:


1

Возможно, вам понадобится следующий трюк (я не использую OmniXML и не могу его проверить):

type
  TSomething = (sOne, sTwo, sThree, ..., sOnehundredAndThirtyeight);
  TSomethings = set of TSomething;

  TSomethingClass = class(TPersistent)
  private
    fSomethings: TSomethings;
    function GetSomethings: string;
    procedure SetSomethings(const Value: string);
  published
    property Somethings: string read GetSomethings write SetSomethings;
  end;


{ TSomethingClass }

function TSomethingClass.GetSomethings: string;
var
  thing: TSomeThing;
begin
  Result:= '';
  for thing:= Low(TSomething) to High(TSomething) do begin
    if thing in fSomethings then Result:= Result+'1'
    else Result:= Result+'0';
  end;
end;

procedure TSomethingClass.SetSomethings(const Value: string);
var
  I: Integer;
  thing: TSomeThing;
begin
  fSomethings:= [];
  for I:= 0 to length(Value) - 1 do begin
    if Value[I+1] = '1' then Include(fSomethings, TSomething(I));
  end;
end;
23.01.2010
  • Спасибо за ответ. Любая идея о том, как использовать GetSetProp и SetSetProp (из модуля TypInfo), чтобы автоматически получить набор в виде строки и вернуть его в исходное состояние из строки? Я только что создал еще один вопрос специально для этого: stackoverflow.com/questions/2127079/ 24.01.2010

  • 2

    К сожалению, компилятор не позволяет содержать наборы больше 32 бит в публикуемом разделе. Размер набора в байтах можно вычислить с помощью High(set) div 8 - Low(set) div 8 + 1.

    Вы можете либо уменьшить размер набора, либо использовать собственный класс вместо набора, либо разделить перечисление на несколько наборов, каждый из которых имеет размер 32 бита.

    23.01.2010
  • Спасибо за ответ. Разделение перечисления повлечет за собой большое количество изменений в коде приложения, поэтому об этом не может быть и речи. Любая идея, как я мог бы создать собственный класс, который будет реплицировать набор? 23.01.2010
  • @smartin: К сожалению, вам нужно 18 байт. Может быть, привести его к достаточно большому массиву байтов? 23.01.2010
  • Новые материалы

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

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

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

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

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

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

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