Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

L'utilisation d'indices négatifs pour un sous tableau

6 réponses
Avatar
Luc
Bonjour,

J'ai lu que l'on ne pouvait pas utiliser d'indice négatif
pour un tableau. Mais le K&R précise que c'est parfaitement
autorisé pour un sous tableau alors je me suis mis en tête de tester cela.
Voilà mon petit essai et ça semble bien fonctionner.
Mais suis-je toujours dans la légalité
par rapport au langage C ?

#include <stdio.h>
#include <stdlib.h>

#define INDICE_TAB 9

void MaFonction();

int main(int argc, char **argv) {

int tab[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

MaFonction(&tab[INDICE_TAB], INDICE_TAB);

return EXIT_SUCCESS;
}

void MaFonction(int *ptr, int indice) {

int i;

for(i = 0 ; i >= -indice; i--)
printf("%d\n", ptr[i]);
}

6 réponses

Avatar
Marc Lasson
Luc a écrit:
Bonjour,
Salut,


J'ai lu que l'on ne pouvait pas utiliser d'indice négatif
pour un tableau. Mais le K&R précise que c'est parfaitement
autorisé pour un sous tableau alors je me suis mis en tête de tester cela.
Voilà mon petit essai et ça semble bien fonctionner.
Il fonctionne.


Mais suis-je toujours dans la légalité
par rapport au langage C ?
Tu n'iras pas en prison aujourd'hui.


#include <stdio.h>
#include <stdlib.h>

#define INDICE_TAB 9

void MaFonction();
Tu peux faire ca... mais bon, amha, c'est pas très gentil pour le

lecteur, je préférerais que tu mettes les paramètres de ta fonction,
ou mieux encore: que tu la définnises avant (comme ca: tu économises
le prototype).

<snip le reste du code, correct>

Les règles sont simples:

- Pas d'indice négatif pour un tableau.
- Si p est un pointeur, pour tout int i, *(p + i) peut
s'écrire p[i] (meme pour i < 0).
( - Le nom d'un tableau est l'adresse de son premier élément. )

Toi ce que tu as fait :

- Tu as passé l'adresse d'un element du tableau.
- Tu la ranges dans un pointeur.
- Et tu utilises le pointeur, avec la notation vu dans la
seconde règle.

Aucun problèmes.

--
Marc.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Luc" <...> wrote:

Bonjour,

J'ai lu que l'on ne pouvait pas utiliser d'indice négatif
pour un tableau.


Certes. Les indices autorisés d'un tableau de taille N iront de 0 à N-1.
C'est immuable.

Mais le K&R précise que c'est parfaitement
autorisé pour un sous tableau alors je me suis mis en tête de tester cela.


"Sous Tableau", on est bien d'accord?

Voilà mon petit essai et ça semble bien fonctionner.
Mais suis-je toujours dans la légalité
par rapport au langage C ?

#include <stdio.h>
#include <stdlib.h>

#define INDICE_TAB 9

void MaFonction();


Cette declaration n'est pas un prototype valide. Il n'est pas nécessaire
d'utiliser un prototype séparé si on suit la regle de conception simple
"définir avant d'utiliser".

int main(int argc, char **argv) {


Les paramètres ne sont pas utilisés.

int tab[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

MaFonction(&tab[INDICE_TAB], INDICE_TAB);


Une façon compliquée d'écrire:

MaFonction (tab + INDICE_TAB, INDICE_TAB);


return EXIT_SUCCESS;
}

void MaFonction(int *ptr, int indice) {


Le terme 'indice' est mal choisi. J'aurais plutôt dit 'taille', car en fait,
l'indice valide va de 0 à - (taille - 1).

int i;

for(i = 0 ; i >= -indice; i--)


Merci de toujours mettre les {}, ça aide...

{

Je rajoute un petit contrôle de cohérence.

assert (i <= 0);
assert (i > -indice);

printf("%dn", ptr[i]);


Il aurait été pédagogique d'afficher l'indice.
}

}


Ok, mais je pense que le type requis pour 'i' est ptrdiff_t...

Ca reste quand même extèmement tordu intellectuellement. Attention à
l'entorse du lobe frontal.


#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <assert.h>

#define INDICE_TAB 9

static void MaFonction (int const *const ptr, size_t const taille)
{
ptrdiff_t i;

for (i = 0; i >= -taille; i--)
{
assert (i <= 0);
assert (i > -taille - 1);
printf ("[%ld] = %dn", (unsigned long) i, ptr[i]);
}
}

int main (void)
{

int tab[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

MaFonction (tab + INDICE_TAB, INDICE_TAB);
return EXIT_SUCCESS;
}

D:CLCLLUC>bc proj.prj
[0] = 10
[-1] = 9
[-2] = 8
[-3] = 7
[-4] = 6
[-5] = 5
[-6] = 4
[-7] = 3
[-8] = 2
[-9] = 1

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Marc Lasson wrote:

Luc a écrit:
Arf, j'ai carrément oublié d'écrire ses paramètres...
Tu as le droit.



Mais cette pratique mérite la prison!

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Luc
"Sous Tableau", on est bien d'accord?


oui

Cette declaration n'est pas un prototype valide.


Parce que j'ai oublié d'écrire les types des paramètres?

MaFonction(&tab[INDICE_TAB], INDICE_TAB);


Une façon compliquée d'écrire:

MaFonction (tab + INDICE_TAB, INDICE_TAB);


Sans doute, mais &tab[INDICE_TAB] montre bien que c'est l'adresse
de l'élément d'indice INDICE_TAB que l'on transmet.

Je rajoute un petit contrôle de cohérence.

assert (i <= 0);
assert (i > -indice);


je ne connais pas "assert" et je ne sais pas à quoi ça sert.

Ca reste quand même extèmement tordu intellectuellement.


C'est l'idée de parcourir un sous tableau avec des indices négatifs
qui est tordue ou mon code ?
Luc


Avatar
Luc
je ne connais pas "assert" et je ne sais pas à quoi ça sert.


Maintenant que tu as ouvert ton livre de C, tu sais!


Il fait trop chaud pour tourner les pages...

C'est l'idée de parcourir un sous tableau avec des indices négatifs
qui est tordue ou mon code ?


L'idée...


Je suis d'accord mais c'était juste pour "voir" cela.
Luc


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Luc" <...> wrote:

Maintenant que tu as ouvert ton livre de C, tu sais!


Il fait trop chaud pour tourner les pages...


Erreur! Tourner les pages produit un déplacement d'air non négligeable, donc
une légère évaporation sur la peau, donc un léger abaissement de la
température externe!

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/