
Envoyé par
Sve@r
Mais si on rectifie le calcul (ie tab[i]=(int*)((char*)tab + off), alors au résultat
Ce n'est pas le seul « calcul » à rectifier
.
Ceci off = nLig + nCol * (i + nLig); est faux quelle que soit la méthode.

Envoyé par
Winjerome
on passe la première zone de taille nLig * sizeof(*tab). Mais ensuite il faut se déplacer par unités de sizeof(int). [...] aller sur la ie ligne revient à se déplacer de i * nCol cases
J'ai déjà donné la méthode en passant par un int* :
int *debut_tableau = (int*)(tab + nLig); // on passe la zone des pointeurs (unités de nLig = sizeof(*tab) = sizeof(int*)).
tab[i] = debut_tableau + i * nCol; // on se déplace sur la i-ème ligne (unités de i * nCol = sizeof(*debut_tableau) = sizeof(int)).
Pour ta méthode avec un (char*) il ne faut pas oublier de multiplier par les bons sizeof (sizeof(char) étant égal à 1) :
1 2 3
| size_t off = nLig * sizeof(*tab) // on passe la zone des pointeurs
+ i * nCol * sizeof(**tab); // puis se déplace sur la i-ème ligne
tab[i] = (int*)((char*)tab + off); |

Envoyé par
Sve@r
Oui mais pour moi c'est dans l'autre sens. Les pointeurs sont à la fin de la zone des ints, qui, elle, commence au début de tab. Ceci pour permettre par exemple à un itérateur qui partirait de tab de pouvoir lui-aussi accéder aux ints par simple incrément sans avoir à le faire partir d'un offset à la c..
Et ces pointeurs continuent évidemment à pointer vers les différents "tab[x]" qui identifient chaque début de ligne.
Ok pourquoi pas, dans ce cas, il faudra utiliser un autre int** qui pointera vers le début de la zone des pointeurs pour garder l'écriture [i][j].
1 2
| int *debut_tableau = (int*)tab;
int **pointeurs = (int**)(debut_tableau + nCol * nLig); |
Puis
pointeurs[i] = debut_tableau + i*nCol;
puis pointeurs[i][j] ou debut_tableau[i * nCol + j]…

Envoyé par
Sve@r
Sinon très belle image. Tu l'as faite avec quoi ?
Merci, avec LaTeX / TikZ.
Partager