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.
- 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.
- nie ma tamplete
Generyki są we Free Pascalu i Delphi od miliona lat, w dodatku mają zdecydowanie bardziej przyjazną składnię.
- nie ma referencji w kodzie
Jakich referencji? Pisz precyzyjnie, bo rzucać buzzwordami to każdy potrafi.
- 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.