( Chain-Q | 2024. 04. 20., szo – 13:29 )

Ez OK, de most előástam, az van, hogy a tömbök C-ben mindig referencia szerint adódnak át, és a sizeof() egy függvényben nem a tömb méretét fogja olyankor visszaadni, hanem az alatta lévő paraméter referenciáét, valami rejtélyes, valszeg "történelmileg így alakult" ok miatt. Gondolom a varargs dolgokhoz hasznos ez, vagy valami hasonló nagyokosság... Én meg egyszer beszoptam, hogy refaktoráltam valami kódot, ami egy globális tömb változót sizeof()-olt, és átraktam paraméterbe a tömböt, hogy több példányra is meg lehessen hívni, és az összes sizeof() mágia ami a függvényben volt, atomjaira hullott. Szóval igen, hiába volt egy konstans fix méretű typedef a tömb, plusz paraméterben át kellett adni a méretét is - vagy az elemszámot... Amúgy a modern C fordítók (clang legalábbis, macOS-en) warningol erre, nagyon nagyon helyesen, de ez még "anno" volt, akkor még a régi GCC nem tette, az adott embedded platformon - és be is szoptam...

#include "stdio.h"

typedef char arr_t[1337];
arr_t arr;

void func(arr_t arr) {
  printf("%ld\n",sizeof(arr));
}

int main() {
  printf("%ld\n",sizeof(arr));
  func(arr);
  return 0;
}

Ez a kód a következő outputot adja (64bites gépen):

charlie@chainmbp-m2 arr_t % ./a.out
1337
8

A Pascal változata a kódnak ellenben konzisztens saját magával (a HUP nem tud Pascal kódot syntax highlightolni, bocs):

type
  arr_t = array[1..1337] of char;

var
  arr: arr_t;

procedure f_val(arr: arr_t);
begin
  writeln('sizeof by value:',sizeof(arr));
end;

procedure f_ref(var arr: arr_t);
begin
  writeln('sizeof by reference:',sizeof(arr));
end;

begin
  f_val(arr);
  f_ref(arr);
  writeln('sizeof as global:',sizeof(arr));
end.

... és ezt adja vissza:

charlie@chainmbp-m2 arr_t % ./arr
sizeof by value:1337
sizeof by reference:1337
sizeof as global:1337

És akkor még olyan finomságokat nem is részleteztünk, hogy a length() is hasonlóan működik, szóval az elemszámot is le lehet kérdezni, nem kell sizeof-ból és az elem méretéből számolgatni, sőt, mivel Pascalban a tömbindexek range típusok (lehet egy tömböd boolean index-szel, vagy akár -13-tól +27-ig), ezért a low(tömb) mindig a legalacsonyabb, a high(tömb) mindig a legmagasabb elemszámot adja vissza, ami igen hasznos index-ellenőrzéshez, vagy akár egy tömbön végig-iteráláshoz, és ha megváltoztatod az eredeti típust, minden automatikusan marad a helyén. stb. Ja és igen, statikus méretű tömböknél ezek fordítás közben konstansokra cserélődnek, nem valamiféle management helper lesz meghívva. Amikor azt mondom, a Pascal típusrendszerét és a körülötte lévő infrastrukturát preferálom, ilyesmikre gondolok. Vagy pl. itt egy példa a set-ek, tömbök és enum-ok együttműködéséről, amit még régebben írtam. Hogyan tudja egy konzisztens típusrendszer és a kapcsolódó adatszerkezetek masszívan leegyszerűsíteni és biztonságosabbá tenni a kódot, ugye.

Na mindegy. Nem akartam belemenni, de ha már cizellálunk. :)