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[].

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top