Attention. Cela ne fonctionne (quand tu appelles la fonction avec l'argument correct) que par hasard pour le premier pointeur du tableau. (*s)[1].altitude = 12; serait faux.
setaltitude(mastruct **s) { s[0]->altitude = 12;
ou bien (*s[0]).altitude = 12;
}
et je l'appelle comme ceci dans mon main:
mastruct s[10];
setaltitude(&s);
setaltitude(s);
je ne comprend pas pq j'ai une exception à la ligne du (*s)[0].altitude = 12;
Ta fonction attend un argument du type mastructure** (pointeur de pointeur de structure) et tu lui donnes un argument du type mastructure * (*) [10] (pointeur de tableau de pointeurs vers mastructure).
L'argument 's' (tableau de pointeur de structure) devient automatiquement un pointeur de pointeur de structure.
-- Horst
On Fri, 5 Mar 2004 21:37:56 +0100, "John Ramm" <john.ramm@hotmail.com>
wrote:
bonjour
j'ai une structure du style
typedef struct {
int altitude;
} mastruct;
Attention. Cela ne fonctionne (quand tu appelles la fonction avec
l'argument correct) que par hasard pour le premier pointeur du
tableau. (*s)[1].altitude = 12; serait faux.
setaltitude(mastruct **s) {
s[0]->altitude = 12;
ou bien
(*s[0]).altitude = 12;
}
et je l'appelle comme ceci dans mon main:
mastruct s[10];
setaltitude(&s);
setaltitude(s);
je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;
Ta fonction attend un argument du type mastructure** (pointeur de
pointeur de structure) et tu lui donnes un argument du type
mastructure * (*) [10] (pointeur de tableau de pointeurs vers
mastructure).
L'argument 's' (tableau de pointeur de structure) devient
automatiquement un pointeur de pointeur de structure.
Attention. Cela ne fonctionne (quand tu appelles la fonction avec l'argument correct) que par hasard pour le premier pointeur du tableau. (*s)[1].altitude = 12; serait faux.
setaltitude(mastruct **s) { s[0]->altitude = 12;
ou bien (*s[0]).altitude = 12;
}
et je l'appelle comme ceci dans mon main:
mastruct s[10];
setaltitude(&s);
setaltitude(s);
je ne comprend pas pq j'ai une exception à la ligne du (*s)[0].altitude = 12;
Ta fonction attend un argument du type mastructure** (pointeur de pointeur de structure) et tu lui donnes un argument du type mastructure * (*) [10] (pointeur de tableau de pointeurs vers mastructure).
L'argument 's' (tableau de pointeur de structure) devient automatiquement un pointeur de pointeur de structure.
-- Horst
Régis Troadec
Salut,
"John Ramm" a écrit dans le message de news: 4048e454$
bonjour
j'ai une structure du style typedef struct { int altitude; } mastruct;
Le nom d'un tableau est synonyme de l'adresse de son premier element, donc s = &s[0]. Et &s, c'est pareil. s est un tableau, c'est en gros equivalent a un pointeur sur mastruct ( mastruct *s), et setaltitude attend un pointeur sur un pointeur de mastruct. Normalement, ton compilo a du renvoyer un warning : types de pointeurs incompatibles a l'appel de la fonction setaltitude().
je ne comprend pas pq j'ai une exception à la ligne du (*s)[0].altitude = 12;
s est un mastruct* et non un mastruct**, d'ou le segfault. Une copie locale de l'adresse du tableau s est realisee au niveau de la fonction setaltitude() lors de l'appel (car s=&s[0]=&s pour les tableaux) et tu déréfences (accèdes au contenu du pointeur) 2 fois avec d'abord l'opérateur *, puis avec l'opérateur []
Une solution, enlever un niveau d'indirection a setaltitude() :
void setaltitude(mastruct *s) { s[0].altitude = 12; // ou *s = 12; ou *(s+0); }
Appel avec simplement setaltitude(s);
HTH Regis
merci!
Salut,
"John Ramm" <john.ramm@hotmail.com> a écrit dans le message de news:
4048e454$1@epflnews.epfl.ch...
bonjour
j'ai une structure du style
typedef struct {
int altitude;
} mastruct;
Le nom d'un tableau est synonyme de l'adresse de son premier element, donc s
= &s[0].
Et &s, c'est pareil.
s est un tableau, c'est en gros equivalent a un pointeur sur mastruct (
mastruct *s),
et setaltitude attend un pointeur sur un pointeur de mastruct.
Normalement, ton compilo a du renvoyer un warning : types de pointeurs
incompatibles a l'appel de la fonction setaltitude().
je ne comprend pas pq j'ai une exception à la ligne du
(*s)[0].altitude = 12;
s est un mastruct* et non un mastruct**, d'ou le segfault.
Une copie locale de l'adresse du tableau s est realisee au niveau de la
fonction setaltitude() lors de l'appel (car s=&s[0]=&s pour les tableaux) et
tu déréfences (accèdes au contenu du pointeur) 2 fois avec d'abord
l'opérateur *, puis avec l'opérateur []
Une solution, enlever un niveau d'indirection a setaltitude() :
void setaltitude(mastruct *s)
{
s[0].altitude = 12; // ou *s = 12; ou *(s+0);
}
Le nom d'un tableau est synonyme de l'adresse de son premier element, donc s = &s[0]. Et &s, c'est pareil. s est un tableau, c'est en gros equivalent a un pointeur sur mastruct ( mastruct *s), et setaltitude attend un pointeur sur un pointeur de mastruct. Normalement, ton compilo a du renvoyer un warning : types de pointeurs incompatibles a l'appel de la fonction setaltitude().
je ne comprend pas pq j'ai une exception à la ligne du (*s)[0].altitude = 12;
s est un mastruct* et non un mastruct**, d'ou le segfault. Une copie locale de l'adresse du tableau s est realisee au niveau de la fonction setaltitude() lors de l'appel (car s=&s[0]=&s pour les tableaux) et tu déréfences (accèdes au contenu du pointeur) 2 fois avec d'abord l'opérateur *, puis avec l'opérateur []
Une solution, enlever un niveau d'indirection a setaltitude() :
void setaltitude(mastruct *s) { s[0].altitude = 12; // ou *s = 12; ou *(s+0); }
Appel avec simplement setaltitude(s);
HTH Regis
merci!
Horst Kraemer
On Fri, 5 Mar 2004 21:37:56 +0100, "John Ramm" wrote:
bonjour
j'ai une structure du style typedef struct { int altitude; } mastruct;