Koniec żartów z Delphi - White House poleca

Koniec żartów z Delphi - White House poleca
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
0
Law napisał(a):

PDouble p; // czy dowolny wskaźnik, ale z wyjątkiem Pchar :)

i teraz robimy:

p[6] = 80.8;

Przecież dokładnie to pokazałem w swoim poprzednim kodzie! Już ci pisałem, że wskaźnik typowany może być używany jako tablica, podałem przykład a nawet link do kompilatora online, potwierdzającego działanie snippetu.

i nie wolno tego robić, bo to jest przecież sprzeczne z tym 'safe-memory-code'.

Nawet nie wiem jak to skomentować. Używanie wskaźników w ogóle jest memory-unsafe, wiec jeśli z nich korzystasz, to lepiej rób to z głową. Jeśli wskaźnik zawsze wskazuje na zaalokowany blok pamięci, to jego użycie — bez względu na to w jaki sposób — zawsze będzie bezpieczne, tak w Pascalu, jak i w C.

albo takie coś:
p[-19] = 77.7;

i co - wolno tak?

Pewnie że wolno. Mało tego, jest to standardowy sposób dobrania się do metadanych, które z reguły przechowuje się przed adresem właściwych danych, a także do zwolnienia bloku pamięci zawierającego metadane.

w c wolno, bo to jest niskopoziomowy język, czyli z góry zakładamy, że programer wie co robi.

Przecież Pascal daje dokładnie to samo co C, język C nie ma tutaj żadnej przewagi nad Pascalem.

O ile pamiętam ja omijałem te ograniczenia jakimiś makabrycznymi sposobami, np. tak:

p = PDouble((integer(p) + 24));

Bo nie znasz współczesnego Pascala, o czym ten snippet świadczy.
Możesz bez problemu dodać cokolwiek do pointera, aby uzyskać adres kolejnego lub poprzedniego pakietu danych.

i teraz mam ten p przesunięty, bo incrementacja Pchar była dozwolona (w Borlandzie przynajmniej);

A kogo obchodzi Borland, skoro upadł naście lat temu, a jego Delphi nie ma żadnego porównania ani ze współczesnym Delphi, ani z Free Pascalem. Jeśli chcesz porównywać języki, to porównuj aktualne jego standardy, a nie jakieś dinozaury.

legalne w pas jest tylko:
p^ := 40.4;

Ty w ogóle przeczytałeś mój poprzedni post, czy tak sobie randowomo stukasz w klawiaturę? Już ci pokazałem, że można bez problemu przypisywać wartości do pointerów, bez jawnej ich dereferencji.

a i dalej - mogę w nieskończoność:

W nieskończoność to co najwyżej możesz się blamować, bo akurat same bzdury wypisujesz, kompletnie niezgodne z rzeczywistością. Pisałem — nie masz pewności, to pytaj, zamiast stawiać kłamliwe twierdzenia, jak te wcześniejsze i kolejne.

  1. w pas nie ma pól bitowych - takie rekordy w c w których mamy zmienne o rozmiarach w bitach

We Free Pascalu są, i to od bardzo dawna — https://www.freepascal.org/docs-html/ref/refse14.html
Data alignment może być wykluczony modyfikatorem packed oraz bitpacked. Poza tym te modyfikatory nie służą wyłącznie do pakowania pól struktur (jak w C), ale też do pakowania dowolnych macierzy.

  1. nie ma tamplete

Generyki są we Free Pascalu i Delphi od miliona lat, w dodatku mają zdecydowanie bardziej przyjazną składnię.

  1. nie ma referencji w kodzie

Jakich referencji? Pisz precyzyjnie, bo rzucać buzzwordami to każdy potrafi.

  1. nie deklaracji parametrów w kodzie, w stylu:
    for(float x = 0; ...

W Delphi można, a więc można pisać kod dokładnie tak samo jak w C/C++ — https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Inline_Variable_Declaration

Pascal został zaprojektowany tak, aby łatwo się w nim programowało, dlatego do deklaracji zmiennych przewidziany jest blok var, dzięki czemu zawsze wiadomo było ile lokalnych zmiennych używanych jest w danej funkcji. Delphi dodało wsparcie inline'owania deklaracji, co daje dodatkowe możliwości dla tych, którzy wolą deklarować zmienne lokalne z kontrolą ich zasięgu.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
LA
  • Rejestracja:około rok
  • Ostatnio:około rok
  • Postów:27
1

zatem o czym mowa?

ten klon paskala nie spełnia żadnych kryteriów ochrony ramu, co autorzy z house sugerują, i zapewne bezwiednie.

Natomiast referencji tak można używać w c++:

for(i = 0; ...)
{
int &ix = p->q.arry[i]; // to & oznacza tu ref

// i tu dowolne operacje na ix, dotyczą faktycznie tego pola po prawej
...
}

możliwa jest referencja do wskaźnika, i dowolna zmienna.

A o tampletach w pas nie słyszałem nawet... dlatego tam nie masz stl, i innych skeczy tego typu.

I raczej nie masz pół bitowych... bo tu nie o to chodzi - może sprawdź w dokumentach c, co to jest.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
0
Law napisał(a):

Natomiast referencji tak można używać w c++:

for(i = 0; ...)
{
int &ix = p->q.arry[i]; // to & oznacza tu ref

Przecież to zwykłe pozyskanie adresu i operacje na danych spod tego adresu za pomocą pomocniczego wskaźnika. Adres zmiennej w Pascalu uzyskuje się operatorem @ i dokładnie to samo można robić co pokazałeś:

Kopiuj
ix: PSingle;

for I := 0 {...}
  ix := @p.q.arr[I];

możliwa jest referencja do wskaźnika, i dowolna zmienna.

W Pascalu również, i tak samo jak w C/C++, wskaźnik może być wielopoziomowy. Znowu podajesz absolutną podstawę dotyczącą wskaźników i bezpodstawnie uważasz, że C jest jakieś wyjątkowe pod tym względem — a nie jest.

A o tampletach w pas nie słyszałem nawet...

No to się dokształć, zanim zaczniesz smarować kolejne posty.

I raczej nie masz pół bitowych... bo tu nie o to chodzi - może sprawdź w dokumentach c, co to jest.

Masz problem z głową, czy z czytaniem? Podałem ci link do dokumentacji, w której masz czarno na białym napisane, że FPC wspiera pola bitowe, jak również potrafi bitowo pakować zawartość struktur oraz macierzy. Poza tym sam zaglądnij do dokumentacji C, bo ja doskonale wiem czym są pola bitowe i do czego służą.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
LA
  • Rejestracja:około rok
  • Ostatnio:około rok
  • Postów:27
1

A. Dobrze zauważasz podobieństwo: referencji i wskaźników, ale jednak referencja inaczej działa od wskaźników.

B. może jakieś surogaty tamplet sobie tam zaimprowizowano... coś w stylu tego ifelse zamiast operatora ?: zapewne.

C. nie znam, nie widziałem: podaj przykład rekordu z polami bitowymi.

edytowany 1x, ostatnio: Law
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1
Law napisał(a):

A. Dobrze zauważasz podobieństwo: referencji i wskaźników, ale jednak referencja inaczej działa od wskaźników.

Inaczej, czyli jak? Wytłumacz, podaj przykład ilustrujący różnice.

B. może jakieś surogaty tamplet sobie tam zaimprowizowano... coś w stylu tego ifelse zamiast operatora ?: zapewne.

WTF. Poziom twojego zaprzeczania jest wręcz niewiarygodny.

Delphi i Free Pascal wspierają normalne generyki, nie tylko generyczne typy danych, takie jak struktury, macierze czy klasy, ale też funkcje i metody generyczne. Nawet w swojej dupo-gierce korzystam z tych generyków, se kuknij — https://github.com/furious-programming/Fairtris-2-UC/blob/master/source/Fairtris.Classes.pp#L34-L56

Generyki we Free Pascalu pojawiły się pierwsze, w nich użycie słówka generic oraz specialize jest konieczne. W Delphi pojawiły się później i nie używa się dodatkowych słów kluczowych. Potem dodano do Free Pascala kompatybilność z Delphi i też nie trzeba korzystać z dodatkowych słów kluczowych — przy {$MODE DELPHI}.

Kopiuj
{$MODE DELPHI}

type
  TFoo<T> = record
    Data: T;
  end;

var
  Foo: TFoo<UInt8>;
begin
  Foo.Data := 255;

Dowód — https://ideone.com/v431Rk

C. nie znam, nie widziałem: podaj przykład rekordu z polami bitowymi.

No to skoro nie widziałeś, to nie zaprzeczaj, tym bardziej, że dostałeś linki do dokumentacji.

Przykład:

Kopiuj
type
  TPosition = bitpacked record // 8 bits
    Pixel:    0 .. %11111;     // 5 bits
    Subpixel: 0 .. %111;       // 3 bits
  end;

Tester:

Kopiuj
begin
  WriteLn('Position:   ', BitSizeOf(TPosition),          ' bits');
  WriteLn('  Pixel:    ', BitSizeOf(TPosition.Pixel),    ' bits');
  WriteLn('  Subpixel: ', BitSizeOf(TPosition.Subpixel), ' bits');
end.

Wyjście:

Kopiuj
Position:   8 bits
  Pixel:    5 bits
  Subpixel: 3 bits

Dowód — https://ideone.com/0rSEQj

Typ danych pól bitowych nie musi być intem — może być dowolnym policzalnym typem danych, o dowolnych wartościach. Zamiast zakresów, można podać nazwę typu danych, jeśli takie pole może posiadać dowolną wartość danego typu danych. Takie pole zostanie docięte do wymaganej liczby bitów.

Kopiuj
type
  TPosition = bitpacked record // 8 bits
    Power:    Boolean;         // 1 bit
    Pixel:    0 .. %1111;      // 4 bits
    Subpixel: 0 .. %111;       // 3 bits
  end;

Dowód — https://ideone.com/2nRAG8

PS: ideone ma starą wersję FPC — używa 3.0.4, podczas gry w użyciu jest stabilna wersja 3.2.2.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1

A tutaj masz przykład z bit-pakowanymi macierzami. Każda komórka macierzy zajmuje 4 bity (pół bajta).

Kopiuj
type
  TUInt4    = $0 .. $F;                           // 4 bits
  TUInt4Arr = bitpacked array [1 .. 8] of TUInt4; // 32 bits (8 * 4 bits)

Tester:

Kopiuj
begin
  WriteLn('Cell:  ', BitSizeOf(TUInt4Arr[1]), ' bits');
  WriteLn('Array: ', BitSizeOf(TUInt4Arr),    ' bits');
end.

Wyjście:

Kopiuj
Cell:  4 bits
Array: 32 bits

Dowód — https://ideone.com/BYhRvL


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
Zobacz pozostałe 18 komentarzy
LA
ale bardzo optymalistyczny kodzik; albo takie coś może być użyteczne: while( i < j ) t[i+=2] :=: t[j-=2]; i co ty na to... wolno tak jechać w freepas ?:)
AU
Nie ma takiego słowa w słownik, jak optymalistyczny, musisz wytłumaczyć co masz na myśli, bo kojarzy to się z optymalizacją czy optymalnym rozwiązaniem, ale to żadne z tych.
LA
język polski bardzo giętki jest. porównaj: socjalistyczny i socjalny i jeszcze socjologiczny, totalny i totalitarny; nie bądź sztywniak: zawsze można sobie neologizm utworzyć; transcendentaliczność nie zna granic. :)
AU
Ja nie mogę sobie wyobrazić co znaczy optymalistyczny, optymalny czy optymalizacja wiem, bo jestem ekspertem w tych algorytmach znam bardzo dużo implementacji pso, covariance matrix optimization, to wygląda jak jakaś emocja. Nie mogę sobie wymyśleć co to określa terminologicznie. Możesz wytłumaczyć co miałeś na myśli, bo ty wiesz co chciałeś przekazać bo użyłeś tego wyrażenia, tylko ono akurat nie istnieje więc nie idzie tak łatwo zrozumieć co miałeś na myśli, ale może istnieć jakoś logicznie. Osoba która optymalnie próbuje podchodzić do problemu, tak rozkodowałem.
LA
nie wiesz co to jest optymalistyczny? to jest coś takiego, co uzurpuje sobie optymalność, czyli taka improwizacja, udawanie optimum. podobnie jak socjalistyczny (od socjalny), komunistyczny (od komunalny), populistyczny (popularny), itd. Nie muszę chyba już tłumaczyć co znaczy term: racjonalistyczny. :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.