rozumiem pq że tam jest Result[1] bo tym że Resultem ma być
String, który jak wspomniał Dryobates jest Array of Char,
gdzie w polu 0 ma być zapisana długość, więc BlockRead ma zapisać
od pola numer 1, a długość tego stringa do pola 0 zapisują skrzaty ?
Dryobates chyba troszke pomylil. Dlugosc stringa nie moze byc zapisywana w polu zero, bo pole ma jeden bajt a string ma maks dlugosc 231-1 (dla AnsiString, 230-1 dla WideString). Dlugosc jest zapisywana w polu zero w starych pascalowskich statycznych stringach deklarowanych w Delphi jako ShortString albo string[liczba_do_255], ktore maja maks dugosc 255.
Dlugi string jest zapisany jako wskaznik. Jesli lancuch jest pusty, to wskaznik ma wartosc nil i na tym sprawa sie konczy. Jesli lancuch ma zawartosc, wtedy wskaznik wskazuje na poczatek dynamicznie przydzielonego obszaru pamieci zawierajacego tresc lancucha. Natomiast 8 bajtow przed miejscem wskazywanym przez wskaznik zajmują 32-bitowe pole trzymajace dlugosc i 32-bitowy licznik referencji.
Licznik referencji jest wykorzystywany dla zaoszczedzenia czasu i pamieci. Lancuchy sa wskaznikami, wiec jesli sa identyczne (bylo przypisanie s2:=s1) wtedy moga po prostu wskazywac na ten sam obszar pamieci zawierajacy te sama tresc, nie trzeba tworzyc 2 identycznych obszarow pamieci zawierajacych to samo. Licznik referencji pamieta ile stringow (wskaznikow) wskazuje na dana tresc. Jezeli lancuch jest kasowany (s1:=nil) albo jest zmieniona jego tresc (s1:=s3) wtedy licznik referencji starej tresci jest zmniejszany. Gdy licznik referencji dojdzie do zera, oznacza to, ze zaden lancuch(wskaznik) nie wskazuje juz tej pamieci i pamiec jest zwalniana.
Ponadto, jesli wykonujemy s1[1223]:='x' zeby zmienic jedna litere, wtedy jest sprawdzany licznik referencji. Jesli jest =1, wtedy podmieniana jest ta litera i rzecz konczy sie szybko. Tylko jesli jest >1, wtedy trzeba utworzyc nowa kopie lancucha, bo dotychczasowa byla uzywana przez >1 lancuch (warto tu dodac, ze tablice dynamiczne nie stosuja takiego mechanizmu (zwanego copy-on-write), jesli zrobimy A:=B; (A i B to tablice dynamiczne) a potem A[213]:=7; to B[213] tez stanie sie rowne 7). (a wszystko to jest w helpie do Delphi...)
Z powyzszego wynika, ze nie ma przeszkody by dynamiczne lancuchy byly indeksowane od zera (jak tablice dynamiczne) a nie od 1 (jak krotkie lancuchy). Przypuszczam, ze zdecydowano sie na numerowanie od 1, by uproscic pisanie i korzystanie z procedur dzialajacych na lancuchach. Moga one bez modyfikacji czy przeciazania przyjmowac krotkie i dynamiczne lancuchy i przetwarzac je na tych samych zasadach.