Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Delphi nowy typ liczbowy


Rekomendowane odpowiedzi

Opublikowano

Czy da się jakoś zdefiniować w Delphi nowy typ liczbowy o długości dokładnie 3 bajtów, ale tak żeby nie był to rekord?

Ma to być wartość do odczytu koloru z bitmapy 24bit. Normalnie się to robi za pomocą rekordu o 3 bajtach, ale chciałbym się do tej wartości odnosić jako do pojedynczej liczby (w systemie dziesiętnym) złożonej z 3 bajtów bez zbędnych operacji przeliczania na typy 4-bajtowe np.

Opublikowano

Na początek jaka to wersja Delphi?

Nie bardzo rozumiem Twój problem. Co Ci szkodzi korzystać z 4 bajtowej zmiennej do przeliczeń?

Rozwiązaniem mogłoby być zastosowanie klasy z własnością konwertującą te 3 bajty na 4 bajtową zmienną (np. typu integer) i na niej operacje ale to przekombinowane. W każdym bądź razie chcesz strasznie skomplikować sprawę, na 4 bajtach szybciej będzie progz śmigał, bo to dla procesora żaden problem szczególnie dlatego, że posiada 4bajtowe rejestry a 3 dla niego jest dziwadłem, który wymaga dodatkowych instrukcji.

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Delphi 7

Głównie chodzi o wygodę i przejrzystość kodu. Na wartościach koloru nie przeprowadzam żadnych operacji poza porównaniem, więc o wydajność się nie martwię. Program jest ciągle w budowie i często modyfikowany, czasem wartości kolorów wprowadzane są jako czysta liczba tylko do szybkiego testu a nie jako zmienna. I tu właśnie łatwiej się pracuje gdybym cały kolor mógł przedstawić jedną liczbą a nie trzema (r,g,b ) i szybko po prostu go przypisać, zamiast bawić się w konwersję. Gdy mam takie tymczasowe wartości to porównywanie kilku kolorów w warunku strasznie się rozrasta i ciężko się potem połapać przy modyfikacji.

Oczywiście mógłbym sobie tworzyć jakieś tablice z wartościami przeliczanymi i porównywać w pętli, ale próbuje znaleźć metodę, żeby coś zrobić i się nie narobić :P

No ale chyba nie znajdę takiego sposobu..komputery nie lubią liczb spoza  szeregu potęg dwójki :(

Opublikowano

Możesz ewentualnie dodać funkcję przeliczającą pixel, który w tym przypadku wygodniej podać jako rekord, na integer lub cardinal.

type
    PPixel = ^Pixel;
    Pixel = record
        r: byte;
        g: byte;
        b: byte;
    end;
//....
//ewentualna nazwa makeColor
function colorValue(const pix: Pixel {ewentualnie wskaźnik PPixel}): cardinal; {lub integer}
begin
    result := pix.r + 
              pix.g shl 8 + 
              pix.b shl 16;
end;
Tak poza tym, to z rekordem kod będzie raczej czytelniejszy niżeli bez :P

YOU MUST DIE

- Ganon, Koridai

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...