Avatar billede bananjoe Nybegynder
09. december 2008 - 23:10 Der er 12 kommentarer

Fejl i kode

Hey

Hvad er der galt med denne kodestump:



procedure TForm1.Button1Click(Sender: TObject);
var i, tempint : integer;
    bubble : boolean;

    begin
    repeat begin
      bubble := false;
      for I := 1 to listbox1.GetCount do
        if listbox1.Items[i] > listbox1.Items[i+1] then begin
          tempint := strtoint(listbox1.Items[i]);
          listbox1.Items[i] := listbox1.Items[i+1];
          listbox1.Items[i+1] := inttostr(tempint);
          bubble := true;
        end;

        end



    until bubble = false;



end;



Værdierne i listboxen er af integer.
Jeg får fejlen list index out of bounds.
Avatar billede kroning Nybegynder
09. december 2008 - 23:26 #1
Jeg ved ikke hvor du får GetCount fra men prøv med:
  for I := 0 to listbox1.GetCount-2 do
Avatar billede hrc Mester
10. december 2008 - 02:43 #2
Prøv lige at sammenlign de to stykker kode. Jeg vil skråsikkert påstå min version er den pæneste og den letteste at gennemse.

procedure TForm1.Button1Click(Sender: TObject);
var
  bubble: boolean;
  i, tempint: integer;
begin
  repeat
    bubble := false;
    for i := 1 to listbox1.Items.Count do
      if listbox1.Items[i] > listbox1.Items[i+1] then
      begin
        tempint := strtoint(listbox1.Items[i]);
        listbox1.Items[i] := listbox1.Items[i+1];
        listbox1.Items[i+1] := inttostr(tempint);
        bubble := true;
      end;
    end
  until not bubble;
end;

.. prøv at holde din kode pæn.

Er det en øvelse udi BubbleSort eller ved du ikke at man kan sortere listerne helt automatisk? Både med en bogstavbaseret (sorterer 1,10,11,2,3,4 osv) eller en hjemmestrikket som er meget hurtigere end BubbleSort.

Kan godt strikke et eksempel sammen, dog ikke nu.
Avatar billede hrc Mester
10. december 2008 - 02:49 #3
Manglede lige lidt før det kunne oversættes - men en bubblesort synes jeg ikke det ligner endnu:

procedure TForm1.Button1Click(Sender: TObject);
var
  Bubble: boolean;
  i, tempint: integer;
begin
  repeat
    for i := 0 to listbox1.Items.Count - 2 do
    begin
      Bubble := listbox1.Items[i] > listbox1.Items[i+1];
      if Bubble then
      begin
        tempint := StrToInt(listbox1.Items[i]);
        listbox1.Items[i] := listbox1.Items[i+1];
        listbox1.Items[i+1] := IntToStr(tempint);
      end;
    end;
  until not bubble;
end;
Avatar billede borrisholt Novice
10. december 2008 - 10:05 #4
Nu skriver du ikke hviklen Delphi version du bruger men hher er en version der virker i ældre versioner af Delphi :

unit Unit37;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TStringsSortCompare = function(List: TStrings; Index1, Index2: Integer): Integer of object;

  TForm37 = class(TForm)
    ListBox1: TListBox;
    btnSorter: TButton;
    btnGenerer: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnSorterClick(Sender: TObject);
    procedure btnGenererClick(Sender: TObject);
  private
    procedure QuickSort(L, R: Integer; List: TStrings; SCompare: TStringsSortCompare);
    function StringsSortCompare(List: TStrings; Index1, Index2: Integer): Integer;
  public
    { Public declarations }
  end;

var
  Form37: TForm37;

implementation
uses
  Math;

{$R *.dfm}

procedure TForm37.btnSorterClick(Sender: TObject);
begin
  ListBox1.Items.BeginUpdate;
  QuickSort(0, ListBox1.Items.Count - 1, ListBox1.Items, StringsSortCompare);
  ListBox1.Items.EndUpdate;
end;

procedure TForm37.btnGenererClick(Sender: TObject);
var
  I, J: Integer;
begin
  ListBox1.Items.BeginUpdate;
  ListBox1.Items.Clear;
  J := Random(500);

  for I := 1 to J do
    ListBox1.Items.Add(IntToStr(Random(50000)));

  ListBox1.Items.EndUpdate;
end;

procedure TForm37.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm37.QuickSort(L, R: Integer; List: TStrings; SCompare: TStringsSortCompare);
var
  I, J, P: Integer;
begin
  repeat
    I := L;
    J := R;
    P := (L + R) shr 1;
    repeat
      while SCompare(List, I, P) < 0 do
        Inc(I);

      while SCompare(List, J, P) > 0 do
        Dec(J);

      if I <= J then
      begin
        List.Exchange(I, J);

        if P = I then
          P := J
        else if P = J then
          P := I;

        Inc(I);
        Dec(J);
      end;
    until I > J;

    if L < J then
      QuickSort(L, J, List, SCompare);

    L := I;
  until I >= R;
end;

function TForm37.StringsSortCompare(List: TStrings; Index1, Index2: Integer): Integer;
var
  A, B: Extended;
  S1, S2: string;
begin
  S1 := List[Index1];
  S2 := List[Index2];
  if TryStrToFloat(S1, A) and TryStrToFloat(S2, B) then
    Result := CompareValue(A, B)
  else
    Result := StrComp(pChar(S1), pChar(s2));
end;

end.
Avatar billede borrisholt Novice
10. december 2008 - 10:17 #5
Hvis du bruger Delphi 2007/2009 kan det laves vha en Class helper :

unit TStringsHelperU;

interface

uses Classes;

type
  TStringsHelper = class helper for TStrings
  strict private
    procedure QuickSort(L, R: Integer);
    function SortCompare(Index1, Index2: Integer): Integer;
  public
    function Add(const V: Variant): Integer; overload;
    function Add(const Args: array of Variant): Integer; overload;
    procedure Sort;
  end;

implementation

uses
  Math, Variants, Sysutils;

function TStringsHelper.Add(const Args: array of variant): Integer;
var
  Tmp: string;
  I: Integer;
begin
  Tmp := '';

  for I := Low(Args) to High(Args) do
    Tmp := Tmp + VarToStr(Args[i]) ;
   
  Result := Add(Tmp) ;
end;

procedure TStringsHelper.QuickSort(L, R: Integer);
var
  I, J, P: Integer;
begin
  repeat
    I := L;
    J := R;
    P := (L + R) shr 1;
    repeat
      while SortCompare(I, P) < 0 do
        Inc(I);

      while SortCompare(J, P) > 0 do
        Dec(J);

      if I <= J then
      begin
        Exchange(I, J);

        if P = I then
          P := J
        else if P = J then
          P := I;

        Inc(I);
        Dec(J);
      end;
    until I > J;

    if L < J then
      QuickSort(L, J);

    L := I;
  until I >= R;
end;

procedure TStringsHelper.Sort;
begin
  BeginUpdate;
  QuickSort(0, Count - 1);
  EndUpdate;
end;

function TStringsHelper.SortCompare(Index1, Index2: Integer): Integer;
var
  A, B: Extended;
  S1, S2: string;
begin
  S1 := Get(Index1);
  S2 := Get(Index2);

  if TryStrToFloat(S1, A) and TryStrToFloat(S2, B) then
    Result := CompareValue(A, B)
  else
    Result := StrComp(pChar(S1), pChar(s2));
end;

function TStringsHelper.Add(const V: Variant): Integer;
begin
  Result := Add([V]) ;
end;

end.



unit Unit37;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TStringsHelperU;

type
  TForm37 = class(TForm)
    ListBox1: TListBox;
    btnSorter: TButton;
    btnGenerer: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnSorterClick(Sender: TObject);
    procedure btnGenererClick(Sender: TObject);
  private
  public
    { Public declarations }
  end;

var
  Form37: TForm37;

implementation

{$R *.dfm}

procedure TForm37.btnSorterClick(Sender: TObject);
begin
  ListBox1.Items.Sort;
end;

procedure TForm37.btnGenererClick(Sender: TObject);
var
  I, J: Integer;
begin
  ListBox1.Items.BeginUpdate;
  ListBox1.Items.Clear;
  J := Random(500);

  for I := 1 to J do
    ListBox1.Items.Add(Random(50000));

  ListBox1.Items.EndUpdate;
end;

procedure TForm37.FormCreate(Sender: TObject);
begin
  Randomize;
end;

end.


Jens Borrisholt
Avatar billede hrc Mester
10. december 2008 - 11:19 #6
borrisholt: Du kan vist godt lide "Class Helpers" (M.Cantu mener ikke de er relevante i andet end .NET - men jeg ved slet ikke hvordan jeg skal bruge dem. Håber at kunne lure det af i ViewOnly. Synes i øvrigt det flimrer lidt. Er der en timer der opdaterer?)

Hvad med denne løsning?

uses
  Math;

function CompareAsInteger(aList: TStringList; aIndex1, aIndex2: integer): integer;
begin
  result := CompareValue(StrToIntDef(aList[aIndex1],0),StrToIntDef(aList[aIndex2],0));
end;

procedure TfrmMain.btnSortClick(Sender: TObject);
var
  StringList: TStringList;
begin
  lbData.Items.BeginUpdate;
  StringList := TStringList.Create;
  try
    // Bliver nødt til at kopiere til TStringList for at få adgang til CustomSort
    StringList.Assign(lbData.Items);
    StringList.CustomSort(CompareAsInteger);
    // men så skal data jo også lige tilbage igen.
    lbData.Items.Assign(StringList);
  finally
    StringList.Free;
    lbData.Items.EndUpdate;
  end;
end;
Avatar billede borrisholt Novice
10. december 2008 - 13:02 #7
hrc>> Du har helt ret jeg er MEGET glad for class helpers ..

Et hurtigt eksempel på class helpers finder du på delphi.about.com
http://delphi.about.com/od/delphitips2008/qt/tstrings-helper.htm

Her implemterer jeg denne syntax :

with ListBox1.Items do
begin
  Add('delphi.about.com') ;
  Add(2008) ;
  Add(true) ;
  Add(['Only ', 1, true, ' line']) ;
end;


Du er mit ViewOnly eksempel filmmere lidt er timeren, det har ikke noget at gøre med. HRC hvor bor du hende i landet, ind til flere mennesker har spurgt min om jeg ville holde et kursus i nye ting i Delphi. Jeg har lagt mærke til mannge Delphi programmører står stille ved Delphi 7, altså mht. udnyttelse af sproget. (dig inklusive)

Hvis man kunne samle nogle mennesker, ville jeg da nok kunne overtales.

Selv bor jeg lige nord for Aalborg.

Jenns Borrisholt
Avatar billede kroning Nybegynder
10. december 2008 - 15:09 #8
Jeg er på. Bor en time syd for Ålborg.
Avatar billede kroning Nybegynder
10. december 2008 - 15:12 #9
Spørgsmålet er hvilket niveau det forventes man er på, for hvis man ikke fatter noget af hvad der bliver sagt er det jo ikke så meget værd.
Avatar billede borrisholt Novice
10. december 2008 - 17:42 #10
kroning>> Lad os nu se om ikke vi kan finde nogle der gidder være med, så finder vi et nevau bagefter :D
Avatar billede bananjoe Nybegynder
10. december 2008 - 18:00 #11
Det virkede sq bare at trække 2 fra listbox1.getcount.

Og ja.. Det var en øvelse i bubble sort.
Avatar billede hrc Mester
11. december 2008 - 14:15 #12
Hej Jens. Jeg troede du boede i Sverige.

Jeg ved nu ikke om jeg sidder fast i D7', men det er rigtigt jeg ikke springer på "Interfaces", "Class helpers" eller andet, før jeg kan se en reel gevinst kontra besværet ved at bruge det. Ved godt at ovennævnte to punkter har flere år/versioner på bagen, men hvad andet er der egentlig?

Bor i Odense i øvrigt, men et kursus er ikke uinteressant. Det bør starte på højt niveau; et rigtigt nørdkursus.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester