Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.11;
Скачать: CL | DM;

Вниз

Помогите с несложной программой пожалуйста)))   Найти похожие ветки 

 
vit196sh ©   (2011-11-30 03:13) [0]

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 .Я никак не могу понять что не так .Помогите пожалуйста))))


 
KilkennyCat ©   (2011-11-30 04:23) [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";

жуть


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;

и вообще логичнее использовать динамический массив, ибо тут неизвестно количество элементов.


 
KilkennyCat ©   (2011-11-30 04:25) [2]

ошибся.
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:33) [3]

:) че-то я туплю.
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;

наверное, все равнго накосячил, пофиг, спать пора.


 
Германн ©   (2011-11-30 06:25) [4]


> когда компилирую выдает ошибку runtime error 216 at 00404230

Не ври. При компиляции такой ошибки не бывает.
Ну а код просто "ужас, летящий на крыльях ночи"! :)


 
Ega23 ©   (2011-11-30 08:00) [5]


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.


 
Jeer ©   (2011-11-30 09:30) [6]


> Ega23 ©   (30.11.11 08:00) [5]


Теперь аффтар сюда долго не зайдет :)


 
Dennis I. Komarov ©   (2011-11-30 09:32) [7]


> FData: TList<Integer>;

Я понимаю, что я из каменного, но это что за конструкция? В чем отличия от обычного TList?


 
Jeer ©   (2011-11-30 09:51) [8]

Дженерики ( обобщения ).
Обычный TList - список указателей.
Обобщения позволяют создавать список оговоренного типа данных.
В данном случае - список integer ( аля дин. массив ).


 
Ega23 ©   (2011-11-30 10:37) [9]


>  В чем отличия от обычного TList?


http://www.tdelphiblog.com/2009/07/generics-delphi-2009-win32-1.html


> В данном случае - список integer ( аля дин. массив ).


Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.


 
Jeer ©   (2011-11-30 11:58) [10]


> Собственно, это и есть дин.массив, просто он в привате сидит
> и реаллок несколько иначе реализован.
>


Да.
+ медленнее за счет более "жадного" алгоритма реаллока.


 
Ega23 ©   (2011-11-30 12:05) [11]


> + медленнее за счет более "жадного" алгоритма реаллока.


Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.


 
Dennis I. Komarov ©   (2011-11-30 12:06) [12]

Спасиб, сейчас накачу update в мозг... :)


 
Jeer ©   (2011-11-30 12:59) [13]


> Ega23 ©   (30.11.11 12:05) [11]


Я о дженерике, а не стандартном TList.
TList быстрее, чем TList<T>


 
Jeer ©   (2011-11-30 13:01) [14]

Кроме того, дженерик, поскольку использует дин. массив, вынужден устраивать "зачистку" после изменения длины, что - время.


 
Ega23 ©   (2011-11-30 13:15) [15]


> Кроме того, дженерик, поскольку использует дин. массив,
> вынужден устраивать "зачистку" после изменения длины, что
> - время.


А TList, блин, не использует дин.массив, да?


> TList быстрее, чем TList<T>

Смотря в чём. Смотря где. Смотря как.



Страницы: 1 вся ветка

Текущий архив: 2012.03.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1322641073
_qwerty_
2011-11-30 12:17
2012.03.11
работа с bookmark


2-1322567877
Gu
2011-11-29 15:57
2012.03.11
длина пароля из политик


2-1322555028
Cobalt
2011-11-29 12:23
2012.03.11
IFDEF, не та версия?


1-1286692304
Lex_!
2010-10-10 10:31
2012.03.11
Работа с элементами IE


15-1321834443
иксик
2011-11-21 04:14
2012.03.11
А вот вы говорите автоваз