salut à tous et à toutes
je suis débutant en programmation en C
svp ou se trouve l'erreur dans ce programme
Pièce jointe 591486
Version imprimable
salut à tous et à toutes
je suis débutant en programmation en C
svp ou se trouve l'erreur dans ce programme
Pièce jointe 591486
- tu retournes un tableau local
- indenter l'intérieur des for aide à la lisibilité
Et hors programme
- poster une image quand poster le code est plus rapide, simple et efficace
je retourne un pointeur qui stocke l'adresse du premier élément d'un tableau.
d'après ce que je sais:
le passage par adresse ça passe en C
après vérification
la valeur de v est la même que celle de t et p.
Bonsoir.
A moins de dire une bêtise p[] n’existe que dans la fonction multipli ();.
Retourner son pointeur renvoie en réalité une adresse non allouée. Le contenu de cette portion mémoire est donc aléatoire.
Transmets plutôt ton tableau alloué dans le main (); à la fonction sous cette forme :
Toute modification de p dans multipli () sera bien entendu conservée au retour de la fonction.Code:
1
2
3
4 int p[11]; multipli (p, x); ...
Bonjour
L'erreur: on ne retourne jamais un tableau local car on ne fait que retourner une adresse, adresse d'un truc qui n'existe plus quand on quitte la fonction. Tu veux retourner un pointeur, soit tu retournes un pointeur que tu as préalablement reçu en paramètre (dans ce cas il n'est pas local), soit il est local mais alors tu lui alloues un espace (malloc/calloc) avant de le retourner mais l'allocation mémoire c'est peut-être une notion pas encore connue.
Quelques détails: traiter *(p+i) ne sera pas plus rapide que de traiter p[i]. C'est vrai qu'on dit qu'utiliser un pointeur est plus rapide qu'utiliser un indice, mais il faut savoir lire cette affirmation. C'est plus rapide uniquement à condition d'avoir le pointeur déjà positionné sur la bonne case du tableau ; et de préférence si la case est utilisée plus d'une fois (pour rentabiliser l'incrément, qui lui reste quoi qu'il arrive nécessaire). Autrement dit, écrire for (i=0; i < 11; i++) printf("%d + %d=%d\n", t[i], t[i], t[i] + t[i]) pourra là s'écrire for (i=0, p=t; i < 11; i++, p++) printf("%d + %d=%d\n", *p, *p, *p + *p). Mais sinon *(p+i) ou p[i] c'est exactement pareil.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdio.h> void multiplie(int *t, int n, size_t sz) { size_t i; int *p; for (i=0, p=t; i < sz; i++, p++) *p=i*n; } int main() { int t[11]; multiplie(t, 7, 11); size_t i; int *p; for (i=0, p=t; i < 11; i++, p++) printf("%d\n", *p); }
Merci beaucoup
vous m'avez vraiment éclairé