Zkus si přečíst něco o polích v C.
&ch[0][0] je typu char*, jak by mohlo fungovat předání do funkce s argumentem char **.
Typ pole je ekvivalentní s const *T. Dvourozměrné pole je tedy defakto (const **).
Operátor [a] je vlastně *(pole + a*sizeof(T)).
Klíčový rozdíl mezi polem a pointerem je v tom, že sizeof(char[20]) je dvacet, zatímco sizeof(const char*) je rovno (sizeof void *) (4 nebo

. Proto nemůže fungovat práce
s polem předaným do funkce jako char **, protože dovjrozměrné pole je ukazatel na jednorozměrné pole, kde sizeof toho jednorozměrnýho pole jde zjistit z deklarace toho pole.
Ale v tý funkci je sizeof toho vnitřku zas jen velikost ukazatele na char. Proto to kompilátor odhchytí, protože to jsou díky tomu nekompatibilní typy.
Jediná možnost je tedy buďto použít dynamickou alokaci každýho řádku, kde to je pak,
takže se provádí o jednu dereferenci navíc
a->radka-> elementy radku
->radka-> elementy radku
->radka-> elementy radku
A nebo v deklaraci funkce dát alespoň správný typ pro všechny úrovně pole kromě poslední. tzn
*(char c[20])
nebo
char c[][20]
A popř. pro každej rozměr vygenerovat vlastní fci šablonou.
---
nm: spojité pole s vedlejším polem ukazující na začátky řádky by bylo rychlejší, kvůli prefetchi, menším výpadkům v cache a rychlejší alokaci.