CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Przesyłanie struktury pomiędzy unitami

Przesyłanie struktury pomiędzy unitami

dział ogólny

Re: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » czwartek, 27 listopada 2014, 19:18

Tak, chciałem się upewnić czy błąd jest w składni czy w kompilatorze. Dzięki :)
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » czwartek, 27 listopada 2014, 22:06

Niestety to na nic... ehh
funkcja porównująca .. struktura musi być, bo jak jej nie ma to nie wie co to jest losuj...

KOD cpp:     UKRYJ  
   struct losuj
       {
         AnsiString imie;
            ...

       };
       losuj dane[10000];


bool compareByLength (const losuj &a, const losuj &b)
{
    return a.imie < b.imie;
}
   

KOD cpp:     UKRYJ  
 sort(dane, dane + 1000 , compareByLength);  - działa, ale nic nie sortuje, nic dziwnego jak struktura z unit2 jest pusta.
 sort(Form1->dane, Form1->dane + 1000 , compareByLength);   - Coś co powinno działać, bo odnoszę sie do struktury z unit1  otwiera mi jakąś zakładkę  _algo i wyrzuca błąd

 

coś co sie otwiera http://gyazo.com/080aa3b3334e75da306ea49524147c25
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » czwartek, 27 listopada 2014, 23:08

A czy przypadkiem nie masz zdefiniowanej struktury losuj w dwóch miejscach, tzn. jedna w TForm1 i druga w globalnej przestrzeni nazw? Jeśli tak, to masz odpowiedź dlaczego jest błąd - to są dwie różne struktury, a compareByLength zdefiniowana jest tylko dla jednej. Dla struktury z TForm1 predykat powinien tak wyglądać:
KOD cpp:     UKRYJ  
bool compareByLength (const TForm1::losuj &a, const TForm1::losuj &b) { ... }
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » czwartek, 27 listopada 2014, 23:30

no tak operator zakresu... problem zniknął z wyskakującym błędem. Wydaje sie że sortuje również ale..
KOD cpp:     UKRYJ  
 Form1->dane + 100
// jaką to wartość powinno przyjąć skoro np tablica rekordów to 10k?
KOD cpp:     UKRYJ  
 if (Radio->ItemIndex==1)
     {   sort(Form1->dane, Form1->dane + 100 , compareByLength);
           ShowMessage(Form1->dane[3].imie); // raz dane sa raz ich nie ma  w zależności od : Form1->dane + 100  


I jeszcze jedno, da się w prosty sposób to przerobić by tak jak w buble sort po naciśnieciu radiobuttona automatycznie sie sortowała wybrana kolumna? bo teraz sortuje, ale nigdzie tego nie ma pokazanego , tzn w tabeli tego nie widać.
Ostatnio edytowano czwartek, 27 listopada 2014, 23:38 przez Boshi, łącznie edytowano 1 raz
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » czwartek, 27 listopada 2014, 23:36

Wszystkie tysiąc elementów wypełniłeś danymi, czy tylko kilka na początku? Jeśli kilka, to oczywistym jest, że po sortowaniu na początku będą elementy puste, dopiero na końcu te wypełnione.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » piątek, 28 listopada 2014, 00:06

Ok za zakres wybrałem ilość wierszy z tabeli

KOD cpp:     UKRYJ  
  sort(Form1->dane, Form1->dane + Form1->tabela->RowCount , compareByLength);


Czy teraz chcąc wyszukiwać binarnie wystarczy podać indeks pierwszy i ostatni tablicy?
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » piątek, 28 listopada 2014, 00:37

Chyba nie wiem, o jakiej funkcji mowa. Na przykład funkcja std::lower_bound przyjmuje iterator wskazujący na pierwszy element zbioru i iterator wskazujący na element tuż za ostatnim, dokładnie tak samo jak w std::sort.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » piątek, 28 listopada 2014, 00:54

Nie dopowiedziałem. Chodzi mi o wyszukiwanie binarne-połówkowe. C++ raczej nie ma wbudowanej gotowej funkcji, więc będę ją implementował samodzielnie. Funkcja przyjmuje 3 parametry. początek tablicy, koniec tablicy i wartość szukaną. Pytanie czy na podstawie np poniższego algorytmu znajdzie szukane imię? bo jak widać porównuje index z szukaną daną.
Jakaś tam przykładowa implementacja

KOD cpp:     UKRYJ  
long long tab[1000000]; //tablica z posortowanymi elementami
 
//l - lewy index tablicy, p - prawy index tablicy
int szukaj(int l, int p, long szukana)
{
  int sr;
  while(l<=p)
  {
    sr = (l + p)/2;
 
    if(tab[sr] == szukana)
      return sr;
 
    if(tab[sr] > szukana)
      p = sr - 1;
    else
      l = sr + 1;
}
 
  return -1; //zwracamy -1, gdy nie znajdziemy elementu
}
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » piątek, 28 listopada 2014, 00:58

C++ raczej nie ma wbudowanej gotowej funkcji

Jak nie ma? Przecież napisałem wcześniej nazwę funkcji wyszukującej.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » piątek, 28 listopada 2014, 01:44

A nie jest to czasem funkcja
KOD cpp:     UKRYJ  
std:: binary_search
? Nawet nie wiedziałem, że do przeszukiwania/sortowania i wielu innych operacji jest tyle funkcji wbudowanych w c++

Mógłbyś jeszcze pokazać kawałek kodu dla owego przeszukiwania? czy to będzie wyglądało podobnie jak sort? bo z tego co czytałem to parametry przyjmuje podobne.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » piątek, 28 listopada 2014, 10:30

binary_search wprawdzie szuka wartości w zbiorze, ale nie zwraca pozycji znalezionego elementu. Dlatego od początku proponuję funkcję lower_bound, która z resztą jest użyta w binary_search.

Jeśli chodzi o sposób wywołania, to tak, parametry będą identyczne jak przy sort. Oczywiście dochodzi jeszcze parametr określający wartość szukaną - tutaj podajesz obiekt klasy losuj z wypełnionym odpowiednim polem (jeśli szukasz po imieniu, wypełniasz pole losuj::imie).

Uwaga odnośnie lower_bound. Funkcja ta zwraca iterator na pierwszy element, który nie jest mniejszy od wartości szukanej, czyli znaleziony element może być większy lub równy. Dlatego powinieneś jeszcze sprawdzić czy znaleziona wartość jest równa wartości szukanej.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » piątek, 28 listopada 2014, 17:36

Ehh jak zwykle błędy. Przy takim wywołaniu dostaję znowu komunikat ze screenu wyżej. Próbowałem chyba wszystkich kombinacji...

KOD cpp:     UKRYJ  
  lower_bound( Form1->dane, Form1->dane + Form1->tabela->RowCount, Form1->dane->imie );

KOD cpp:     UKRYJ  
  lower_bound( Form1->dane, Form1->dane + Form1->tabela->RowCount, Form1->dane );

tutaj znowu taki komunikat

KOD cpp:     UKRYJ  
 lower_bound( Form1->dane, Form1->dane + Form1->tabela->RowCount, dane::imie );

http://gyazo.com/579f79556a6b95289051d55b63942e72
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » piątek, 28 listopada 2014, 19:10

Pisałem, że wartością szukaną jest obiekt klasy losuj, w przykładzie obiekt v, pisałem także o predykacie:
KOD cpp:     UKRYJ  
TForm1::losuj v;

v.imie = "Roman";

TForm1::losuj* i1 = Form1->dane;
TForm1::losuj* i2 = Form1->dane + Form1->tabela->RowCount;
TForm1::losuj* i3 = lower_bound( i1, i2 , v, compareByLength);

if(i3 != i2 && i3->imie == v.imie)
{
      //i3 wskazuje na znaleziony element z szukanym imieniem
}

Swoją drogą dziwna nazwa dla predykatu. Chyba powinien nazywać się compareByName.
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez Boshi » piątek, 28 listopada 2014, 21:29

Tak, powinno być compareBYName coś z tą nazwą sknociłem.

Faktycznie teraz to działa i wyszukuje. Chyba ostatnie co mi potrzeba a dość zagmatwane to wypisanie wszystkich danych o wyszukanym imieniu. Np znalazłem Blanke (ss)- w tabeli powino wypisać Blanka jej nazwisko itd oczywiście aby zgadzało się to z pierwotną tabelą.
http://gyazo.com/6a39bb36a4aa37e0958b2d37c9790914
Pytanie jak to zapamiętać.

Mam Tabelę pierwotną z wylosowanymi danymi.
Mam Tablicę struktur z tymi samymi Danymi z wybraną posortowaną kolumną- np imię

w jaki sposób teraz dojsć do tego aby sprawdził czy znalezione imię w tablicy odpowiada pierwotnym danym takim jak nazwisko ?
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: Przesyłanie struktury pomiędzy unitami

Nowy postprzez polymorphism » piątek, 28 listopada 2014, 23:19

Chyba nie rozumiem pytania.

Mam Tabelę pierwotną z wylosowanymi danymi.
Mam Tablicę struktur z tymi samymi Danymi z wybraną posortowaną kolumną- np imię

Szczerze mówiąc inaczej bym to zrobił. Zamiast duplikować dane, stwórz indeksy do nic, tak jak to ma miejsce w prawdziwych bazach danych. Wtedy sortowanie odbywa się na indeksach, a oryginalna tablica z danymi jest nietknięta. Indeksy możesz zrealizować za pomącą zwykłej tablicy unsigned[] lub, jeśli baza ma być edytowana, drzewa binarnego (std::set/multiset). W przypadku tablicy każda wartość zawiera indeks do odpowiedniego elementu w oryginalnej tablicy z danymi, wtedy dostęp do oryginalnych danych wygląda tak:
KOD cpp:     UKRYJ  
unsigned index_by_name[ tyle_samo_co_w_dane ];
...

cout << dane[ index_by_name[x] ].imie << '\n';
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

Poprzednia stronaNastępna strona

  • 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 53 gości