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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2014, 10:43   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию Вопросы

День добрый.
Сразу прошу простить за такое название темы.. Каюсь.. Грешен..

Есть парочка вопросов. В дальнейшем я планирую иногда аппать тему (если Виталий и Серж не против)


#1
Вчера при решении задачи стало необходимо переводить числа из десятичной с.с. в любую другую.. Первый запрос в гугл дал прекрасную ссыль : тыц (нет, конечно, написать сее чудо - это дело 3 секунд, НО собирать велосипед, если он и так уже есть - не хочется..)
Всё хорошо.. Шлю на acmp тыц.. Получаю
Цитата:
Borland Delphi Version 15.0
Copyright (c) 1983,2002 Borland Software Corporation

task.pas(29) Error: Undeclared identifier: 'Dec2Numb'
Хорошо.. В фряхе эта функция лежит в StrUtils в дельфине не там.. Снова в гугл.. в делфи она в RxStrUtils.pas
Но (как я понял) дельфин просто берет названия модулей из исходника, прибавляет к ним '.tpu' и ищет в своих закромах.. Посему писать RxStrUtils и даже RxStrUtils.pas бессмысленно.. Вопрос.. что же делать?



#2
TList..
Пусть есть некий код..

Код:
uses Contnrs, Classes;

procedure InitList(var MyList : TList);
var
	p : PInteger;
	n, t, i : Integer;

begin
	MyList := TList.Create;

	ReadLn(n);
	for i := 1 to n do begin
		Read(t);
		New(p); p^ := t; 
		MyList.Add(p)
	end
end;

procedure PrintList(const MyList : TList);
var
	i : Integer;

begin
	for i := 0 to MyList.Count-1 do 
		Write(PInteger(MyList.Items[i])^, ' ');

	WriteLn
end;

procedure SwapElem(var a, b : TList);
var
	i : Integer;
begin
	for i := a.Count-1 downto 0 do begin
		if Odd(PInteger(a.Items[i])^) then begin
			b.Add(a.Items[i]);
			a.Delete(i)
		end
	end;

	for i := b.Count-1 downto 0 do begin
		if not Odd(PInteger(b.Items[i])^) then begin
			a.Add(b.Items[i]);
			b.Delete(i)
		end
	end
end;

var
	a, b : TList;

begin
	InitList(a);
	InitList(b);

	SwapElem(a, b);

	PrintList(a);
	PrintList(b);

	a.Free;
	b.Free
end.
2.1
Цитата:
Код:
for i := 0 to MyList.Count-1 do 
		Write(PInteger(MyList.Items[i])^, ' ');
Список подразумевает хранение указателя на следующий элемент.. Здесь же это нет.. и обращаюсь я к элементам как при обычном массиве..
Вопрос : правильно ли это? И как можно эта реализовать красивше?

2.2
<TList>.Free освободит память, которую используют указатели в нем?

Пока пожалуй всё.. Спасибо!
Удачи!

UPDATE
Ответ на 2.2 нашел..
НЕТ
Код:
fpc -gh <name.pas>
name
И всё стало ясно.. Спасибо!

Последний раз редактировалось Poma][a; 28.05.2014 в 10:56.
Poma][a вне форума Ответить с цитированием
Старый 28.05.2014, 10:58   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

1. RxStrUtils из RxLib. Оно тебе нужно? Могу код той процедуры здесь выложить
2. Если хочешь указатель на следующий, то храни ссылку на структуру
3. Нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.05.2014, 11:03   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
1. RxStrUtils из RxLib. Оно тебе нужно? Могу код той процедуры здесь выложить
Ее код я уже загугил.. да и такая же самописная есть.. интересовал именно вариант ее подключения..

Цитата:
2. Если хочешь указатель на следующий, то храни ссылку на структуру
А как? Отказаться от TList и написать свой? Или можно к этому прикрутить?
Цитата:
3. Нет
Ага.. Спасибо!
Poma][a вне форума Ответить с цитированием
Старый 28.05.2014, 11:10   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
type PMyRecord = ^MyRecord;
     MyRecord = record
       Value: Integer;
       Next: PMyRecord;
     end;
Тот PMyRecord вместо PInteger;
Цитата:
Отказаться от TList и написать свой? Или можно к этому прикрутить?
Можно как TList, так и свой динамический массив
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.05.2014 в 11:18.
Аватар вне форума Ответить с цитированием
Старый 28.05.2014, 11:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Error: Undeclared identifier: 'Dec2Numb'
Это потому что у них там компиль урезаный. Почитай на их форумах туча жалоб по поводу урезания.
ИМХО лучше написать свою и вставить, но под конкретную задачу, а не универсал.
Цитата:
Список подразумевает хранение указателя на следующий элемент.. Здесь же это нет.. и обращаюсь я к элементам как при обычном массиве..
Вопрос : правильно ли это? И как можно эта реализовать красивше?
Вместо TList использовать TObjectList и работать с классами а не с записями.
По крайней мере я так и поступаю. Ну или TComponentsList в зависимости от ситуации.
Цитата:
2.2
<TList>.Free освободит память, которую используют указатели в нем?
Из хелпа:
Цитата:
Destroys an instance of TList.

destructor Destroy; override;

Description

Do not call Destroy directly. Instead, call Free. Free verifies that the TList reference is not nil, and only then calls Destroy.

Destroy frees the memory used to store the list of items.

Note: Destroy does not free the memory pointed to by the elements of the list.
Цитата:
Deletes all items from the list.

procedure Clear; virtual;

Description

Call Clear to empty the Items array and set the Count to 0. Clear also frees the memory used to store the Items array and sets the Capacity to 0.
Вот перед освобождением Clear вызывай. Или надейся что винда сама все почистит.
Цитата:
если Виталий и Серж не против
Не вижу препятствий.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2014, 11:19   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Тот PMyRecord вместо PInteger;
Точняк! Огромное спасибо!


Цитата:
Это потому что у них там компиль урезаный. Почитай на их форумах туча жалоб по поводу урезания.
ИМХО лучше написать свою и вставить, но под конкретную задачу, а не универсал.
Пойду постучусь админу в асю.. Спрошу..

Цитата:
Вместо TList использовать TObjectList и работать с классами а не с записями.
Ага.. Спасибо!.. Щас гляну..

Цитата:
Вот перед освобождением Clear вызывай.
Ага.. Прекрасно..

Цитата:
Не вижу препятствий.
Очаровательно..

Огромное спасибо!

UPDATE
Цитата:
Вместо TList использовать TObjectList и работать с классами а не с записями.
А в чем разница? Там теже Items и будут..

Последний раз редактировалось Poma][a; 28.05.2014 в 11:25.
Poma][a вне форума Ответить с цитированием
Старый 28.05.2014, 11:26   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Это потому что у них там компиль урезаный
На счет того компиля не знаю, по-моему он от Д7. В Д7 Dec2Numb точно нет. Это из библиотеки RxLib.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.05.2014 в 11:31.
Аватар вне форума Ответить с цитированием
Старый 28.05.2014, 11:37   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
А в чем разница? Там теже Items и будут..
TObjectList это наследник TList. и он более функционален.
Приспособлен работать без указателей как таковых в твоей программе, в отличии от TList. Смотри:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses     contnrs,
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type
  MyClass=class
    i:integer;
    s:string;
  end;

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    l:TObjectList;
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  l.Free; // Освободит вложенные в контейнер обьекты сам
end;

procedure TForm1.FormCreate(Sender: TObject);
var obj:MyClass;   i:integer;
begin
  l:=TObjectList.create(true); // Указать что при освобождении объекта освобождать и содержимое


  //Внесем в контейнер данные:
  for i:=0 to 10 do
    with MyClass(l[l.Add(MyClass.Create)]) do begin
      i:=Random(100);
      s:=TimeToStr(time);
    end;

  for i:=0 to 10 do
    with MyClass(l[i]) do begin
     ShowMessage(s+' '+IntToStr(i));
    end;

end;

end.
Т.е. так сказать там уборщик мусора не спит в отличии от TList, а это уже приятно.
Да и данными управлять проще при помощи класса, а не разименовывания.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.05.2014, 11:40   #9
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Код:
//Внесем в контейнер данные:
  for i:=0 to 10 do
    with MyClass(l[l.Add(MyClass.Create)]) do begin
      i:=Random(100);
      s:=TimeToStr(time);
    end;
Забавно.. Спасибо.. Взял на вооружение..
Poma][a вне форума Ответить с цитированием
Старый 28.05.2014, 13:21   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Еще вопрос..
Почему сеё чудо не работает?
Повторения не должны учитывать.. Однако это не так..
Код:
uses Classes;
var
    n, m, i : Integer;
    s : string;
    SList : TStringList;

begin
    ReadLn(n, m);
    ReadLn(s);
    s := s+s;

    SList := TStringList.Create;
    SList.Duplicates := DupIgnore;
    for i := 1 to n do 
        SList.Add(Copy(s, i, m));

    for i := 0 to SList.Count-1 do
        Write(SList.ValueFromIndex[i], ' ');

    WriteLn(SList.Count);
    SList.Clear;
    SList.Free
end.
Poma][a вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы по БД Rost93 PHP 9 28.06.2011 22:18
Вопросы по С++ Fantazerishka Общие вопросы C/C++ 2 19.05.2010 06:52
Вопросы по if, else? molodoyy Помощь студентам 5 21.03.2010 15:34