Passer un tableau de structures en paramètres [C] - C - Programmation
Marsh Posté le 10-05-2007 à 23:48:29
Tu serais pas à l'ECE toi ?
sinon je dirais a premiere vue
void init(t_lemmings* lem) .
Marsh Posté le 10-05-2007 à 23:52:34
ramseys a écrit : Tu serais pas à l'ECE toi ? |
Ca revient au même si je ne m'abuses
Marsh Posté le 11-05-2007 à 01:25:57
ben non, dans l'exempe de ramseys, tu passes ton array "par référence" (un pointeur vers la structure en mémoire), ce qui permet de l'utiliser à partir de son adresse.
si mes souvenirs sont bons, on trouve ça dès les premiers chapitres ne n'importe quel bouquin sur le C.
avec des langages plus évolués, ça se fait de façon automatique (types de valeur vs types de référence)
attention : dans ce cas, tu travailles avec le tableau original et non une copie locale, donc toute modificétion apportée dans ta fonction sera visible depuis l'ensemble du programme.
Marsh Posté le 11-05-2007 à 01:34:47
galaxed a écrit : Salut à tous,
|
avec un tableau de N éléments, on boucle de 0 à N-1
Marsh Posté le 11-05-2007 à 01:36:04
donc idéalement transformer en:
void init( t_lemmings *lem, int size );
ou
void init( t_lemmings lem[], int size );
tu peux aussi te faire des:
void copy_lemming( t_lemmings *dest, t_lemmings *src );
void copy_lemmings( t_lemmings *tab, unsigned int size, t_lemmings *src)
{
while( size )
{
copy_lemming( tab, src );
++tab;
--size;
}
}
pour initialiser, tu te fais un:
t_lemmings lem_std;
lem_std.machin=....
....
t_lemmings lasmala[30];
copy_lemmings( lasmala, 30, lem_std );
Marsh Posté le 11-05-2007 à 06:45:31
MagicBuzz a écrit : ben non, dans l'exempe de ramseys, tu passes ton array "par référence" (un pointeur vers la structure en mémoire), ce qui permet de l'utiliser à partir de son adresse. |
Au temp pour moi, la fonction etant :
Code :
|
et non pas init(t_lemmings lem[30]) comme écrit plus tot
Marsh Posté le 11-05-2007 à 08:23:26
ah oui effectivement.
c'est chelou par contre que tu puisses passer un array par valeur...
moi j'éviterais hein, tu bouffes de la mémoire pour rien là
Marsh Posté le 11-05-2007 à 09:29:01
quand tu passe un array par valeur tu passe que la valeur de l'adresse du premir élément du tableau de toute facon, non ?
Marsh Posté le 11-05-2007 à 09:38:04
Il n'y a que du passage par valeur en C les gars ... sauf que les tableaux ne sont pas copiables/lvalue/etc, mais ont la propriété que T t[N], t peutêtre converti implicitement en T* de valeur &t[0]
Marsh Posté le 11-05-2007 à 10:05:39
ok
sinon, quand je parle de "passage par référence", c'est justement ça que je veux dire . je suis d'ailleurs étonné que le C fasse cette conversion implicitement (ce qui correspond donc rigoureusement à un type référence, qui n'est pas censé exister en C).
je pensais qu'on devait manuellement passer la référence (pointeur) plutôt que la valeur (convertie implicitement en référence, comme dans les langages de haut niveau qui font la différence entre types valeur et types référence). je ne pensais même pas que ça compilerait sinon.
Marsh Posté le 11-05-2007 à 10:10:48
MagicBuzz a écrit : sinon, quand je parle de "passage par référence", c'est justement ça que je veux dire . je suis d'ailleurs étonné que le C fasse cette conversion implicitement (ce qui correspond donc rigoureusement à un type référence, qui n'est pas censé exister en C). |
Même pas.
passage par référence != passage par pointeur
Y a pas de référence en C. Et le passage par pointeur oblige à déréférencer ce pointeur pour accéder aux données, et puis au final c'est juste un bête passage par copie de l'adresse d'une zone mémoire.
Passage par pointeur :
void blabla (int *a)
{
*a = 42;
}
Passage par référence (C++) :
void blabla(int &a)
{
a = 42;
}
Marsh Posté le 11-05-2007 à 10:31:18
Je dois avoir le vocable pollué par le C# et toi par le C/C++, tu dis la même chose que moi j'ai l'impression
Si tu as le droit d'écrire ça en C :
Code :
|
Alors je ne vois pas de différence par rapport au comportement d'un Array en C# (type référence), passé par valeur à une fonction (c'est à dire pointeur passé par valeur, mais pas les données elles-mêmes)
Citation : |
http://msdn2.microsoft.com/fr-fr/l [...] s.80).aspx
"ref" correspond à une façon sexy de passer un pointeur sur le pointeur.
PS : Si effectivement, ça n'a rien à voir, je vais peut-être enfin comprendre pourquoi j'ai jamais rien compris au C
Marsh Posté le 11-05-2007 à 11:04:42
MagicBuzz a écrit : Je dois avoir le vocable pollué par le C# et toi par le C/C++, tu dis la même chose que moi j'ai l'impression
|
mais tu nous saoules avec tes références C#, c'est complètement hors sujet.
Et bel contradiction sur le passage par valeur.
Ici la syntaxe [] c'est la __même_chose__ qu'une *.
Marsh Posté le 11-05-2007 à 11:37:20
Ici la syntaxe [] c'est la __même_chose__ qu'une *.
=> c'est quoi la différence avec un autre langage ?
un array a toujours été ni plus ni moins qu'une adresse mémoire. et le [] n'est qu'une façon simple de gérer l'indexation à partir de la taille du type de base du array plutôt que de se faire chier à la gérer à la main à grands coups de address + sizeof(basetype) * index
Ceci est tout aussi vrai en C qu'en Java ou en Ruby. Quand il s'agit d'un langage évolué permettant une représentation physique d'un array de façon non contigüe en mémoire, c'est de toute façon le travail du CLR (ou autre) de dématérialiser cette réprésentation pour ne laisser visible au programme qu'une partie contigüe. Le fonctionnement reste donc toujours le même.
Arrête de m'insulter, et pour une fois, explique vin dieu.
J'ai le droit de pas piger, t'as le droit de piger, mais t'as aussi surtout le devoir d'expliquer à ceux qui pigent pas. Je te rappelle que t'es sur un forum d'entre-aide, pas devant un jury d'un concours.
Marsh Posté le 11-05-2007 à 11:52:16
MagicBuzz a écrit : Ici la syntaxe [] c'est la __même_chose__ qu'une *. |
Bah non. Apprends le C. Un tableau n'est pas une adresse mémoire. Je parlais de void foo(int *x) sémantiquement égal à void foo(int x[]). La deuxieme notation connote juste une sémantique usage différent. Mais c'est la même chose, donc l'usage est le même de toutes façons ...
MagicBuzz a écrit : |
bah non. La tu compares un langage avec passage par valeur avec des langages ou passage par référence (sauf primitif en java). Personne ne parle d'implémentation ici. On parle type et sémantique. Le C c'est du passage par valeur.
Marsh Posté le 11-05-2007 à 11:58:09
bjone a écrit : avec un tableau de N éléments, on boucle de 0 à N-1 |
Je te remercie mais je vais bien de 0 a 29
Marsh Posté le 11-05-2007 à 12:28:25
MagicBuzz tu vas encore m'en vouloir mais franchement, arrête de poster dans cette catégorie. Ou alors pose des questions, mais ne répond pas alors qu'il y a manifestement beaucoup de principes fondamentaux qui t'échappent en C. Moi tu vois, même si je connais bien le C, je ne connais pas tout en C. Quand je ne sais pas, ou quand je ne suis pas sûr de moi, je m'abstiens de répondre ou je dis clairement que j'ai un doute. Toi tu affirmes des choses fausses avec une assurance qui est dangereuse pour les novices.
Marsh Posté le 11-05-2007 à 13:25:48
galaxed a écrit : Salut à tous,
|
Si on reprend depuis le début ... quelle est la déclaration de lem ?
Marsh Posté le 11-05-2007 à 13:26:23
galaxed a écrit : Je te remercie mais je vais bien de 0 a 29 |
exact, faut pas poster de correction à 1h30 du mat
bon alors, montre l'appel c'est que ton tableau/bloc mémoire est à l'ouest avant l'appel.
(grilled par taz )
Marsh Posté le 11-05-2007 à 13:38:20
Code :
|
Code :
|
l'appel c'est :
Code :
|
et la fonction :
Code :
|
Et donc avec ca, je plante des que j'utilise une des structures dans le main().
Marsh Posté le 11-05-2007 à 13:39:20
nan ça ok, mais lem, c'est quoi au juste ?
edit : le fourbe, il a édité après mon message
Marsh Posté le 11-05-2007 à 14:43:17
Le programme fonctionne si j'initialise les valeurs des structures dans le main. Donc le probleme vient bien du passage en parametres.
Marsh Posté le 11-05-2007 à 15:10:53
bon donne ton programme complet ou apprend à te servir d'un debugguer. init(lem) est OK
Marsh Posté le 10-05-2007 à 23:12:34
Salut à tous,
Voila j'ai un soucis pour passer un tableau de structure en paramètres voici mon code :
Tout d'abord la fonction :
Et l'appel :
Avec ca mon programme plante, j'arrive pas à comprendre pourquoi...
En vous remerciant d'avance pour vos réponses,
Galaxed.