Je connais bien les constructeurs et les initialiseurs C ++:
static int myCoeffs[3][6] =
{{ 1, 2, 3, 4, 5, 6},
{ 7, 8, 9, 10, 11, 12},
{ 13, 14, 15, 16, 17, 18}};
6 Réponses :
Vous ne pouvez pas. En C ++ 03, vous ne pouvez pas initialiser un tableau dans une liste d'initalisation CTOR. Cependant, vous pouvez le faire dans le corps du constructeur (techniquement, ce n'est plus une initialisation).
c'est-à-dire p> édition: code> Après la question, édition ici est un moyen de le faire p>
Eh bien, ça va, j'ai juste besoin d'une "belle" façon de le faire.
@Jason: la seule "belle" façon dont je peux penser, c'est que les initialisez-les devant la CTOR, comme a [0] = 1; A [1] = 23; code> etc ..
yuck. ARGH, je suppose que je vais simplement passer dans un tableau et utiliser une paire de boucles pour copier les éléments.
@Billy: pas en C ++ 03. Pas sûr de C ++ 0x
@Armen Certains cheveux dans votre code: TEMP code> doivent être statique code> et const code>; Les arguments à std :: copier code> doivent être des pointeurs sur int code>, par ex. & Temp [0] [0], & TEMP [0] [0] + 3 * 4 CODE> - Donc non +1
@Anatolyg: un tableau est implicitement converti en une rvalue de pointeur.
@Armen: Je pense que le traitement de la matrice 2D alors que 1D invoque un comportement indéfini. Je le lis quelque part mais incapable de rappeler la référence!
@Anatolyg, @nawaz: J'ai corrigé les cheveux. Quant à traiter un tableau 2D en tant que tableau 1D, il est parfaitement correct car la standard garantit que les éléments de tableau occupent une mémoire contiguë. La règle s'applique récursivement pour les tableaux de tableaux :)
Qu'est-ce que diable est int (& arg) code>?
@Jason. Cela signifie que l'ARG est une référence à un réseau de 3 réseaux de 4 INTS. C'est-à-dire que je passe le tableau par référence, pas par la valeur. Si je n'avais pas écrit et que le compilateur traiterait ARR comme un pointeur sur un tableau de 4 INTS. Pas que cela fait beaucoup de différence dans ce cas particulier :)
Ok, je suis familier avec des références, je ne les ai jamais vus entre parenthèses et / ou utilisés dans cet idiome.
@Jason: Je n'avais pas de parentisée et que le compilateur suppose qu'il s'agisse d'une gamme de références (qui est illégale) et non de référence au tableau
Si vous devez y aller de la sorte, je voudrais simplement aller pour une boucle en itérant les éléments du tableau bi-dimensionnel et les initialiser.
Ou si si vous allez à la vitesse, quelque chose comme un memset ferait le tour.
Salut Billy, désolé mais qu'est-ce que la moyenne signifie?
Poster original / Affiche originale
Vous ne pouvez pas (en général) transmettre la matrice multidimensionnelle arbitraire à une fonction C ou C ++, car on pourrait en Java (je mentionne Java parce que c'est là que votre historique de questions suggère votre expérience mensonges).
Il n'y a vraiment pas moyen de prendre en charge tout ce que comme des initialisateurs de tableau pour votre classe dans la norme en cours, bien que certains envisagent de modifier ceci dans la version suivante, C ++ 0x. P>
Si vous voulez que cela ait la flexibilité de, Dis, les matrices de Java (où les clients peuvent changer la taille de la matrice pointue, vous avez quelques options. Le premier et le meilleur serait d'utiliser std :: vecteur code>, qui implémente une dynamique Tableau pour vous, mais vous pourriez être limité à ce sujet par votre plate-forme intégrée. Vous pouvez également implémenter des éléments vous-même comme une matrice de dimension unique et accepter un bloc de mémoire dynamique. Exemple: P> class Foo {
int coeff[3][6];
public:
Foo(int _x[3][6]) : coeff(_x) {}
};
"devrait" -> "ne devrait pas"? (Aussi, quel est le problème avec le soulignement? Est-ce à cause de C ++ Nom-Mangling produisant des fonctions automatisées qui assument l'utilisation de l'espace de nom d'identifiant avec un soulignement de premier plan?)
L'initialiseur que vous mentionnez: Cela copie-t-il automatiquement la mémoire ou utilise-t-il le bloc de mémoire que vous passez?
@Billy: C'est absolument illégal! Je t'assure!. L'argument que vous passez est en fait un pointeur sur un tableau, pas un tableau en deux dimensions!
@Armen: Hmm .... Je ne vois pas pourquoi ça ne marche pas. Mais apparemment ça ne le fait pas. Gah! (Parfois, je me demande pourquoi les tableaux multidimensionnels sont même dans la langue!)
Argh. J'ai essayé ce qui précède FOO CODE> FOO CODE> Vous avez donné Verbatim, et j'ai eu l'erreur suivante: Erreur # 776: Seulement "()" est autorisé comme initialisateur pour membre du tableau "FOO :: COEFF" Code>
@Jason: lequel? Celui @armen a souligné comme mal ou celui que j'ai énuméré plus récemment?
l'original traversé un. Vous travaillez plus vite que moi: /
La mise à jour plus récente fonctionnerait, je ne veux tout simplement pas faire de la mathématique du pointeur au moment de l'exécution. Le temps constructeur est ok cependant. J'ai vraiment une matrice de taille fixe par instance. Honnête! Sinon, je devrais utiliser std :: vecteur code> comme vous le dites. (BTW semble-t-il y avoir un bogue dans vous, je ne peux pas uppoter pour une raison quelconque, à moins que vous n'ayez modifié le post. Vous suggérez que vous changiez «devrait» à la fin de «ne devrait pas»)
@Jason: Pourquoi ne veux-tu pas faire de moteurs en mathématiques au moment de l'exécution? C'est ce que les tableaux multidimensionnels compilent. Vous venez de mettre en œuvre la même chose là-bas. Edit: Vous devriez être capable de changer votre vote maintenant.
Vous pouvez le faire de cette façon:
#include <algorithm>
class Bar
{
int coeff[3][6];
public: // what do I do for a constructor????
Bar()
{
int myCoeffs[3][6] =
{
{ 1, 2, 3, 4, 5, 6},
{ 7, 8, 9, 10, 11, 12},
{ 13, 14, 15, 16, 17, 18}
};
std::swap(coeff, myCoeffs);
}
};
Pourquoi échanger? Quel est le problème avec coeff = mycoeffs code>? Mais cela ne résout pas le problème de l'OP de toute façon parce que vous ne passez pas les paramètres dans le constructeur.
... Mais j'ai besoin de passer des coefficients au constructeur. Sinon, chaque instance de l'objet obtiendra les mêmes coefficients.
@Billy j'ai (peut-être trop tôt) sémantique de déménagement totalement assimilé :)
en C ++ 03, puisque vous ne pouvez pas initialiser un tableau dans la liste d'initialisation, vous pouvez écrire un modèle de fonction générique pour remplir un tableau avec un tableau donné, comme illustré dans l'exemple suivant,
1 2 3 4 5
1. Je voudrais mettre en œuvre array_fill code> en termes de std :: copier code> car dans de nombreux stls qui se décomposer à un appel à memcpy code> qui peut être plus vite sur le matériel cible. 2. Cela ne fonctionne pas pour le cas d'utilisation de l'OP, car il traite de matrices multidimensionnelles.
@Billy: Je pensais la même chose. Je suis trop paresseux pour la mettre en œuvre moi-même, comme je regarde la télévision: d. Et c'est pourquoi j'ai mentionné std :: copier code> dans la dernière ligne. array_fill code> peut être écrit élégamment pour gérer une matrice multidimensionnelle, STD :: Copie pourrait aider beaucoup!
Je ne sais pas si cela semble trop évident, mais pourquoi ne pas simplement copier les valeurs? espère que cela aide. Cordialement. P> P>
C'est faux pour la même raison que ma réponse était initialement fausse.
Cela peut ne pas être intelligent ou le moyen le plus efficace de le faire, mais cela fonctionne avec mon compilateur.
OK, donc je devais changer int coeff [x] [y] code> à int ** pcoeff code>.
@Jason: C'est complètement faux. @ Redent84's Code fonctionne, mais je n'arrive pas à comprendre pourquoi (parce que cela semble être exactement le même que ce que j'ai affiché ci-dessous, mais la mienne n'a pas compilé ..). int [x] [y] code> n'est pas un éventail de pointeurs sur des tableaux b>. C'est un bloc de mémoire B>. int ** code> est un type complètement différent.
Comme le suggéra Jason, j'ai changé la signature de la méthode afin qu'elle puisse prendre une éventail d'entiers alloués dynamiquement. De cette façon, les limites des arrayes ne sont pas cochées et vous pourriez obtenir des défauts de violation de la segmentation.
@Billy: vraiment? Maintenant je suis très confus: /
@Billy: A int [] [] est un bloc de mémoire contigu et un int ** est un pointeur à un pointeur à un INT. Ils peuvent représenter la même chose, une gamme bidimensionnelle d'entiers. La différence est que INT [] [] est la mémoire contiguë et INT ** n'est pas comme il est alloué de manière dynamique (avec MALLOC (Tailleof (int) * x) ou neuf int [x]).
@Jason: une matrice multidimensionnelle est un bloc de mémoire unique qui se désintègre dans un pointeur à son premier élément lorsqu'il est passé à une fonction (juste comme des tableaux dimensionnels). Les matrices multidimensionnelles ne sont que du sucre syntaxique autour du multiplier et d'ajouter que j'ai montré dans ma réponse.
@ redent84: représentant i> Un tableau multidimensionnel n'est pas le même que étant i> un tableau multidimensionnel. La norme est très explicite sur ce que cela signifie par matrice multidimensionnelle. Changer votre code ci-dessus sur INT ** fait le problème.
@Billy: OK, vous avez raison dans une certaine mesure. Je laisserai ma réponse initiale, le PO peut le modifier pour répondre à ses besoins.
Quelle version de C ++? Si vous utilisez la version actuelle (C ++ 03) de la norme, il n'y a aucun moyen d'imiter un initialiseur.
"Old-School" C ++ - Ceci est pour un système intégré, je ne sais pas quelle version de la norme, et même 2003 pourrait être trop récente.
2003 est la première version normalisée.