¿Cómo puedo devolver una matriz?
-
21-08-2019 - |
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[]
.
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.