Comment puis-je retourner un tableau?
-
21-08-2019 - |
Question
Est-il possible de retourner un tableau à partir d'une fonction? Plus précisément, j'ai créé cette fonction:
char bin[8];
for(int i = 7; i >= 0; i--)
{
int ascii='a';
if(2^i-ascii >= 0)
{
bin[i]='1';
ascii=2^i-ascii;
}
else
{
bin[i]='0';
}
}
et je besoin d'un moyen de revenir bin[]
.
La solution
Votre réseau est une variable locale allouées sur la pile. Vous devez utiliser pour allouer new []
sur le tas. Ensuite, vous pouvez simplement dire: return bin;
. Méfiez-vous que vous devrez libérer explicitement avec vous quand delete []
fait avec.
Autres conseils
Vous ne pouvez pas faire cela, mais vous pouvez:
- retourner un tableau alloué dynamiquement - mieux appartenant à un pointeur intelligent de sorte que l'appelant ne pas se soucier de désallocation mémoire pour elle -. Vous pouvez aussi retourner quelque chose comme un std :: vecteur de cette façon
- remplir un tableau / vecteur passé à vous comme un argument par pointeur (suggéré) ou une référence non const.
Vous demandez vraiment la mauvaise question. Si vous voulez faire du traitement de chaîne en C ++, utilisez le std :: string et / ou std :: classes de vecteurs, et non les tableaux de CHAR. Votre code devient alors:
vector <char> func() {
vector <char> bin(8);
for( int i = 7; i >= 0; i-- ) {
int ascii='a';
if ( 2 ^ i - ascii >= 0 ) {
bin[i] = '1';
ascii = 2^i - ascii;
}
else {
bin[i] ='0';
}
}
return bin;
}
Je pense que le mieux est d'utiliser un vecteur. Il peut fonctionner à bien des égards comme un tableau et a plusieurs aspects positifs (longueur stockés avec le type, la gestion automatique de la mémoire).
void Calculate( std::vector<char>& bin) {
for(int i = 7; i >= 0; i--)
{
int ascii='a';
if(2^i-ascii >= 0)
{
bin.push_back('1');
ascii=2^i-ascii;
}
else
{
bin.push_back('0');
}
}
}
Si vous voulez retourner une copie du tableau (peut être une solution pour les petits réseaux) et le tableau a une taille fixe, vous pouvez le joindre dans un struct;
struct ArrayWrapper {
char _bin[8];
};
ArrayWrapper func()
{
ArrayWrapper x;
// Do your stuff here using x._bin instead of plain bin
return x;
}
Ou tout simplement utiliser un std :: vecteur comme cela a déjà été suggéré.
Dans le même mis en œuvre à la réponse de @ ari, je veux dire qu'il ya déjà une solution d'amplification, résoudre votre problème boost::array
:
boost::array<char, 8> f() {
boost::array<char, 8> bin;
for(int i = 7; i >= 0; i--) {
int ascii = 'a';
if(2 ^ i-ascii >= 0) {
bin[i] = '1';
ascii = 2 ^ i-ascii;
} else {
bin[i] = '0';
}
}
}
...
boost::array<char, 8> a(f());
[Je ne sais pas ce que vous voulez faire avec cet algorithme bien, mais notez que je pense que vous voulez faire 1 << i
(décalage sage bits) au lieu de ce qui est 2 ^ i
pas exponentiation en C ++.]
array Boost est un tableau normal, juste enveloppé dans une struct, alors vous perdez pas de performance ce que-si-jamais. Il sera également disponible dans la prochaine version C de comme std::array
, et il est très facile de vous faire si vous n'avez pas besoin begin()
/ size()
/ data()
- le sucre, il ajoute (être un récipient) . Il suffit d'aller avec le plus élémentaire un:
template<typename T, size_t S>
struct array {
T t[S];
T& operator[](ptrdiff_t i) { return t[i]; }
T const& operator[](ptrdiff_t i) const { return t[i]; }
};
Mais comme d'habitude, utiliser les outils déjà écrits par d'autres personnes, dans ce cas <=>. Il a également obtenu l'avantage d'être un agrégat (c'est pourquoi il n'a pas d'utilisateur déclaré constructeur), il permet d'initialiser une liste fermée accolade:
boost::array<int, 4> a = {{ 1, 2, 3, 4 }};
vous devez passer bin de tableau comme un argument dans votre fonction. tableau passe toujours par l'adresse , par conséquent, vous ne avez pas besoin de retourner une valeur. il vous montrera automatiquement tous les changements dans votre programme principal
void FunctionAbc(char bin[], int size);
void FuncationAbc(bin, size)
{
for(int i = 7; i >= 0; i--)
{
int ascii='a';
if(2^i-ascii >= 0)
{
bin[i]='1';
ascii=2^i-ascii;
}
else
{
bin[i]='0';
}
}
}
Vous voulez passer par référence, comme suit:
void modifyBin(char (&bin)[8])
{
/* your function goes here and modifies bin */
}
int main()
{
char bin[8];
modifyBin(bin);
/* bin has been updated */
return 0;
}
Je pense que tout le monde a répondu à autre celui-ci ... utiliser un contenant au lieu d'un tableau. Voici la std::string
version:
std::string foo() {
int ascii = 'a';
std::string result("00000000");
for (int i=7; i>=0; --i) {
if (2^i-ascii >= 0) {
result[i] = '1';
ascii = 2^i-ascii;
}
}
return result;
}
Je ne suis pas vraiment sûr si est que vous voulez 2^i-ascii
voulez ou non. Ce sera analysé comme ce qui est un (2 ^ (i - ascii))
peu étrange.