Pregunta

¿Hay alguna forma para devolver una matriz de una función? Más concretamente, he creado esta función:

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';
    }
}

y necesito una manera de volver bin[].

¿Fue útil?

Solución

Su matriz es una variable local asignado en la pila. Debe utilizar new [] asignarlo en el montón. A continuación, sólo puede decir: return bin;. Tenga en cuenta que tendrá que liberar explícitamente con delete [] cuando haya terminado con él.

Otros consejos

No se puede hacer eso, pero es posible:

  • devolver un dynamicaly asignado serie - mejor propiedad de un puntero inteligente para que la persona que llama no tiene que preocuparse por cancelar la asignación de memoria para ella -. También podría volver algo así como un std :: vector de esta manera
  • rellenar una matriz / vector pasado en usted como un argumento de puntero (sugerido) o una referencia no const.

Usted está realmente haciendo la pregunta equivocada. Si usted quiere hacer el procesamiento de cadenas en C ++, utilice el std :: string y / o clases std :: vector, no matrices de carbón. Su código se convierte entonces en:

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;
}

Creo que lo mejor es usar un vector. Puede funcionar de muchas maneras como una matriz y tiene varias upsides (longitud almacenados con el tipo, la gestión de memoria automática).

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 desea devolver una copia de la matriz (podría tener sentido para las pequeñas matrices) y la matriz tiene tamaño fijo, puede encerrarlo en una estructura;

struct ArrayWrapper {
   char _bin[8];
};

ArrayWrapper func()
{
    ArrayWrapper x;

    // Do your stuff here using x._bin instead of plain bin

    return x;
}

O simplemente utilizar un std :: vector como se ha sugerido ya.

Al igual implementado a la respuesta de @ ari, quiero decir que ya hay una solución impulso, boost::array resolver su problema:

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());

[No estoy seguro de lo que quiere hacer con ese algoritmo sin embargo, sino en cuenta que yo creo que quiere hacer 1 << i (desplazamiento de bit a bit) en lugar de 2 ^ i que es no exponenciación en C ++.]

array Boost es una matriz normal, simplemente envuelto en una estructura, por lo que no pierden el rendimiento lo que tan nunca. También estará disponible en la versión del próximo C ++ como std::array, y es muy fácil de hacer usted mismo si usted no necesita el begin() / size() / data() - el azúcar se agrega (a ser un contenedor) . Sólo tiene que ir con el más básico uno:

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]; }
};

Pero, como de costumbre, utilizar las herramientas que ya están escritos por otras personas, en este caso <=>. También tiene la ventaja de ser un agregado (por eso se ha declarado ningún usuario constructor), por lo que permite inicializar con una lista corsé cerrado:

boost::array<int, 4> a = {{ 1, 2, 3, 4 }};

lo necesario para pasar bin matriz como un argumento en su función. array pasan siempre por la dirección , por lo tanto, ya no tienes que devolver ningún valor. se le mostrará automáticamente todos los cambios en el programa 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';
    }
}

}

Usted querrá pasar por referencia, de la siguiente manera:

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;
}

Creo que todo el mundo respondió éste ... utilizar un contenedor en lugar de una matriz. Aquí está la versión std::string:

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;
}

No estoy muy seguro de si 2^i-ascii es lo que desea o no. Esto se analiza como (2 ^ (i - ascii)) que es un poco extraño.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top