CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Funkcja przeszukująca listę dwukierunkową w Builderze

Funkcja przeszukująca listę dwukierunkową w Builderze

dział ogólny

Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » sobota, 15 stycznia 2011, 18:39

Witajcie, mam pewien problem z funkcją przeszukującą listę dwukierunkową i wyświetlającą elementy wyszukiwania. Piszę ją w C++ Builderze. Przejdę do rzeczy, oto komponenty, których używam:

ListBox1
Edit1

i klasy osoba, która ma wiele składowych, ale tutaj najważniejsza (względem niej szukamy) jest składowa nazwa, która jest typu string

i mam dwie funkcje:
Kod: Zaznacz cały
void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
  osoba **szukane=0; //wskaźnik do tablicy wskaźników, w której będą adresy wyszukanych obiektów z listy dwukierunkowej
  if(osoba::ilosc_kontaktow()>1) //gdy jeden kontakt, nie wyszukujemy, ile_kontaktow() to funkcja statyczna, która podaje długość listy
  {
      szukane=szukaj(GLOWA, Edit1->Text.c_str()); //GLOWA-początek listy, zmienna globalna, do funkcji szukaj wysyłam oprócz GLOWY jest zawartość komponentu Edit1
      if(szukane[0]) //jeśli coś wyszukano
      {
          ListBox1->Items->Clear(); //czyścimy ListBoxa, gdyby wcześniej coś w nim bylo
          int j=0;
          while(szukane[j]) // wpisujemy zwartość tablicy do ListBoxa
          {
              ListBox1->Items->Add((szukane[j++]->nazwa).c_str());
              j++;
          }
      }
  }
}


i teraz funkcja szukająca:

Kod: Zaznacz cały
osoba **szukaj(osoba *temp, string nazwa)
{
osoba *(*tab)=0;
int k=osoba::ilosc_kontaktow(); //k - długość listy

tab=new osoba*[k]; //dynamicznie tworzę tablicę wskaźników i przypisuję ją do **tab, tablica ma rozmiar taki, ile jest kontaktów

for(int i=0; i<k; i++) //wypełniam ją zerami
     tab[i]=0;

int i=0;
while(temp!=0)
{
     if(AnsiPos(nazwa.c_str(), temp->nazwa.c_str())) //funkcja AnsiPos zwraca 0, jeśli pierwszy argument nie jest częścią drugiego (chodzi o string)
         tab[i++]=temp;
     temp=temp->nastepny;
}

return tab;
}


chodziło mi o stworzenie "dynamicznej wyszukiwarki" tzn na bieżąco po wpisywaniu szuka, jednak nie wiem dlaczego, nie działa czasami, siedzę już nad tym i nie widzę błędu, może ktoś z forum mi pomoże, byłbym wdzięczny...
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez polymorphism » sobota, 15 stycznia 2011, 22:44

Nie działa, czyli co, segfaulta dostajesz, zawiesza się, czy nie wyszukuje?

KOD cpp:     UKRYJ  
tab = new osoba*[k];

Nie widzę, żebyś gdzieś tę pamięć zwalniał. Zresztą po co ją w ogóle alokujesz? Przecież możesz od razu wpisywać znalezione wyrazy do listy.

KOD cpp:     UKRYJ  
if(AnsiPos(nazwa.c_str(), temp->nazwa.c_str()))

AnsiPos oczekuje AnsiStringa, więc ten zapis jest dość nieefektywny, ponieważ dochodzi do konwersji c-string -> AnsiString. Klasa string ma metodę find, która robi to samo co AnsiPos. Użyj jej.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » niedziela, 16 stycznia 2011, 00:40

Przeważnie wyszukuje...ale jak mam np dwa elementy w pamięci, które zawierają jakąś wspólną literę, to wywala mi właśnie, że czyta z jakiegoś dziwnego adresu...i błąd.
A ja błędu jakoś nie widzę, eh.
Co do zwalniania miejsca, fakt, zapomniałem, ale to akurat raczej tego błędu nie powoduje...
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez polymorphism » niedziela, 16 stycznia 2011, 12:08

KOD cpp:     UKRYJ  
while(szukane[j])
{
        ListBox1->Items->Add((szukane[j++]->nazwa).c_str());
        j++; //<--- pewny jesteś tego?
}
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » niedziela, 16 stycznia 2011, 17:43

hmmm, tu pewnie wywala błąd, ale nie rozumiem zbyt dlaczego, tablica została wyzerowana, wypełniona do pewnego indexu, reszta 0, zwrócony wskaźnik do tablicy wskaźników, teraz po prostu chodzę po tej tablicy, jeśli jest równy zero, to nie wchodzi do pętli
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez polymorphism » niedziela, 16 stycznia 2011, 22:20

O ile j jest zwiększany co iterację?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » poniedziałek, 17 stycznia 2011, 15:44

przed pętlą ma 0, a j++ oznacza, że o jeden ;]
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez Cyfrowy Baron » poniedziałek, 17 stycznia 2011, 16:01

Poza tym, że kod jest nieefektywny nie dostrzegam błędu.
Jaką konstrukcję ma ta tablica, tzn. jak uporządkowane są w niej rekordy? Czy nie lepiej byłoby skorzystać z vector'ów lub tablicy rekurencyjnej?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez polymorphism » poniedziałek, 17 stycznia 2011, 19:10

JarTSW napisał(a):przed pętlą ma 0, a j++ oznacza, że o jeden ;]

No, ale ile razy jest zwiększany j co obieg pętli? Przyjrzyj się dokładnie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » poniedziałek, 17 stycznia 2011, 20:56

fakt, podwójne inkrementacja j, aczkolwiek to mój blad, bo testowalem cos i zapomnialem usunac, tak czy siak, nie dziala, a ja bledu, podobnie jak Cyfrowy Baron nie widze

@Cyfrowy Baron - moze i latwiej, ale bardziej mnie meczy, czemu to nie dziala...
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez polymorphism » poniedziałek, 17 stycznia 2011, 21:34

Jest jeszcze jeden błąd.

KOD cpp:     UKRYJ  
osoba **szukaj(osoba *temp, string nazwa)
{
        osoba *(*tab)=0;
        int k = osoba::ilosc_kontaktow();

        tab = new osoba*[k];
...


void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
        ...

        szukane = szukaj(GLOWA, Edit1->Text.c_str());

        ...

        while(szukane[j]) //<---
        {
                ...
        }

        ...
 

W przypadku, gdy wszystkie kontakty będą pasować do szukanego wzorca, zabraknie jednego elementu na końcu tablicy tab, który oznaczałby jej koniec.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
JarTSW
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Funkcja przeszukująca listę dwukierunkową w Builderze

Nowy postprzez JarTSW » poniedziałek, 17 stycznia 2011, 23:19

Dokładnie tak, dzięki wielkie!!!
Avatar użytkownika
JarTSW
Bladawiec
Bladawiec
 
Posty: 10
Dołączył(a): piątek, 7 stycznia 2011, 20:38
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: C++ Builder 6
Gadu Gadu: 0
    Windows VistaFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron