1

yop,

Je voudrais savoir si :
1. on peut modifier argc
2. on peut modifier *argv
3. on peut modifier **argv

Les réponses que je pense avoir :
1. pour argc, c'est pas si grave si c'est pas possible, c'est pas un problème de travailler sur une copie.
2. pour *argv, j'ai pas trouvé de réponse encore.
3. d'après ce gars qui a l'air d'avoir la norme sous le coude, c'est possible de modifier les chaines des paramètres.

Pourquoi j'ai besoin de ça ? Parce que je fais deux passes sur une ligne de commande, et j'aimerais tout simplement remplacer le pointeur d'un paramètre traité à la passe 1 par le pointeur du paramètre suivant

Merci d'avance. smile

(et au passage, j'apprends que argv[argc] == NULL, j'ignorais, et c'est pas mal)

extrait de la norme :
Undefined behavior is otherwise indicated in this International Standard by the words ‘‘undefined behavior’’ or by the omission of any explicit definition of behavior" §4 2
Si rien n'est précisé, je dois partir du principe que ce n'est pas modifiable, et m'occuper moi-même de mon tableau, c'est dommage mais pas si grave...
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

2

Chapter §5.1.2.2.1 Program startup de la norme C11 :

The parameters argc and argv and the strings pointed to by the argv array shall
be modifiable by the program, and retain their last-stored values between program
startup and program termination.

Donc oui, il a raison et:
1/ Oui
2/ Oui
3/ Oui

mais ne dépasse pas la taille des chaines qui y sont stockées.

3

Ah, en effet, j'ai pas percuté que j'avais là ma réponse à la question 1.
Par contre, je comprends toujours pas pourquoi tu me dis que ça répond à 2. Les strings pointed to by the argv array, c'est donc argv[x][y]. Mais je ne vois rien en ce qui concerne le tableau de pointeurs en lui-même.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

4

argv est un pointeur vers un tableau de string. Lorsqu'on dit que argv est modifiable, c'est le tableau, pas le pointeur, dont on parle.
(Ca n'a pas beaucoup de sens autrement).

5

Ok merci.
(je pensais qu'on pouvait modifier le pointeur pour pointer sur un autre tableau, par exemple)
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

6

Et comment peut-on avoir la garantie que le tableau pointé est en mémoire accessible en écriture ?
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

7

Ben il est censé l'être, si la norme dit qu'il est modifiable, non ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

8

Ximoon (./6) :
Et comment peut-on avoir la garantie que le tableau pointé est en mémoire accessible en écriture ?
C'est comme cela que j’interprète :
The parameters argc and argv
and the strings pointed to by the argv array shall be modifiable by the program

9

Et dans la phrase que tu cites, argc et argv semblent désigner les variables, donc un compteur et un pointeur. C'est pour ça que je voyais pas les choses comme toi. D'ailleurs, je te crois sur parole, mais ça reste toujours flou pour moi. Mais bon, tant que ça gêne pas PedroM, ça me va grin
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

10

Le second point en gras parle du tableau argv, donc pour moi, dans le premier point, il faut comprendre que c'est le tableau argv qui est modifiable.

11

Là ok, en effet. Merci bien. smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

12

Je suis d'accord avec Folco : formulé tel quel, c'est ambigu. Mais ce serait vraiment étonnant que le pointeur vers le tableau et les chaînes soient modifiables, mais pas le tableau.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

13

Je suis d'accord avec PpHd : formulé tel quel, ce n'est pas ambigu non Merci pour la précision, je n'avais pas été assez attentif happy
avatarQue cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

14

Ouais, mais non, pas d'accord tongue

Dans le second point, il est précisé "argv array", alors que dans le premier point, c'est "parameter argv". Par défaut, je considère que ce n'est pas forcément la même chose.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

15

On pourrait dire que s'ils ont pris la peine de préciser "array", c'est pas pour rien, c'est qu'il s'agit bien de *argv. Mais le fait qu'on discute de ce point montre que ce n'est pas aussi clair que ça.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

16

Dans nuttx,

argv=malloc (argc*sizeof (char*)+total des strlen+1)
Puis on affecte les argv [] et les chaines suivent les pointeurs.
(A peu pres)

Rien ne tempeche donc de modifier les pointeurs argv[i] par contre faut pas modifier les chaines stockees apres, sinon jardinage.

Dailleurs getopt() se gene pas pour yrafiquer argcv.

17

oui, j'ai vu que getopt fait la fiesta dans argv.
Par contre, dans ce que tu dis de nuttx, ça serait pas plutôt (argc + 1)*sizeof(char*) pour avoir NULL en fin de tableau, et (total des strlen + argc) pour avoir un caractère nul à la fin de chaque chaine ? A moins que t'aies volontairement fait de l'abrégé, ou que je me plante ^^
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

18

Oui jai oublié le null final en abregeant.

Windows fait un truc similaire dailleurs puisque pour lui la ligne de commande est monolithique, avec une routine de decoupage. Javais eu a la recoder pour wince.

19

De toute façon puisque rien n'est const c'est modifiable, sinon je trouve que ce serait un problème de la norme.

20

Bonne remarque.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

21

@Pen^2: La même norme qui dit (en C, du moins) que les chaînes littérales ne sont pas const?

Je suis vraiment content que C++ (et gcc si on le configure bien) ait corrigé cette partie-là.
avatarMaintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

22

Mmmm, certes grin

23

Et bien, il comprend vite, mais il doit réfléchir longtemps notre Pen² !
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

24

Mmmm, certes grin

25

grin
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

26

(Je voulais attendre un mois, mais bon tongue)