Problème réaffectation involontaire d'argv[1]
Résolu/Fermé
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
-
3 févr. 2013 à 00:58
efelant Messages postés 15 Date d'inscription dimanche 3 février 2013 Statut Membre Dernière intervention 4 février 2013 - 3 févr. 2013 à 02:28
efelant Messages postés 15 Date d'inscription dimanche 3 février 2013 Statut Membre Dernière intervention 4 février 2013 - 3 févr. 2013 à 02:28
A voir également:
- Problème réaffectation involontaire d'argv[1]
- Mode anti manipulation involontaire - Guide
- Mauvaise manipulation - Forum Windows 10
- Probleme rallumage involontaire - Forum Windows
- Argc argv ✓ - Forum C++
- Bash argv - Astuces et Solutions
5 réponses
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 févr. 2013 à 01:05
3 févr. 2013 à 01:05
C'est bizarre ce m[i] = m[i-1]+largeur[i];
Mais je ne vois pas le rapport avec argv...
Mais je ne vois pas le rapport avec argv...
int** initTabContigu(int h, int * largeur) { int** m = malloc(h*sizeof(int*)); int i; for(i=0; i<h; i++) m[i] = malloc(largeur[i]*sizeof(int)); return m; }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
3 févr. 2013 à 01:05
3 févr. 2013 à 01:05
Je vois pas le rapport avec argv[1]...
Pourrais-tu nous montrer l'endroit dans ton code où tu utilises argv[1] ?
Pourrais-tu nous montrer l'endroit dans ton code où tu utilises argv[1] ?
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
3 févr. 2013 à 01:15
3 févr. 2013 à 01:15
En fait pour tester j'ai simplement fait ça :
En fait j'ai remarqué l'erreur plus loin dans mon code, mais j'ai repéré que l'erreur venait de là. Comme je le disais dans mon premier message, l'affichage change entre le premier et le deuxième printf.
(je prends en compte le changement pour la fonction, mais je ne peux pas encore la tester)
printf("FICHIER : %s\n", argv[1]); g->tabAdjacence = initTabContigu(g->nbSommet, g->tabDegres); printf("FICHIER : %s\n", argv[1]);
En fait j'ai remarqué l'erreur plus loin dans mon code, mais j'ai repéré que l'erreur venait de là. Comme je le disais dans mon premier message, l'affichage change entre le premier et le deuxième printf.
(je prends en compte le changement pour la fonction, mais je ne peux pas encore la tester)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 3/02/2013 à 01:46
Modifié par fiddy le 3/02/2013 à 01:46
Pourquoi as-tu besoin que tout soit contigu ?
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
3 févr. 2013 à 01:45
3 févr. 2013 à 01:45
Au lieu d'avoir des choses illisibles, plus rien ne s'affiche maintenant avec ce code ;-)
Et j'ai besoin d'utiliser un tableau contigu parce que c'est un devoir que je dois faire et il est conseillé d'en utiliser un.
Et j'ai besoin d'utiliser un tableau contigu parce que c'est un devoir que je dois faire et il est conseillé d'en utiliser un.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 févr. 2013 à 01:50
3 févr. 2013 à 01:50
Une question toute bête, quand je vois les différents codes, je me pose une question, ton "tableau" contigu, ressemble beaucoup à une matrice, et d'ailleurs ton code initial devait être un truc comme malloc(h*h*sizeof(int))
Si je comprends bien les modifications que tu as voulu faire, les différentes lignes n'ont pas toutes la même taille, elles sont conditionnées par largeur[i]
Je pense que l'erreur de départ est d'avoir mis dans le malloc h*largeur[0]*sizeof(int), alors que la bonne taille devrait être la somme des largeur[i], mais sans la remultiplier par h.
Dis nous déjà, si on comprends bien le principe de ton "tableau"
Si je comprends bien les modifications que tu as voulu faire, les différentes lignes n'ont pas toutes la même taille, elles sont conditionnées par largeur[i]
Je pense que l'erreur de départ est d'avoir mis dans le malloc h*largeur[0]*sizeof(int), alors que la bonne taille devrait être la somme des largeur[i], mais sans la remultiplier par h.
Dis nous déjà, si on comprends bien le principe de ton "tableau"
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
Modifié par efelant le 3/02/2013 à 01:59
Modifié par efelant le 3/02/2013 à 01:59
Hum... je dois avouer que ce n'est pas très clair pour moi cette histoire de tableau...
J'aimerai avoir un tableau de ce type là (c'est qu'un exemple) :
Donc un tableau de tableau : si le premier tableau contient 3 cases dont chaque case contient respectivement :
1 : [ ] [ ] [ ] [ ]
2 : [ ] [ ]
3 : [ ] [ ] [ ] [ ] [ ]
Mais le tableau contigu ferait que j'aurai les 11 cases à la suite :
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
Et qu'on saurait quand même où pointe chaque "ligne", la 1ère ligne sur la 1ère case, la 2ème ligne sur la 5ème case et la 3ème ligne sur la 7ème case...
J'aimerai avoir un tableau de ce type là (c'est qu'un exemple) :
Donc un tableau de tableau : si le premier tableau contient 3 cases dont chaque case contient respectivement :
1 : [ ] [ ] [ ] [ ]
2 : [ ] [ ]
3 : [ ] [ ] [ ] [ ] [ ]
Mais le tableau contigu ferait que j'aurai les 11 cases à la suite :
[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
Et qu'on saurait quand même où pointe chaque "ligne", la 1ère ligne sur la 1ère case, la 2ème ligne sur la 5ème case et la 3ème ligne sur la 7ème case...
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
3 févr. 2013 à 02:05
3 févr. 2013 à 02:05
Sous réserve que je ne me sois pas trompé, mon dernier code (#7), fait ça :
Mais je ne vois toujours pas le rapport avec argv[1]... Oserais-je demander la valeur de argc ?
m = { m[0], m[1], m[2], m[0][0], m[0][1], m[0][2], m[0][3], m[1][0], m[1][1], m[2][0], m[2][1], m[2][2], m[2][3], m[2][4] }
Mais je ne vois toujours pas le rapport avec argv[1]... Oserais-je demander la valeur de argc ?
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
Modifié par efelant le 3/02/2013 à 02:12
Modifié par efelant le 3/02/2013 à 02:12
argc est encore correct :-)
C'est exactement ce que je voulais faire... mais la variable est modifiée quand même =S
C'est exactement ce que je voulais faire... mais la variable est modifiée quand même =S
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
Modifié par efelant le 3/02/2013 à 02:25
Modifié par efelant le 3/02/2013 à 02:25
Je pense avoir compris d'où venais le problème.
En fait mon programme se compose comme cela :
x->a = Fonc1; (1)
x ->b = Fonc2; (2)
Je remarque qu'après l'éxécution de (1), argv[0] a été modifié mais argv[1] est resté tel quel.
Et après l'éxécution de (2) , c'est au tour de argv[1] d'être modifié.
Donc peut être que ça viendrait de mon x, qui a mal été alloué ou quelque chose dans ce genre
Je viens de faire une vérification... le malloc de x n'était pas fait, donc au fur et à mesure que j'affectais, il écrasait...
Désolée !
Merci pour vos codes du tableau, ça va me pousser à la réflexion.
Et merci d'avoir réfléchi avec moi :-)
En fait mon programme se compose comme cela :
x->a = Fonc1; (1)
x ->b = Fonc2; (2)
Je remarque qu'après l'éxécution de (1), argv[0] a été modifié mais argv[1] est resté tel quel.
Et après l'éxécution de (2) , c'est au tour de argv[1] d'être modifié.
Donc peut être que ça viendrait de mon x, qui a mal été alloué ou quelque chose dans ce genre
Je viens de faire une vérification... le malloc de x n'était pas fait, donc au fur et à mesure que j'affectais, il écrasait...
Désolée !
Merci pour vos codes du tableau, ça va me pousser à la réflexion.
Et merci d'avoir réfléchi avec moi :-)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
3 févr. 2013 à 02:25
3 févr. 2013 à 02:25
Ah ok. C'est plus compréhensible avec ton explication sur les crochets.
Essaie le code :
Et tout devrait rentrer dans l'ordre.
Effectivement, une allocation bancale peut écrire sur des cases mémoires et donc modifier des variables.
Essaie le code :
int** initTabContigu(int h, int * largeur){ int **m; int i; int taille=0; for (i=0; i <h; i++) { taille+=largeur[i]; } m = malloc(h * sizeof(int*)); m[0] = malloc(taille * sizeof (int)); for (i=1; i<h; i++) m[i] = m[i-1] + largeur[i-1]; return m; }
Et tout devrait rentrer dans l'ordre.
Effectivement, une allocation bancale peut écrire sur des cases mémoires et donc modifier des variables.
efelant
Messages postés
15
Date d'inscription
dimanche 3 février 2013
Statut
Membre
Dernière intervention
4 février 2013
3 févr. 2013 à 02:28
3 févr. 2013 à 02:28
Oui c'était le problème... tout bête... même si c'est en faisant des erreurs qu'on apprend, j'aurai pu l'éviter...
Je garde vos codes. Je testerai à tête reposer.
Merci beaucoup.
Je garde vos codes. Je testerai à tête reposer.
Merci beaucoup.
3 févr. 2013 à 01:09
Modifié par efelant le 3/02/2013 à 01:23
attention : assignment from incompatible pointer type [enabled by default]
Puis en regardant un peu plus le code ,
n'est affecté à rien en fait... c'était n+= je suppose ?!
3 févr. 2013 à 01:40
Bref, au risque de m'enfoncer encore un peu plus (toujours à vérifier)
3 févr. 2013 à 01:47