![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с несложной программой пожалуйста))) [D7]
vit196sh © (2011-11-30 03:13:00)program Project1;
{$APPTYPE CONSOLE}
type tst=array[1..100]of string[15];
procedure word(st:string;var k:Byte; b:tst);
var i:Byte;a:array[1..100]of string[15];
begin
st:=st+' ';k:=1;
a[1]:='0';
a[2]:='1';
a[3]:='2';
a[4]:='3';
a[5]:='4';
a[6]:='5';
a[7]:='6';
a[8]:='7';
a[9]:='8';
a[10]:='9';
while Length(st)>0 do
begin
if Pos(' ',st)=1 then Delete(st,1,1);
for i:=1 to 10 do
if st[1]=a[i] then begin
b[k]:=Copy(st,1,Pos(' ',st)-1);k:=k+1;
end;
Delete(st,1,Pos(' ',st)-1);
end;
end;
var a:tst;
st:string;k,i:Byte;
BEGIN
k:=1;
Writeln('insert yous text');readln(st);Writeln(st);
word(st,k,a);
for i:=1 to k do
Writeln(a[i]);
Readln;
END.
прога должна переписать числа из текста в отдельный массив ,когда компилирую выдает ошибку runtime error 216 at 00404230 .Я никак не могу понять что не так .Помогите пожалуйста))))
Ega23 (2011-11-30 13:15:00) [1]
> Кроме того, дженерик, поскольку использует дин. массив,
> вынужден устраивать "зачистку" после изменения длины, что
> - время.
А TList, блин, не использует дин.массив, да?
> TList быстрее, чем TList<T>
Смотря в чём. Смотря где. Смотря как.
Jeer (2011-11-30 13:01:00) [2]Кроме того, дженерик, поскольку использует дин. массив, вынужден устраивать "зачистку" после изменения длины, что - время.
Jeer (2011-11-30 12:59:00) [3]
> Ega23 © (30.11.11 12:05) [11]
Я о дженерике, а не стандартном TList.
TList быстрее, чем TList<T>
Dennis I. Komarov (2011-11-30 12:06:00) [4]Спасиб, сейчас накачу update в мозг... :)
Ega23 (2011-11-30 12:05:00) [5]
> + медленнее за счет более "жадного" алгоритма реаллока.
Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.
Jeer (2011-11-30 11:58:00) [6]
> Собственно, это и есть дин.массив, просто он в привате сидит
> и реаллок несколько иначе реализован.
>
Да.
+ медленнее за счет более "жадного" алгоритма реаллока.
Ega23 (2011-11-30 10:37:00) [7]
> В чем отличия от обычного TList?
http://www.tdelphiblog.com/2009/07/generics-delphi-2009-win32-1.html
> В данном случае - список integer ( аля дин. массив ).
Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.
Jeer (2011-11-30 09:51:00) [8]Дженерики ( обобщения ).
Обычный TList - список указателей.
Обобщения позволяют создавать список оговоренного типа данных.
В данном случае - список integer ( аля дин. массив ).
Dennis I. Komarov (2011-11-30 09:32:00) [9]
> FData: TList<Integer>;
Я понимаю, что я из каменного, но это что за конструкция? В чем отличия от обычного TList?
Jeer (2011-11-30 09:30:00) [10]
> Ega23 © (30.11.11 08:00) [5]
Теперь аффтар сюда долго не зайдет :)
Ega23 (2011-11-30 08:00:00) [11]
unit Unit12;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Generics.Collections, StdCtrls;
type
TNumericalData = class (TObject)
private
FData: TList<Integer>;
procedure AddToken(var Token: string); inline;
public
constructor Create;
destructor Destroy; override;
procedure Execute(const Value: string);
property Data: TList<Integer> read FData;
end;
TForm12 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form12: TForm12;
implementation
{$R *.dfm}
{ TNumericalData }
//*****************************************************************************
procedure TNumericalData.AddToken(var Token: string);
var
i: Integer;
begin
if TryStrToInt(Token, i) then
if FData.IndexOf(i) = -1 then
FData.Add(i);
Token := '';
end;
//*****************************************************************************
constructor TNumericalData.Create;
begin
inherited;
FData := TList<Integer>.Create;
end;
//*****************************************************************************
destructor TNumericalData.Destroy;
begin
FData.Free;
inherited;
end;
//*****************************************************************************
procedure TNumericalData.Execute(const Value: string);
var
i: Integer;
aToken: string;
begin
FData.Clear;
aToken := '';
for i := 1 to Length(Value) do
if Value[i] in ['0'..'9'] then
aToken := aToken + Value[i]
else
AddToken(aToken);
AddToken(aToken);
end;
//*****************************************************************************
{TForm12}
//*****************************************************************************
procedure TForm12.Button1Click(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
with TNumericalData.Create do
try
Execute(Edit1.Text);
for i := 0 to Data.Count - 1 do
Memo1.Lines.Add(IntToStr(Data[i]));
finally
Free;
end;
end;
//*****************************************************************************
end.
Германн (2011-11-30 06:25:00) [12]
> когда компилирую выдает ошибку runtime error 216 at 00404230
Не ври. При компиляции такой ошибки не бывает.
Ну а код просто "ужас, летящий на крыльях ночи"! :)
KilkennyCat (2011-11-30 04:33:00) [13]:) че-то я туплю.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := '';
while i <= Length(st) do begin
if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
b[k] := tempStr;
tempStr := '';
inc(k);
end;
inc(i);
end;
наверное, все равнго накосячил, пофиг, спать пора.
KilkennyCat (2011-11-30 04:25:00) [14]ошибся.
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := '';
while k >= Length(st) do begin
if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
b[k] := tempStr;
tempStr := '';
end;
inc(k);
end;
KilkennyCat (2011-11-30 04:23:00) [15]
> a[1]:='0';
> a[2]:='1';
> a[3]:='2';
> a[4]:='3';
> a[5]:='4';
> a[6]:='5';
> a[7]:='6';
> a[8]:='7';
> a[9]:='8';
> a[10]:='9';
жуть
procedure word(st:string;var k:Byte; b:tst);
var
i : Byte;
tempStr : String;
begin
i := 1;
tempStr := '';
while Length(st) > 0 do begin
if st[i] in ['0'..'9'] then tempStr := tempStr + st[i] else begin
b[k] := tempStr;
tempStr := '';
inc(k);
end;
end;
и вообще логичнее использовать динамический массив, ибо тут неизвестно количество элементов.