Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Shout en 21 Julio 2013, 18:12 pm



Título: 2 dudas sobre templates y char[]
Publicado por: Shout en 21 Julio 2013, 18:12 pm
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
  1. template<class T> void swapVariables(T *x, T *y){
  2. T temp = *y;
  3. *y = *x;
  4. *x = temp;
  5. }

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!


Título: Re: 2 dudas sobre templates y char[]
Publicado por: amchacon en 21 Julio 2013, 21:22 pm
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
¿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.

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


Título: Re: 2 dudas sobre templates y char[]
Publicado por: Shout en 21 Julio 2013, 21:37 pm
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 ;)
Pero si hago:
Código
  1. char something[3] = "hi", otherVar[3] = "no";
  2. swapVariables(&something, &otherVar);
me da error:
Citar
error 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
  1. template<class T> void swapVariables(T *x, T *y){
  2. T *temp = y;
  3. y = x;
  4. x = temp;
  5. }
Porque si lo hago así no me funciona


Título: Re: 2 dudas sobre templates y char[]
Publicado por: amchacon en 21 Julio 2013, 21:49 pm
Citar
"cambiar los valores de los punteros en vez de las cadenas"?

Me refiero algo tal que así:

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. void Swap(char** a,char** b)
  7. {
  8.    char* Buffer = *a;
  9.  
  10.    *a = *b;
  11.    *b = Buffer;
  12. }
  13.  
  14. int main()
  15. {
  16.  
  17.    char Cadena1[] = "Miauu";
  18.    char Cadena2[] = "Cosita";
  19.  
  20.    char* Puntero1 = Cadena1;
  21.    char* Puntero2 = Cadena2;
  22.  
  23.    Swap(&Puntero1,&Puntero2);
  24.    cout<<Puntero1<<endl<<Puntero2;
  25.  
  26.    cin.get();
  27.    return 0;
  28. }
  29.  

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




Título: Re: 2 dudas sobre templates y char[]
Publicado por: Shout en 21 Julio 2013, 21:55 pm
No, sigue sin funcionar  :huh:
Código
  1. template<class T> void swapVariables(T **x, T **y){
  2. T *temp = *y;
  3. *y = *x;
  4. *x = temp;
  5. }
  6. char hello[] = "hello", world[] = "world";
  7. swapVariables(&hello, &world);
Citar
error LNK2019: unresolved external symbol "void __cdecl swapVariables<char [6]>(char (*)[6],char (*)[6])" (??$swapVariables@$$BY05D@@YAXPAY05D0@Z) referenced in function _main


Título: Re: 2 dudas sobre templates y char[]
Publicado por: amchacon en 21 Julio 2013, 22:08 pm
No, sigue sin funcionar  :huh:
Código
  1. template<class T> void swapVariables(T **x, T **y){
  2. T *temp = *y;
  3. *y = *x;
  4. *x = temp;
  5. }
  6. char hello[] = "hello", world[] = "world";
  7. swapVariables(&hello, &world);
No, tienes que declarar unos punteros que apunten al array.

Fijate otra vez en mi ejemplo.


Título: Re: 2 dudas sobre templates y char[]
Publicado por: Shout en 21 Julio 2013, 22:21 pm
Sigue sin funcionar
Código
  1. char hello[] = "hello", world[] = "world";
  2. char *ptrHello = hello, *ptrWorld = world;
  3. swapVariables(&ptrHello, &ptrWorld);
Citar
error 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


Título: Re: 2 dudas sobre templates y char[]
Publicado por: lapras en 22 Julio 2013, 00:50 am
A mi esto me funciona:

Código
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. template<class T> void swapVariables(T *x, T *y){
  6. T temp = *y;
  7. *y = *x;
  8. *x = temp;
  9. }
  10.  
  11. int main(){
  12. const char *a="aaa";
  13. const char *b="bbb";
  14. cout<<a<<","<<b<<endl;
  15. swapVariables(&a,&b);
  16. cout<<a<<","<<b<<endl;
  17. }
  18.  

Output:
Código:
aaa,bbb
bbb,aaa


Título: Re: 2 dudas sobre templates y char[]
Publicado por: Shout en 22 Julio 2013, 18:33 pm
A mi esto me funciona:

Código
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. template<class T> void swapVariables(T *x, T *y){
  6. T temp = *y;
  7. *y = *x;
  8. *x = temp;
  9. }
  10.  
  11. int main(){
  12. const char *a="aaa";
  13. const char *b="bbb";
  14. cout<<a<<","<<b<<endl;
  15. swapVariables(&a,&b);
  16. cout<<a<<","<<b<<endl;
  17. }
  18.  

Output:
Código:
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[]


Título: Re: 2 dudas sobre templates y char[]
Publicado por: amchacon en 22 Julio 2013, 19:11 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
  1. const char * const a="aaa";

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
Solo hay que crearlos una vez, los puedes crear antes del algoritmo y no contarán para su eficiencia.