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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / clase para trabjar con listas simples en: 4 Enero 2011, 11:42 am
¡Buenas señores! He estado trabajando en un código que me permita trabajar con listas simples a modo de array dinámico y este es el resultado. La idea era que el comportamiento final de la clase fuera fácil e intuitivo, y espero haberlo conseguido  ;-)... Sin embargo la mayor limitación de mi trabajo radica en la forma de agregar los datos, pues sólo se puede introducir a la cabeza o a la cola de la lista, y no de forma aleatoria. A pesar de ello espero que les pueda servir de ayuda en códigos más complicados  :D

Código
  1. // Autor: Namida
  2. // Fecha: 04 enero 2011
  3.  
  4. /// DIRECTIVAS GENERALES DEL PREPROCESADOR
  5. #define _list_
  6.  
  7. #ifndef NULL
  8. #define NULL 0
  9. #endif
  10.  
  11. #define OFF false
  12. #define ON true
  13.  
  14.  
  15. ///CODIGO
  16. // Declaraciones Previas
  17. template<typename TYPE> class list;
  18. template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X);
  19. template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X);
  20. template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L);
  21.  
  22. // Declaracion
  23. template<typename TYPE> class list
  24. {
  25. private:
  26.  
  27. /*Definicion del nodo*/
  28. struct node{
  29. TYPE data;
  30. node* next_node;
  31. };
  32.  
  33. /*Informacion sobre la lista*/
  34. node* first_node;
  35. unsigned list_size;
  36. bool delete_mode;
  37.  
  38. public:
  39.  
  40. /*Constructor de clase*/
  41. list();
  42.  
  43. /*Operadores*/
  44. //Escritura
  45. friend list<TYPE> &operator < <TYPE>(list<TYPE> &L,TYPE X);
  46. friend list<TYPE> &operator > <TYPE>(list<TYPE> &L,TYPE X);
  47. //Lectura
  48. TYPE operator [] (unsigned N);
  49. //Borrado
  50. friend list<TYPE> &operator ~ <TYPE>(list<TYPE> &L);
  51.  
  52. /*Descriptor*/
  53. unsigned Size();
  54.  
  55. };
  56.  
  57. // Metodos
  58. /*Constructor*/
  59. template<typename TYPE> list<TYPE>::list(){
  60. first_node=NULL;
  61. list_size=0;
  62. delete_mode=OFF;
  63. };
  64. /*Operadores*/
  65. //Escritura
  66. template<typename TYPE> list<TYPE> &operator < (list<TYPE> &L,TYPE X){
  67. list<TYPE>::node* new_node=new list<TYPE>::node;
  68. new_node->data=X;
  69. new_node->next_node=NULL;
  70.  
  71. if (L.first_node!=NULL){
  72. list<TYPE>::node* aux_node=L.first_node;
  73. while (aux_node->next_node!=NULL){
  74. aux_node=aux_node->next_node;
  75. };
  76. aux_node->next_node=new_node;
  77. }else{
  78. L.first_node=new_node;
  79. };
  80. L.list_size+=1;
  81. return L;
  82. };
  83. template<typename TYPE> list<TYPE> &operator > (list<TYPE> &L,TYPE X){
  84. list<TYPE>::node* new_node=new list<TYPE>::node;
  85. new_node->data=X;
  86. new_node->next_node=L.first_node;
  87. L.first_node=new_node;
  88. L.list_size+=1;
  89. return L;
  90. };
  91. //Lectura
  92. template<typename TYPE> TYPE list<TYPE>::operator [] (unsigned N){
  93. try{
  94. if (N<list_size){
  95. switch (delete_mode){
  96. case OFF:
  97. {
  98. node* aux_node=first_node;
  99. for(unsigned i=0;i<N;i++){
  100. aux_node=aux_node->next_node;
  101. };
  102. return aux_node->data;
  103. };
  104. case ON:
  105. {
  106. if (N==0){
  107. node* aux_node=first_node;
  108. first_node=aux_node->next_node;
  109. delete aux_node;
  110.  
  111.  
  112. }else{
  113. node* aux_node=first_node;
  114. for(int i=0;i<int(N)-1;i++){
  115. aux_node=aux_node->next_node;
  116. };
  117. node* delete_node=aux_node->next_node;
  118. aux_node->next_node=aux_node->next_node->next_node;
  119. delete delete_node;
  120. };
  121. list_size-=1;
  122. delete_mode=OFF;
  123. throw 0;
  124. };
  125. };
  126. }else{
  127. throw 0;
  128. };
  129. }catch(int code){
  130. TYPE X=TYPE();
  131. return X;
  132. };
  133. };
  134. //Borrado
  135. template<typename TYPE> list<TYPE> &operator ~ (list<TYPE> &L){
  136. L.delete_mode=ON;
  137. return L;
  138. };
  139.  
  140. /*Descriptor*/
  141. template<typename TYPE> unsigned list<TYPE>::Size(){
  142. return list_size;
  143. };
  144.  
  145. #undef OFF
  146. #undef ON
  147.  
Un ejemplo de su uso
[/size]
Código
  1. #include"list.h"
  2.  
  3. int main(int argc,char* argv[]){
  4.  
  5. //Creacion de una lista tipo int
  6. list<int> L=list<int>();
  7.  
  8. /* Agregar datos
  9. A la cola*/
  10. L<0<1<2<3<4;
  11. /*A la cabeza*/
  12. L>5>6;
  13.  
  14. //Estado actual de la lista: 6-5-0-1-2-3-4
  15.  
  16. //Leer informacion de la lista
  17. L[1]; //Devuelve el numero 5
  18.  
  19. //Borrado
  20. (~L)[1]; //Elimina el numero 5 de la lista
  21.  
  22. L.Size(); //Devuelve el tamagno de la lista
  23.  
  24. return 0;
  25. };
  26.  
2  Programación / Programación C/C++ / Sobrecarga de operadores (con punteros a clase) en: 29 Diciembre 2010, 12:42 pm
Solucionado:

Declaraciones previas; clase y operadores
Código:
template<typename TYPE>class obj;
template<typename TYPE>obj<TYPE> &operator < (obj<TYPE> &OBJ, TYPE X);

Declaración de la clase:
Código:
template<typename TYPE>class obj{
     [...]
     friend obj<TYPE> &operator < <TYPE> (obj<TYPE> &OBJ, TYPE X);
};

Declaración del operador:
Código:
template<typename TYPE>obj<TYPE> &operator (obj<TYPE> &OBJ, TYPE X){
     [...]
     return OBJ;
};

Sin más, espero que les resulte de ayuda! :D!
3  Programación / Programación C/C++ / Sobre carga de operador [Visual Studio 2010] en: 15 Diciembre 2010, 21:33 pm
¡Hola a todos! Tengo el siguiente problema. No se como sobrecargar un operador dentro de una plantilla. Lo he intentando de la siguiente forma y me tira error.

Código:
template<TYPE>class A{
[...] /*Resto del código*/
friend std::ostream &operator << (std::ostream &os,A<TYPE> X);
};

template<TYPE> std::ostream &operator <<(std::ostream &os,A<TYPE> X){
[...] /*Resto del código*/
return os;
};

Gracias de antemano por su ayuda ;)
4  Programación / Programación C/C++ / C++, Asociar Icono al Ejecutable en: 27 Julio 2010, 13:23 pm
¡Hola! Llevo bastante tiempo buscando sobre el tema pero no he encontrado nada sobre C++ referente al tema. Mi pregunta es si es posible asociar un icono al ejecutable (El archivo .exe, por si no se me entiende xD) desde el propio código¿? y de ser así, si serian tan amable de explicarme...

Muchas Gracias de antemano :D
5  Programación / Programación C/C++ / [APORTE] Lector de Ficheros en: 17 Mayo 2010, 19:27 pm
¡Muy Buenas!

Aqui os dejo mi pequeño aporte. Se trata de un código que se encarga de cargar 'palabras' de un fichero en una lista simple para que después pueda ser leida e interpretada por otro código. Espero os resulte útil, y cualquier error, duda o crítica que me comuniqueis será bienvenida. De antemano ¡Gracias!  :D

Nombre Original del Archivo: fword.h
Código:
#ifndef _FWORD_
#define _FWORD_
#endif

#ifndef _FSTREAM_
#include <fstream>
#endif

#ifndef NULL
#define NULL 0
#endif

struct L_word{
int wordc;
char* wordv;
struct L_word* next;
};
void L_word_add(struct L_word *&p,char* argv,int argc){
struct L_word* new_node;
struct L_word* aux_node;
new_node=new struct L_word;
new_node->next=NULL;
new_node->wordc=argc;
new_node->wordv=argv;
if(p==NULL){
p=new_node;
}else{
aux_node=p;
while(aux_node->next!=NULL){
aux_node=aux_node->next;
}
aux_node->next=new_node;
}
};
struct L_word* L_fword(char* file_name){
struct L_word* pointer=NULL;
fstream file(file_name,ios::in|ios::binary);
if(file.good()){
bool w=false;
while(!w){
int argc;
char aux;

do{
argc=0;
do{
file.read(reinterpret_cast<char*>(&aux),sizeof(char));
w=file.eof();
argc++;
}while((aux!=' ')&&(aux!='\n')&&(aux!='\t')&&(aux!='\0')&&(aux!=char(13))&&(!w));
}while((argc<2)&&(!w));

char* argv;
argv=new char[argc];

if(w){
file.clear();
file.seekg(-argc+1,ios::cur);
file.read(reinterpret_cast<char*>(argv),sizeof(char)*(argc-2));
file.read(reinterpret_cast<char*>(&aux),sizeof(char));
argv[argc-2]=aux;
}else{
file.seekg(-argc,ios::cur);
file.read(reinterpret_cast<char*>(argv),sizeof(char)*(argc-1));
}
argv[argc-1]='\0';
L_word_add(pointer,argv,argc);
file.seekg(1,ios::cur);
}
}
file.close();
return pointer;
};

Microsoft Visual Studio 2008
6  Programación / Programación C/C++ / Visual Studio C++, error destructor de clase en: 1 Mayo 2010, 12:56 pm
¡Muy buenas!

Les comento. Desde hace tiempo llevo teniendo problemas al intentar liberar un array dinámico incluido en una clase, a traves de un destructor de clase.

A modo ilustrativo propongo el siguiente ejemplo:
Código:
class A{
private:
int** dato;
int Indice_1,Indice_2;
public:
void crear(int X,int Y){
//Se define el tamaño del array dato
Indice_1=X;
Indice_2=Y;
//Se reserva la memoria (Array Dinámico)
dato=new int *[X];
for(int i=0;i<X;i++){
dato[i]=new int [Y];
for(int j=0;j<Y;j++){
dato[i][j]=0;
}
}
}
~A(){
//Se libera la memoria
for(int i=0;i<Indice_1;i++){
delete[] dato[i];
}
delete[] dato;
}
};

El error que genera dice así:
Excepción no controlada en 0x102d31ea (msvcr90d.dll) en PRINCIPAL.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0xfeeefee2.

Lo curioso del caso es que empleando el prefijo del destructor de clase ~ se produce el error pero, renombrando el algoritmo como una función void, esto no ocurre y funciona correctamente (se libera la memoria correctamente y el programa actua sin anomalías).

Código:
void borrarA(){
        //Se libera la memoria
        for(int i=0;i<Indice_1;i++){
delete[] dato[i];
}
delete[] dato;
}

Empleando el primer código, pero situando un testigo en el destructor (tipo cout<<"DESTRUCTOR INVOCADO"<<endl), resulta que éste es invocado dos veces.  Una, cuando yo lo llamo, y otra, cuando el programa intenta finalizar. Siendo esta segunda vez la que causa el error.

Por lo que mis preguntas son:
¿Por qué el destructor es invocado una segunda vez cuando la hinstancia de la clase ya se ha 'destruido'?
¿Por qué funciona correctamente bien con void y no asi con ~ (propio del destructor de clase)?

Menciono que empleo como compliador el Visual Studio C++ 2008... creo que los tiros van por aqui jeje

¡¡Gracias por la ayuda!!
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines