2 dudas sobre templates y char[]

Iniciado por Shout, 21 Julio 2013, 18:12 PM

0 Miembros y 1 Visitante están viendo este tema.

Shout

Hola!!

Estoy repasando algunas cosas de C++ que aprendí hace tiempo, y al parecer se me ha olvidado un poco, porque no encuentro la manera de tener estas 2 cosas juntas.

Esta es mi función:
Código (cpp) [Seleccionar]
template<class T> void swapVariables(T *x, T *y){
T temp = *y;
*y = *x;
*x = temp;
}


Al usarla (swapVariables(char*, char*) / swapVariables(int*, int*)), me funciona bien, pero lo que quiero es:

  • agregar delete para eliminar la variable temporal (estoy haciendo loops de 1.000.000 iteraciones y cada optimización cuenta). Al no usar new creo que no se puede usar delete, pero si sabéis alguna alternativa, me gustaría verla
  • poder usar la función pasándole char[] en vez de char* sin tener que copiar y pegarla, cambiar el nombre y añadir los corchetes

Saludos!
I'll bring you death and pestilence, I'll bring you down on my own

amchacon

Cita de: Shout en 21 Julio 2013, 18:12 PMagregar delete para eliminar la variable temporal (estoy haciendo loops de 1.000.000 iteraciones y cada optimización cuenta). Al no usar new creo que no se puede usar delete, pero si sabéis alguna alternativa, me gustaría verla
¿Variable temporal? Yo no veo que hayas creado ninguna variable en memoria dinámica...

De todas formas, puedes usar delete en cualquier puntero. Ahora, si ese puntero no apunta a memoria reservada dinámicamente dará un error de ejecución.

Cita de: Shout en 21 Julio 2013, 18:12 PMpoder usar la función pasándole char[] en vez de char* sin tener que copiar y pegarla, cambiar el nombre y añadir los corchetes
A la hora de pasar argumentos a una función, char[] y char* son equivalentes (no son más que comodidades sintácticas).

Otra cosa es, que cambies los valores de los punteros en vez de las cadenas ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Shout

Cita de: amchacon en 21 Julio 2013, 21:22 PMA la hora de pasar argumentos a una función, char[] y char* son equivalentes (no son más que comodidades sintácticas).

Otra cosa es, que cambies los valores de los punteros en vez de las cadenas ;)
Pero si hago:
Código (cpp) [Seleccionar]
char something[3] = "hi", otherVar[3] = "no";
swapVariables(&something, &otherVar);

me da error:
Citarerror C2075: 'temp' : array initialization needs curly braces
error C2106: '=' : left operand must be l-value
error C2106: '=' : left operand must be l-value

Y algo más, ¿a qué te refieres con "cambiar los valores de los punteros en vez de las cadenas"?

¿Te refieres a esto?
Código (cpp) [Seleccionar]
template<class T> void swapVariables(T *x, T *y){
T *temp = y;
y = x;
x = temp;
}

Porque si lo hago así no me funciona
I'll bring you death and pestilence, I'll bring you down on my own

amchacon

Citar"cambiar los valores de los punteros en vez de las cadenas"?

Me refiero algo tal que así:

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>

using namespace std;

void Swap(char** a,char** b)
{
    char* Buffer = *a;

    *a = *b;
    *b = Buffer;
}

int main()
{

    char Cadena1[] = "Miauu";
    char Cadena2[] = "Cosita";

    char* Puntero1 = Cadena1;
    char* Puntero2 = Cadena2;

    Swap(&Puntero1,&Puntero2);
    cout<<Puntero1<<endl<<Puntero2;

    cin.get();
    return 0;
}


Yo creo que más eficiente que eso no puede haber... En todo caso se puede hacer una funcion "inline".


Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Shout

No, sigue sin funcionar  :huh:
Código (cpp) [Seleccionar]
template<class T> void swapVariables(T **x, T **y){
T *temp = *y;
*y = *x;
*x = temp;
}
char hello[] = "hello", world[] = "world";
swapVariables(&hello, &world);

Citarerror LNK2019: unresolved external symbol "void __cdecl swapVariables<char [6]>(char (*)[6],char (*)[6])" (??$swapVariables@$$BY05D@@YAXPAY05D0@Z) referenced in function _main
I'll bring you death and pestilence, I'll bring you down on my own

amchacon

Cita de: Shout en 21 Julio 2013, 21:55 PM
No, sigue sin funcionar  :huh:
Código (cpp) [Seleccionar]
template<class T> void swapVariables(T **x, T **y){
T *temp = *y;
*y = *x;
*x = temp;
}
char hello[] = "hello", world[] = "world";
swapVariables(&hello, &world);

No, tienes que declarar unos punteros que apunten al array.

Fijate otra vez en mi ejemplo.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Shout

Sigue sin funcionar
Código (cpp) [Seleccionar]
char hello[] = "hello", world[] = "world";
char *ptrHello = hello, *ptrWorld = world;
swapVariables(&ptrHello, &ptrWorld);

Citarerror LNK2019: unresolved external symbol "void __cdecl swapVariables<char *>(char * *,char * *)" (??$swapVariables@PAD@@YAXPAPAD0@Z) referenced in function _main

Aunque igualmente no lo usaré, ya que necesito crear 2 punteros y el objetivo es hacer un swap con la mínima distracción posible
I'll bring you death and pestilence, I'll bring you down on my own

lapras

A mi esto me funciona:

Código (cpp) [Seleccionar]
#include<iostream>

using namespace std;

template<class T> void swapVariables(T *x, T *y){
T temp = *y;
*y = *x;
*x = temp;
}

int main(){
const char *a="aaa";
const char *b="bbb";
cout<<a<<","<<b<<endl;
swapVariables(&a,&b);
cout<<a<<","<<b<<endl;
}


Output:
aaa,bbb
bbb,aaa

Shout

Cita de: lapras en 22 Julio 2013, 00:50 AM
A mi esto me funciona:

Código (cpp) [Seleccionar]
#include<iostream>

using namespace std;

template<class T> void swapVariables(T *x, T *y){
T temp = *y;
*y = *x;
*x = temp;
}

int main(){
const char *a="aaa";
const char *b="bbb";
cout<<a<<","<<b<<endl;
swapVariables(&a,&b);
cout<<a<<","<<b<<endl;
}


Output:
aaa,bbb
bbb,aaa

const char:huh:
¿Las constantes se pueden modificar así de fácil? Sabía que se podía con punteros, ¿pero tan fácil?
Por cierto, a mi también me funciona así, lo que no me funciona es al usar char lol[]
I'll bring you death and pestilence, I'll bring you down on my own

amchacon

Cita de: Shout en 22 Julio 2013, 18:33 PM
const char:huh:
¿Las constantes se pueden modificar así de fácil? Sabía que se podía con punteros, ¿pero tan fácil?
Por cierto, a mi también me funciona así, lo que no me funciona es al usar char lol[]
Lo que es constante es el valor, el puntero es variable.

Para que fuese constante el puntero también habría que poner:
Código (cpp) [Seleccionar]
const char * const a="aaa";

Cita de: Shout en 22 Julio 2013, 18:33 PMAunque igualmente no lo usaré, ya que necesito crear 2 punteros y el objetivo es hacer un swap con la mínima distracción posible
Solo hay que crearlos una vez, los puedes crear antes del algoritmo y no contarán para su eficiencia.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar