CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Listy inwersyjne/łańcuchowe- błąd...

Listy inwersyjne/łańcuchowe- błąd...

dział ogólny

Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 00:36

Co jest źle w tym dziadostwie? Nie działa jak powinno ... Generalnie wyświetla co chce.. czasem wywali wszystko z listy, czasem jeden rekord...

KOD cpp:     UKRYJ  
//Struktura

struct polaPocz
{
        int nr_pola;
        string wartosc;
        long waga;
        vector<long>lista_inw ; //przetrzymuej nr rekordów
};

vector<polaPocz>TablicaPoczatkow;



//tworzenie listy inwersyjnej
bool znaleziono = false;
polaPocz rekord;


for(  i=0; i<tabela->RowCount-1; i++)
{
        znaleziono = false;
        for(j=0; j<TablicaPoczatkow.size(); j++)
        {
                if (dane[i].boots==TablicaPoczatkow[j].wartosc.c_str())
                {
                        TablicaPoczatkow[j].waga++;
                        TablicaPoczatkow[j].lista_inw.push_back(i);
                        znaleziono = true;
                        break;
                }
        }

        if (!znaleziono)
        {
                rekord.waga=1;
                rekord.wartosc=dane[i].boots.c_str();
                rekord.lista_inw.push_back(i);
                TablicaPoczatkow.push_back(rekord);
        }
}



//wyszukiwanie w liscie inwersyjnej

int aaa;
for (int i=0; i<TablicaPoczatkow.size()-1; i++)
{
        if (Edit6->Text==TablicaPoczatkow[i].wartosc.c_str())
        {
                aaa = i;
                break;
        }
}

for (int i = 0 ; i<TablicaPoczatkow[aaa].lista_inw.size();i++)
{
        tabela->RowCount++;
        tabela->Cells[10][i]=dane[TablicaPoczatkow[aaa].lista_inw[i]].boots;
        tabela->Cells[9][i]=dane[i].imie;
}
 
Ostatnio edytowano piątek, 23 stycznia 2015, 14:29 przez polymorphism, łącznie edytowano 1 raz
Powód: Kod to chyba po pijaku formatowałeś...
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Mironas » piątek, 23 stycznia 2015, 11:32

W którym miejscu "wywala" błędne wyniki?
Co to jest dane?
...

Ogólnie trudno jest zrozumieć kod jeśli nie wiemy co on ma robić.
Prześledź kod debuggerem to zobaczysz gdzie wykonuje się coś nie tak.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 14:37

dane to jest struktura-rekord. Wywala błędne wyniki do tabelki. Wg algorytmu powinienem ifem (jak wyżej) sprawdzić, czy wpisany tekst (z edit6) jest w owej liście, jeżeli jest to powinien wyświetlić do StrigGrida wszystkie szukane dane. Np 10x imię alicja , tzn tyle razy wpisać ile jest w owej liście. A wpisuje albo całą listę czyli wszystkie imiona, albo tylko jedno znalezione lub czasami tylko kilka różnych.
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » piątek, 23 stycznia 2015, 14:58

Ten kod wyszukiwania jest średnio bezpieczny, bo jaką wartość będzie miał indeks aaa jeśli tekst z edita nie będzie znajdował się w TablicaPoczatkow?

KOD cpp:     UKRYJ  
for (int i = 0; i < TablicaPoczatkow.size() - 1; i++)

Dlaczego jest tam - 1?

To dane[].boots to jakiego typu jest?
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 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 15:11

Fakt, wtedy wyrzuci prawdopodobnie Acces Violation- przekroczony zakres. A czemu jest -1? myślałem, że to działa tak jak przy striggridzie.

Co zaobserwowałem:
- Jeżeli wpisuje pierwszy wynik z striggrida, np marka Yamacha (screen) http://gyazo.com/b1a551cde8df97f827b6d3b4ef182e8b to wyszukuje dobrze. (Wyniki w kolumnie "Przed Gwarancja") Wypisuje tyle ile jest w liście. Jednak problem jest gdy np chcę znaleźć buty Fox(3 rekord w Striggridzie) to wyrzuca wtedy rekordy znajdujące się jeszcze przed Foxem...

Mógłbyś powiedzieć dlaczego takie dziwne wyniki podaje?


p.s dane[].boots to AnsiString
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » piątek, 23 stycznia 2015, 15:20

A czemu jest -1? myślałem, że to działa tak jak przy striggridzie.

Przecież indeksujesz TablicaPoczatkow a nie stringgrida?

Mógłbyś powiedzieć dlaczego takie dziwne wyniki podaje?

Heh, jakbym wiedział, to bym powiedział. Jak na moje rozumienie list inwersyjnych, nie widzę tu jakichś błędów przy ich tworzeniu lub szukaniu, ale może coś mi umyka. Rozumiem, że dane to ta główna baza, tak? Pokaż jak wygląda rekord tej bazy.
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 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 15:31

No tak, ten -1 nie potrzebne, mój błąd.

Tak dane to główny rekord.
KOD cpp:     UKRYJ  
Unit1.h
   struct losuj
       {
         int id;
         AnsiString imie;
         AnsiString nazwisko;
         AnsiString helm;
         AnsiString suit;
         AnsiString boots;
         AnsiString gloves;
         AnsiString cena;
         AnsiString data;
         AnsiString faktura;
         AnsiString gwarancja;

       };

losuj dane[1000000];


Tak wiem, marnotrwastwo pamięci, ale zanim pomyślałem o vectorze to wyszło, że musiałbym zmienić jakoś 70% programu, dlatego zostawiłem jak jest.
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » piątek, 23 stycznia 2015, 15:59

Czyli jak rozumiem dane to zmienna globalna zdefiniowana w pliku nagłówkowym Unit1.h? Jeśli tak, to to jest błąd. Tak zmiennych globalnych się nie definiuje.

Tak powinno być:
KOD cpp:     UKRYJ  
/* w Unit1.h */
extern losuj dane[1000000];

/* w Unit1.cpp */
losuj dane[1000000];
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 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 16:33

No tak, ale wtedy unit2 nie widzi tego rekordu. W ogóle ma to znaczenie jeżeli chodzi o ową listę?
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » piątek, 23 stycznia 2015, 19:35

Jak nie widzi? W Unit1.h jedyne co zmieniasz to dodajesz słówko extern. Nagłówek ten załączasz wszędzie tam, gdzie odwołujesz się do dane.

W ogóle ma to znaczenie jeżeli chodzi o ową listę?

Nie wiem, czy akurat ma to jakiś związek z problemem, ale jeśli Unit1.h załączasz w kilku miejscach, to na pewno masz błąd - każda jednostka kompilacji będzie miała swoją wersję zmiennej dane. A chyba chodzi Ci o jedną globalną wersję tej zmiennej, prawda?.
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 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » piątek, 23 stycznia 2015, 22:29

No tak, ale i tak w unit2 odnosiłem się do rekordu z formy1.
Listę zrobiłem, tylko powiedz mi jedno. Lista przechowuje wszystkie wartości z każdej kolumny tak? dla 1k rekordów ok, dla 2 też, dla 5 jeszcze ujdzie, ale do cholery 10k rekordów i mogę iść kolację robić :x Przecież za każdym razem tworzymy X rekordów * ilosć kolumn. Dla 10k to jest 100k wartości. To ma tak działać? :D
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » sobota, 24 stycznia 2015, 11:06

No tak, ale i tak w unit2 odnosiłem się do rekordu z formy1.

Nie wiem, o co chodzi, ale jak jest błąd, to trzeba go poprawić, i nie ma o czym tutaj dyskutować.

Lista przechowuje wszystkie wartości z każdej kolumny tak?

Chyba Ty powinieneś to wiedzieć - wszak to Twój kod - a nie ja. Z kodu widać, że lista robiona jest tylko dla pozycji losuj::boots.

To ma tak działać?

Samo budowanie tych list może trochę zająć. One mają być wydajne przy wyszukiwaniu. Dlaczego taką metodę wybrałeś?

Jak dużo elementów ma TablicaPoczatkow dla np. 10k rekordów data?
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: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez Boshi » sobota, 24 stycznia 2015, 13:40

Chodzi o to, że jeżeli zapiszę rekord tak jak podałeś to unit2 nie widzi w ogóle tego. Pomimo załączenia unit1.h, unit2.h w plikach nagłówkowych.

Pytam z zasady czy tak to działą, bo przeczytałem mnóstwo o tym i chyba zasada jest taka jaką podałem. Tworzy wartości dla wszystkich kolumn.
Dla Samej daty nie sprawdzałem, bo kod przerobiłem by tworzył właśnie z wszystkich kolumn. Dla samych butów wcześniej robił dość szybko. Teraz np dla 10k wylosowanych rekordów tworzy listę w 81s, choć wyszukiwanie to jest kliknięcie buttona i już. Niby powinno być ok, ale jakoś nie jestem w stanie sobie wyobrazić, np listy złozonej z 300k rekordów, bo czas jaki potrzebny by był na utworzenie jej to pewnie z 2h.
Avatar użytkownika
Boshi
Bladawiec
Bladawiec
 
Posty: 32
Dołączył(a): piątek, 14 listopada 2014, 17:29
Podziękował : 7
Otrzymał podziękowań: 0
System operacyjny: win 7
Kompilator: Bulider 2006
Gadu Gadu: 0
    Windows 7Firefox

Re: Listy inwersyjne/łańcuchowe- błąd...

Nowy postprzez polymorphism » sobota, 24 stycznia 2015, 13:47

Chodzi o to, że jeżeli zapiszę rekord tak jak podałeś to unit2 nie widzi w ogóle tego. Pomimo załączenia unit1.h, unit2.h w plikach nagłówkowych.

Jeśli zrobiłeś dokładnie tak jak napisałem, to nie ma opcji, że "nie widzi".

Dla Samej daty nie sprawdzałem (...)

Hehe, mój błąd. Chodziło mi oczywiście o globalną tablicę dane.
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 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

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 10 gości

cron