elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  2 dudas sobre templates y char[]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: 2 dudas sobre templates y char[]  (Leído 2,624 veces)
Shout

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
2 dudas sobre templates y char[]
« 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!


En línea

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


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #1 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 ;)


En línea

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

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #2 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
En línea

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


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #3 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".


En línea

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

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #4 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
En línea

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


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #5 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.
En línea

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

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #6 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
En línea

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

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: 2 dudas sobre templates y char[]
« Respuesta #7 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
En línea

Shout

Desconectado Desconectado

Mensajes: 191


Acid


Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #8 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[]
En línea

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


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: 2 dudas sobre templates y char[]
« Respuesta #9 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.
En línea

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

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda doble puntero char a matriz de char
Programación C/C++
neo_from_cs_matrix 3 6,040 Último mensaje 5 Septiembre 2011, 03:53 am
por rir3760
Lectura de matríz de char como char** o DWORD*
Programación C/C++
david_BS 3 3,260 Último mensaje 20 Febrero 2012, 20:49 pm
por Eternal Idol
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
ahaugas 3 4,886 Último mensaje 13 Enero 2013, 14:09 pm
por ahaugas
Problema conversión Unsigned char a char
Programación C/C++
juliodiez 4 2,630 Último mensaje 19 Enero 2013, 04:34 am
por juliodiez
Duda sobre Dword a char[]
Programación C/C++
Drewermerc 2 1,840 Último mensaje 22 Junio 2016, 16:09 pm
por Drewermerc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines