Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2014, 23:15   #31
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Предлагаю переменные R1 и P1 - начальные координаты не платного и платного участков соответственно, передать в функцию через параметры по значению. Такую функцию будет легко использовать и в других программах. При этом, если программа будет модифицироваться, не возникнет проблем с недостачей переменных или с ситуацией, когда переменные будут модифицироваться в других частях программы.

Поскольку множество хранится как множество значений (занимает массив ячеек памяти), то его лучше передать в функцию по адресу.
При этом есть выбор: var либо const.
Пример:
Код:
function power(const aLP : set of byte; pR1, pP1 : integer): integer;
PS: Параметры передаются через стек. Если описать массив в виде параметра по значению, то в стек будет копироваться весь массив значений. Но можно передать только адрес памяти, с которого этот массив начинается (в стек копируется известное число байт).


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 09.12.2014, 00:25   #32
OldOwlOll
Форумчанин
 
Аватар для OldOwlOll
 
Регистрация: 28.11.2014
Сообщений: 172
По умолчанию

ViktorRСпасибо!
Еще раз прочитала о передаче параметров в подпрограммы. Вот ведь - понять-поняла, а использовать не сообразила.
Спасибо большое!

я так поняла, стандартной функции, которая определяла бы мощность множества, никто из посмотревших ветку не знает?...
Делать то, что любишь - это свобода. Любить то, что делаешь - счастье. (с)
Свободу киндерам!
Счастья всем. Бесплатно. И пусть никто не уйдет обиженным. (с)
OldOwlOll вне форума Ответить с цитированием
Старый 09.12.2014, 16:15   #33
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
я так поняла, стандартной функции, которая определяла бы мощность множества, никто из посмотревших ветку не знает?...
Ну норм.. Как бэ нет такой стандартной функции в FPC и Турбо..
Poma][a вне форума Ответить с цитированием
Старый 09.12.2014, 17:07   #34
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Для делфи, на паскале чуть переделать
Код:
function CapacityOfSet(pOfSet: Pointer): Word;
type TByte32 = array [0..31] of Byte;
var p: ^TByte32;
    i,j: Integer;
    b: Byte;
begin
  p:=pOfSet;
  Result:=0;
  for i:=Low(TByte32) to High(TByte32) do begin
    b:=p^[i];
    for j:=1 to 8 do begin
      if b and 1 <> 0 then Inc(Result);
      b:=b shr 1;
    end;
  end;
end;

procedure TForm1.Button9Click(Sender: TObject);
var m: set of Byte;
begin
  m:=[0,4..6,25,128,254];
  Label2.Caption:=IntToStr(CapacityOfSet(Addr(m)));
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 09.12.2014 в 19:43.
Аватар вне форума Ответить с цитированием
Старый 10.12.2014, 01:13   #35
OldOwlOll
Форумчанин
 
Аватар для OldOwlOll
 
Регистрация: 28.11.2014
Сообщений: 172
По умолчанию

Poma][a я подумала, что эта функция могла бы быть полезна в довольно широком круге задач... жаль что её нет в стандартных библиотеках

Аватар Спасибо
Пока это немного сложнее, чем я могу понять/сделать, с Delphi я еще не знакома, но обязательно вернусь к этому коду, когда буду знать больше

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

procedure TForm1.Button9Click
m:=[0,4..6,25,128,254];

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

function CapacityOfSet
type TByte32 = array [0..31] of Byte;

//вводится массив мощностью 32? почему именно такая мощность?

p:=pOfSet; //помещаем множество в массив?

можете пояснить, что происходит внутри цикла?
только, если можно, не кодом, а русским языком
Делать то, что любишь - это свобода. Любить то, что делаешь - счастье. (с)
Свободу киндерам!
Счастья всем. Бесплатно. И пусть никто не уйдет обиженным. (с)
OldOwlOll вне форума Ответить с цитированием
Старый 10.12.2014, 07:56   #36
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Цитата:
Сообщение от OldOwlOll Посмотреть сообщение
я так поняла, что это множество в процедуре обработки клика на кнопке. Почему именно эти числа? Или это произвольное множество?
Да, это просто случайный набор чисел для демонстрации.

Цитата:
вводится массив мощностью 32? почему именно такая мощность?
Это связано с тем, как компилятор обычно хранит множества в памяти. Каждому элементу сопоставляется один бит. Если элемент есть в множестве - бит установлен в единицу; если нет - сброшен.
В задаче рассматриваются множества значений типа byte (числа от 0 до 255); следовательно, для представления такого множества требуется 256 бит, или 256/8=32 байта )

Цитата:
можете пояснить, что происходит внутри цикла?
Если вкратце - в цикле функция обходит множество, проверяя каждый бит. Если бит установлен, значит элемент с таким номером присутствует в множестве, значит надо увеличивать счетчик.
А чтобы понять подробнее - нужно иметь представление о том, что такое указатели и как работают битовые операции. На данном этапе можно просто воспринимать это как a kind of magic, и вернуться после прочтения соответствующих глав в книжке
Son Of Pain вне форума Ответить с цитированием
Старый 10.12.2014, 09:53   #37
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Можно переделать для любого множества, передавая в качестве второго параметра мощность типа множества. А вообще полу-хакерский код в обход соглашений о типах аргументов и параметров
Код:
function CapacityOfSet(pOfSet: Pointer; CapacityOfType: Word): Word;
type TByte32 = array [0..31] of Byte;
var p: ^TByte32;
    i,j: Integer;
    b: Byte;
begin
  p:=pOfSet;
  Result:=0;
  for i:=0 to (CapacityOfType-1) div 8 do begin
    b:=p^[i];
    for j:=1 to 8 do begin
      if b and 1 <> 0 then Inc(Result);
      b:=b shr 1;
    end;
  end;
end;

procedure TForm1.Button9Click(Sender: TObject);
type Tnnn = (oo1,oo2,oo3=9,oo4);
var m1: set of Boolean;
    m2: set of Byte;
    m3: set of Tnnn;
    m4: set of AnsiChar;
begin
  m1:=[False];
  m2:=[2,5];
  m3:=[oo1,oo3,oo4];
  m4:=['>','Ж','Ю','.','~'];
  Label2.Caption:=IntToStr(CapacityOfSet(Addr(m1),Word(High(Boolean))-Word(Low(Boolean))+1));
  Label3.Caption:=IntToStr(CapacityOfSet(Addr(m2),Word(High(Byte))-Word(Low(Byte))+1));
  Label4.Caption:=IntToStr(CapacityOfSet(Addr(m3),Word(High(Tnnn))-Word(Low(Tnnn))+1));
  Label5.Caption:=IntToStr(CapacityOfSet(Addr(m4),Word(High(AnsiChar))-Word(Low(AnsiChar))+1));
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.12.2014 в 09:57.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД вопросы spqr82 Microsoft Office Access 3 04.07.2013 11:30
Вопросы по C++ ITTI Помощь студентам 7 20.12.2011 19:14
Вопросы по БД Rost93 PHP 9 28.06.2011 22:18
Вопросы по С++ Fantazerishka Общие вопросы C/C++ 2 19.05.2010 06:52
Вопросы по if, else? molodoyy Общие вопросы C/C++ 1 25.10.2008 18:55