• Domingo 11 de Mayo de 2025, 09:16

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - krnl64

Páginas: [1] 2 3
1
C/C++ / INVALID_HANDLE redireccionando cin,cout,cerr
« en: Jueves 9 de Septiembre de 2010, 21:02 »
Hola,  estoy escribiendo una pequeña clase para abrir una consola en programas con interfaz gráfica y usarla para emitir información de depuración.
Por comodidad, intento redirigir los flujos de la consola para poder usar cin, cout y cerr en vez de apis para leer y escribir en ella
El código que les presento yo diria que es correcto, pero no se comporta bien en ejecución.

Si hago un cin, ya no escribe nada en pantalla al usar cout. Sólo si uso cerr y escribe todo lo que haya en el buffer.
En vista de estos fallos, uso GetLastError después de hacer cin, y me dice INVALID_HANDLE_VALUE.
No entiendo por qué se cierra el handle.

Edit:
Pruebas hasta ahora sin resultado:
1º Obtener el handles de entrada, salida y error con GetStdHandle en el constructor. Intentar restaurarlos con SetConsoleActiveScreenBuffer. cout sigue sin escribir en consola.
2º Cerrar el handle de salida con CloseHandle, volver a abrirlos con GetStdHandle y usar cout. Aqui GetLastError dice que no hay error, pero no se escribe nada en consola
3º Abrir los flujos de consola CONIN$,CONOUT$,CONERR$ con CreateFile. Restaurarlos con SetConsoleActiveScreenBuffer y usar cout. GetLastError dice INVALID_HANDLE y no se escribe nada en consola

Pueden decirme qué es lo que hago mal ?

PD: uso W Xp SP3 y VC++ 2008

Gracias

console.h
Código: C++
  1.  
  2. // console.h
  3. #ifndef __CONSOLE_H__
  4. #define __CONSOLE_H__
  5.  
  6. #include <iostream>
  7. #include <fstream>
  8.  
  9. using std::cout;
  10. using std::cin;
  11. using std::cerr;
  12.  
  13. using std::streambuf;
  14. using std::ofstream;
  15. using std::ifstream;
  16.  
  17.  
  18. class console
  19. {
  20.  
  21.     private:
  22.    
  23.         ofstream n_cout;
  24.         ofstream n_cerr; // new streams
  25.         ifstream n_cin;
  26.  
  27.         streambuf* old_cout;
  28.         streambuf* old_cerr; // old streams
  29.         streambuf* old_cin;
  30.  
  31.     public:
  32.    
  33.         console();
  34.         ~console();
  35.  
  36.         void hide();
  37.         void show(); // not implemented yet
  38. };
  39. #endif
  40.  
  41.  

console.cpp
Código: C++
  1.  
  2. #include "console2.h"
  3. #include <windows.h>
  4.  
  5. console::console()
  6. {
  7.    
  8.     // create a console window
  9.     AllocConsole();
  10.  
  11.     // redirect cout to console window
  12.     this->old_cout = cout.rdbuf(); 
  13.     this->n_cout.open("CONOUT$");   
  14.     cout.rdbuf( this->n_cout.rdbuf() );
  15.    
  16.     // redirect cerr
  17.     this->old_cerr = cerr.rdbuf();
  18.     this->n_cerr.open("CONOUT$");
  19.     cerr.rdbuf( this->n_cerr.rdbuf() );
  20.  
  21.     // redirect cin
  22.     this->old_cin = cin.rdbuf();
  23.     this->n_cin.open("CONIN$");
  24.     cin.rdbuf( this->n_cin.rdbuf() );
  25.    
  26. }
  27.  
  28. console::~console()
  29. {
  30.     // restore streams
  31.     cin.rdbuf( this->n_cin.rdbuf() );
  32.     cerr.rdbuf( this->n_cerr.rdbuf() );
  33.     cout.rdbuf( this->n_cout.rdbuf() );
  34.    
  35.   // free console resources
  36.   FreeConsole();
  37. }
  38.  
  39.  

// main.cpp
Código: C++
  1.  
  2.  
  3. #include <windows.h>
  4.  
  5. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  6. {
  7.  
  8. // all WNDCLASSEX, RegisterClassEx,CreateWindow, etc stuff
  9.  
  10.  console c;
  11.  int number = 0;
  12.  
  13. cout << "n cout works";
  14. cerr << "n cerr works";
  15. cin >> number; // cin works
  16.  
  17. DWORD error = GetLastError(); // INVALID_HANDLE_VALUE ¿ por qué ?
  18.  
  19. cout << "n The number is: " << number;  // Esto ya no funciona
  20.  
  21. cerr << number; // ahora escribe todo lo que haya en el buffer
  22. }
  23.  
  24.  

2
C/C++ / Re: Sobrecargar operador = con punteros
« en: Viernes 23 de Julio de 2010, 01:41 »
Porque me va a hacer falta clonar objetos que los usan y he de proveer a mis clases de ese mecanismo.

Gracias

3
C/C++ / Sobrecargar operador = con punteros
« en: Jueves 22 de Julio de 2010, 20:44 »
Hola, he escrito una clase lista cuya interfaz declaro a continuación
Código: C++
  1.  
  2. class linkedlist
  3.     {
  4.    
  5.         public:
  6.        
  7.             linkedlist(void); // default constructor
  8.            
  9.             linkedlist (const linkedlist& tocopy); // copy constructor
  10.                
  11.             ~linkedlist(); // destructor
  12.            
  13.              bool insert ( const int value ); // insert element            
  14.            
  15.              bool remove ( void ); // remove first element                     
  16.            
  17.              bool is_empty ( void ) const; // returns if the list is empty
  18.            
  19.              int size  ( void ) const; // return list size
  20.            
  21.              linkedlist& operator = (const linkedlist& list); // overload = operator       
  22.              
  23.              int& operator [] ( const int index ) const; // overload subscript operator
  24.    
  25.         private:
  26.        
  27.             struct node
  28.             {
  29.                 int value;  // node struct
  30.                 node* next;
  31.             }; 
  32.            
  33.             int elements;     // amount of elements
  34.             node* firstnode; // first node
  35.                                
  36.     };
  37.  
  38.  

Lo que quiero conseguir es que cuando escriba esto

Código: C++
  1.  
  2.  linkedlist*  lista1 = NULL;
  3.  linkedlist* lista2 = NULL;
  4.  
  5. // creo lista1 con new
  6.  
  7. lista2 = lista1;
  8.  
  9.  
  10.  

no se copie tal cual el objeto, sino que se cree memoria para el y se copien los valores.
He probado a sobrecargar el operador = de esta manera
Código: C++
  1.  
  2. linkedlist& operator = (const linkedlist* &list);
  3.  
  4.  

pero no consigo que cuando se ejecuta la linea 7 entre en la funcion.

Alguien sabe como hacer esto ?

Gracias

4
C/C++ / Re: Duda Destructores C++
« en: Miércoles 21 de Julio de 2010, 19:43 »
r0d,  ivancp dio en clavo, gracias de todas maneras.
No obstante, me referia a que la linea 62 de codigo es innecesaria porque se supone el sistema la eliminara sola

Gracias por todo chicos

interface:
Código: C++
  1.  
  2. class linkedlist
  3.     {
  4.    
  5.         public:
  6.        
  7.             linkedlist(void); // default constructor
  8.                
  9.             ~linkedlist(); // destructor
  10.            
  11.              const bool insert ( const int value ); // insert element                                          
  12.    
  13.         private:
  14.        
  15.             struct node
  16.             {
  17.                 int value;  // node struct
  18.                 node* next;
  19.             }; 
  20.            
  21.             int elements;     // amount of elements
  22.             node* firstnode; // first node
  23.                                
  24.     };
  25.  
  26.  

codigo:
Código: C++
  1.  
  2. // insert element
  3. const bool linkedlist::insert (const int value)
  4. {
  5.  
  6.     node* newnode = NULL;
  7.     node* lastnode = NULL;
  8.    
  9.    
  10.            
  11.         newnode = new node; // alloc new node
  12.        
  13.         if ( !newnode ) return false; // if new fails
  14.        
  15.         newnode->value = value; // asign value
  16.         newnode->next = NULL;   // init next element
  17.    
  18.         if ( this->elements == 0) // there is no nodes
  19.                
  20.             this->firstnode = newnode; // assign first node
  21.        
  22.         else
  23.         {
  24.        
  25.             lastnode = this->firstnode;
  26.                                                 // goto last node
  27.             while (lastnode->next)
  28.                 lastnode = lastnode->next; 
  29.                
  30.             lastnode->next = newnode;   // set new node as next node
  31.         }
  32.        
  33.         this->elements++; // update node count
  34.        
  35. return true;
  36. }
  37.  
  38. // destructor
  39. linkedlist::~linkedlist()
  40. {
  41.  
  42.     node* currentnode = NULL;
  43.     node* nextnode = NULL;
  44.    
  45.  
  46.         if (this->elements > 0) // list has nodes
  47.         {
  48.             currentnode = this->firstnode;  // get first node
  49.            
  50.             while ( currentnode ) // while has nodes
  51.             {
  52.            
  53.                 nextnode = currentnode->next; // get next node
  54.                
  55.                 delete currentnode;
  56.                 currentnode = NULL; // delete node
  57.                
  58.                 currentnode = nextnode; // update current node
  59.             }
  60.            
  61.             this->firstnode = NULL;
  62.             //this->elements = NULL; ----> innecesario
  63.         }
  64.        
  65. return;
  66. }
  67.  
  68.  

5
C/C++ / Duda Destructores C++
« en: Miércoles 21 de Julio de 2010, 17:55 »
Hola, tengo un par de dudas acerca del comportamiento de los destructores.

Mirando http://www.parashift.com/c++-faq-lite/dtors.html  punto 11.11

dice que cuando cuando se destruye un objeto se llama automáticamente a los destructores de los miembros de los que esta compuesto.
Se refiere a los miembros que no son punteros  ?
Que ocurre si en el destructor pongo las variables miembro a su valor por defecto entonces ? ( por ejemplo pongo un entero a 0 o a NULL)

Editado : ya vi el fallo del code de antes

 A ver si me pueden esclarecer el tema un poco Gracias

6
C/C++ / Re: Error reservar memoria dentro funcion
« en: Jueves 11 de Febrero de 2010, 00:28 »
Cita de: "Eternal Idol"
El problema realmente esta al intentar acceder en alsr a los elementos como si fuera un array de punteros a int cuando no lo es.
Despues de reservar memoria para vector hacemos:
Código: Text
  1. nvector = (int*)*vector;
  2.  

Si, te entendi al ver
Código: C
  1.  
  2.  (*(*(vector+i)))=*(temporal+pos);
  3.  
  4.  
ya que en el contexto de la función es un doble puntero aunque realmente en su contexto original no lo era.
Me costo deducir el cast y luego lo he visto aqui escrito.

Hasta ahora solo habia reservado memoria para una variable externa a una función si usar esa memoria dentro de la función que la reserva.
Me acuesto habiendo aprendido algo más  :D

Gracias de nuevo.
Salu2

7
C/C++ / Re: Error reservar memoria dentro funcion
« en: Miércoles 10 de Febrero de 2010, 23:48 »
Pude leer la explicación antes de que editaras.
Gracias Eternal.
Salu2

8
C/C++ / Re: Error reservar memoria dentro funcion
« en: Miércoles 10 de Febrero de 2010, 23:12 »
Cierto. No mire los warnings.

He sustituido el prototipo y el malloc por esto
Código: C
  1.  
  2. void alsr(int *vector, int inicio, int fin, int cuantos);
  3.  
  4.  

Linea 29 en aleatorio.c
Código: C
  1.  
  2. vector=(int*)malloc(cuantos*sizeof(int));
  3.  
  4.  

Entiendo que se queja de la indirección, pero ahora sigue fallando y no sé por qué ni cómo arreglarlo.
Ya no es un doble puntero.

Gracias

9
C/C++ / Error reservar memoria dentro funcion
« en: Miércoles 10 de Febrero de 2010, 22:17 »
Hola amigos.
Estoy intentando reservar memoria para una variable externa a la función que la reserva.
Dentro de la función la reserva y la usa,pero al volver el codigo a donde hizo la llamada
falla.
Concretamente falla en la linea 17 de main.c
Por más que miro no sé donde está el fallo.
Pueden hecharme una mano ?
Gracias.

aleatorio.h
Código: C
  1.  
  2. void alsr(int **vector, int inicio, int fin, int cuantos);
  3.  
  4.  

aleatorio.c
Código: C
  1.  
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include "aleatorio.h"
  5.  
  6. void alsr(int **vector, int inicio, int fin, int cuantos)
  7. {
  8.     int *temporal=NULL;
  9.     int i;
  10.     int j;
  11.     int pos;
  12.     int lon;
  13.  
  14.  
  15.     lon=fin-inicio; 
  16.  
  17.     /*Pedir memoria para temporal.*/
  18.     temporal=(int*)malloc(lon*sizeof(int));
  19.  
  20.     if(temporal==NULL)
  21.         return;
  22.  
  23.     for(i=0;i<lon;i++)
  24.     {
  25.         *(temporal+i)=inicio+i; 
  26.     }
  27.  
  28.     /*Pedir memoria array externo*/
  29.     *vector=(int*)malloc(cuantos*sizeof(int));
  30.     if(vector==NULL)
  31.         return;
  32.  
  33.     /*Llenamos el vector de aleatorios*/
  34.     for(i=0;i<cuantos;i++)
  35.     {
  36.    
  37.         /* Si tengo mas de un elemento */
  38.         if(cuantos > 1)
  39.         {
  40.             pos=rand()%lon;
  41.             /*Copio el elemento de esa posicion al original*/
  42.             *(vector+i)=*(temporal+pos);
  43.        
  44.             /*Realmente atrasamos el elemento del array*/
  45.             for(j=pos;j<lon-1;j++)
  46.                 *(temporal+j)=*(temporal+j+1);
  47.  
  48.             /*Vamos eliminando el ultimo elemento*/
  49.             lon--;     
  50.             temporal=(int*)realloc(temporal,lon*sizeof(int));
  51.         }
  52.         else
  53.         {      
  54.             *(vector+i)=*(temporal);
  55.         }
  56.  
  57.     }
  58.  
  59.  
  60.     free(temporal);
  61.     temporal=0;
  62.  
  63.     return;
  64. }
  65.  
  66.  

main.c
Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "aleatorio.h"
  5.  
  6. #define cantidad 2
  7.  
  8. int main(int argc,char *argv[])
  9. {
  10.     int *tmp=0;
  11.     int i;
  12.  
  13.     alsr(&tmp,1,5,cantidad);
  14.  
  15.     for(i=0;i<cantidad;i++)
  16.     {
  17.         printf(" %d ",*(tmp+i));
  18.     }
  19. }
  20.  
  21.  
  22.  

10
HTML / Problema con codigo en IE8
« en: Lunes 25 de Enero de 2010, 14:29 »
Hola a todos, veran he desarrollado un calendario en html / js (no esta acabado) y en firefox funciona.
Pero acabo de abrirlo en IE8 y me dice que tengo un error.
En concreto dice "Error desconocido en tiempo de ejecucion en Linea 28 caracter 3 en el archivo de js".
Por mas que reviso mi fuente no veo el error.
Les pongo el codigo a ver si pueden decirme donde esta el error.
Gracias

Web
Código: Text
  1.  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http]
  3.  
  4. Js (donde peta)
  5. [code=js] 
  6. function dmonth(iMonth, iYear)
  7. {
  8.     return 32 - new Date(iYear, iMonth, 32).getDate();
  9. }
  10.  
  11. function ponceldas()
  12. {
  13.     var celdas='';
  14.     var i;
  15.     var j;
  16.    
  17.         for(i=0;i<6;i++)
  18.         {
  19.             celdas+='<tr>';
  20.            
  21.             for(j=0;j<7;j++)
  22.                 celdas+='<td class="day"></td>';
  23.                
  24.             celdas+='</tr>';
  25.         }
  26.         document.getElementById('calendario').tBodies[0].innerHTML+=celdas;
  27.         pond(0,0);
  28. }
  29.  
  30. function pond(y,m)
  31. {
  32.  
  33. var celdas;
  34. var i;
  35. var maxdias;
  36. var dia=1;
  37. var day;
  38. var hoy;
  39.    
  40.     if (m==0 && y==0)
  41.     {
  42.         hoy=new Date();
  43.         day=hoy.getDate();
  44.         hoy.setDate(1);
  45.     }
  46.     else
  47.         hoy=new Date(parseInt(y),parseInt(m),1);
  48.        
  49.     // dias del mes actual
  50.     maxdias=dmonth(hoy.getMonth(),hoy.getFullYear());   
  51.     celdas=document.getElementById('calendario').tBodies[0].getElementsByTagName('td');
  52.    
  53.     // mes y año
  54.     document.getElementById('mes').selectedIndex=hoy.getMonth();
  55.     document.getElementById('anio').innerHTML='  '+hoy.getFullYear()+'  ';
  56.    
  57.     //vacio todas las celdas
  58.         for(i=0;i<celdas.length;i++)   
  59.             celdas[i].innerHTML='';
  60.  
  61.     // calculo el desplazamiento del dia de la semana en base al que js me da
  62.     for(i=(hoy.getDay()+6)%7;i < celdas.length;i++)
  63.     {
  64.         if (dia<=maxdias)
  65.         {
  66.             celdas[i].innerHTML=dia;
  67.             dia+=1;
  68.         }
  69.     }
  70.  
  71. }
  72. function pm()
  73. {
  74. pond(document.getElementById('anio').textContent,document.getElementById('mes').value);
  75. }
  76.  

11
VB .NET / Re: Error con DirectCast y ArrayList
« en: Miércoles 16 de Diciembre de 2009, 19:13 »
Encontré el fallo.

La conversión no era válida porque:
Código: vb.net
  1.  
  2. DirectCast(micontrol.Text,Type.GetType(micontrol.Tag2.ToString()))
  3.  
  4.  
devuelve Type

y esto
Código: vb.net
  1.  
  2. Convert.ChangeType(micontrol.Text, Type.GetType(micontrol.Tag2.ToString()))
  3.  
  4.  
devuelve Object que es lo que me interesaba.

Ale, si alguien tiene / ha tenido el mismo problema ya sabe la solución.


Saludos

12
VB .NET / Error con DirectCast y ArrayList
« en: Miércoles 16 de Diciembre de 2009, 18:06 »
Hola a todos.
Verán tengo un ArrayList en el que quiero meter varios tipos de objetos.
He heredado del control TextBox y le he añadido otra propiedad Tag llamada Tag2 para almacenar datos que necesite.

La declaracion del objeto que almacena el contenido de la propiedad es:
Código: vb.net
  1.  
  2. private _tag2 as Object
  3.  
  4.  

y la declaracion de la propiedad:

Código: vb.net
  1.  
  2.     <TypeConverter(GetType(StringConverter))> _
  3.     <Browsable(True), DescriptionAttribute("Propiedad Tag 2"), CategoryAttribute("EProperties")> _
  4.     Public Property Tag2() As Object
  5.         Get
  6.             Return (Me._tag2)
  7.         End Get
  8.         Set(ByVal value As Object)
  9.             Me._tag2 = value
  10.         End Set
  11.     End Property
  12.  
  13.  

Entonces, en la propiedad Tag2 almaceno el nombre del tipo al que quiero convertir el contenido Text de mi TextBox.

Queda asi:
Código: vb.net
  1.  
  2. micontrol.Text="12/12/1999"
  3. micontrol.Tag2="System.DateTime"
  4.  
  5.  

Entonces al añadir el item al ArrayList, esta sentencia me falla:
Código: vb.net
  1.  
  2. miarraylist.Add(DirectCast(micontrol.Text,Type.GetType(micontrol.Tag2.ToString()))
  3.  
  4.  

No es correcta la conversion ?
Cómo puedo solucionar esto ?

Gracias

13
C/C++ / [Código Fuente] Ahorcado Complicado
« en: Miércoles 16 de Septiembre de 2009, 02:47 »
Este es el codigo del juego del ahorcado pero en su forma complicada.
En el codigo fuente se usa la modularizacion punteros y la API de windows.

Un ejemplo muy didactico.

Autor: ++K

14
C/C++ / Re: Validar un Ciclo EJ: For
« en: Martes 15 de Septiembre de 2009, 19:42 »
scanf si puede leer blancos y algunas cosas más.

Por ejemplo
Código: C
  1.  
  2. scanf("%20[a-z-1-9 ]",buffer);
  3.  
  4.  

Éste scanf lee como máximo 20 caracteres de todo lo que se teclee y además solo acepta caracteres de la a a la z
,números del 1 al 9 y espacios en blanco.

Mira esto
http://www.cplusplus.com/reference/clib ... dio/scanf/ (inglés)

15
C/C++ / Re: Duda con puntero
« en: Martes 15 de Septiembre de 2009, 19:32 »
Vaya, se me olvidó hacer el cast.
El ampersand era involuntario(copie la linea de arriba y le borre el .nombre).
Llevas razón, es engorroso de leer jeje. Suelo usar la otra sintaxis, pero en este programilla use punteros para evitar
que se me olvidaran.
Muchas  Gracias

16
C/C++ / Duda con puntero
« en: Martes 15 de Septiembre de 2009, 18:25 »
Hola amigos, tengo un código que me está dando problemas.
Tengo un array de estructuras y quiero modificarlo dentro de una función por medio de punteros.
No entiendo por qué lo hago mal. Haber si pueden hecharme un cable, gracias

Código: C
  1.  
  2.  
  3. main.c
  4.  
  5. typedef struct
  6. {
  7. char nombre[20];
  8. int puntos;
  9. }ITEM;
  10.  
  11.  
  12. void func1(ITEM *persona, int longitud)
  13. {
  14.  
  15. char *nombres[]={"Fernando","Pablo"};
  16. int i;
  17.    
  18.         for(i=0;i<longitud;i++)
  19.         {
  20.                strcpy(&(*(persona+i)).nombre,*(nombres+i));  // aqui falla
  21.                 &(*(persona+i)).puntos=30;
  22.         }
  23.  
  24. int main( int argc, char *argv[])
  25. {
  26.    
  27.  ITEM listaitem[]=
  28.  {
  29.  {"Manuel",20},{"Fernando",10}
  30.  };
  31.  
  32.  int i;
  33.  
  34.     func1(listaitem,2);
  35.  
  36.    
  37.     for(i=0;i<2;i++)
  38.     {
  39.         printf("n %s %d",listaitem[i].nombre,listaitem[i].puntos);
  40.     }
  41.    
  42.    
  43. }
  44.  
  45.  

17
C/C++ / Re: Problema redimensionando array de strings
« en: Lunes 1 de Junio de 2009, 21:31 »
Elimino la linea 37 y entonces se ejecuta
Código: C
  1.  
  2. lista_temporal=(char**)realloc(lista_temporal,longitud_lista_temporal*sizeof(char*));
  3.  
  4.  
Basta con eso ?

Gracias

18
C/C++ / Re: Problema redimensionando array de strings
« en: Lunes 1 de Junio de 2009, 20:00 »
No se si estoy en lo cierto, pero creo que la linea 37 me sobra porque realloc ya libera esa memoria.
Pueden confirmarme si estoy en lo cierto ?
Gracias

19
C/C++ / Re: Autodidacta en C++
« en: Lunes 1 de Junio de 2009, 19:38 »
Lo que puedes hacer es ver si puedes acceder al contenido del libro en la web.
Si tienes que registrarte hazlo e intentalo.
Sino, manda un correo a la web haber que te contestan.
Si no obtienes respuesta y puedes devolver el libro...
otra cosa no creo que puedas hacer.
Siento tu problema amigo.

20
C/C++ / Re: Autodidacta en C++
« en: Lunes 1 de Junio de 2009, 19:26 »
No tengo ese libro, pero he tenido experiencias similares que el fuente o las resoluciones de los ejercicios estan en tal o cual web.
yo antes de comprar verificaba la web y si podia acceder al contenido, lo compraba.
He devuelto algunos libros por ese motivo, contenido no accesible.
Ten cuidado la próxima vez amigo.

21
C/C++ / Problema redimensionando array de strings
« en: Lunes 1 de Junio de 2009, 19:06 »
Hola a todos.
Estoy intentando hacer una función que recibe un array de strings y dentro copia ese array a uno temporal y lo redimensiono a n-1 para luego seguir
trabajando con él.
Pero no me lo hace bien. Les pongo el code y les comento:
Código: C
  1.  
  2. void redimlista(char **lista_palabras,const int longitud_lista)
  3. {
  4. char **lista_temporal;
  5. int i;
  6. int num;
  7. int longitud_lista_temporal;
  8. char palabra[8];
  9.  
  10. /* Pido memoria para almacenar los punteros a cadena */
  11.     lista_temporal=(char**)calloc(longitud_lista,sizeof(char*));
  12.  
  13.     /* Voy a copiar toda la lista de palabras al array temporal */
  14.     for(i=0;i<longitud_lista;i++)
  15.     {
  16.         /* Reservo memoria para almacenar la cadena 8 porque 8 es la longitud máxima de las palabras */
  17.         *(lista_temporal+i)=(char*)calloc(8,sizeof(char));             
  18.        
  19.         /*Copio la cadena */
  20.         strcpy(*(lista_temporal+i),*(lista_palabras+i));
  21.     }   
  22.  
  23.         /* Guardo la longitud del array de palabras */
  24.         longitud_lista_temporal=longitud_lista;
  25.  
  26.        /* Elijo una palabra aleatoriamente de la lista de palabras */
  27.         num=rand()%longitud_lista_temporal;
  28.        
  29.         /* Copio la palabra elegida */
  30.         strcpy(palabra,*(lista_temporal+num));
  31.  
  32.                 /* Adelanto todos los elementos un lugar */
  33.                 for(i=num;i<longitud_lista_temporal-1;i++)
  34.             *(lista_temporal+i)=*(lista_temporal+i+1);
  35.  
  36.               /* Linea problematica */
  37.               free(*(lista_temporal+i));
  38.  
  39.              longitud_lista_temporal--;
  40.        
  41.          lista_temporal=(char**)realloc(lista_temporal,longitud_lista_temporal*sizeof(char*));
  42.  
  43.           /* ....  mas codigo... */
  44.            
  45. }
  46.  
  47.  

El código de la línea 37 es el que me da problemas.
Por ejemplo,si a la función le paso un array de 5 palabras al hacer el free, me libera la memoria de los elementos 4 y 5 en vez de solo el 5º.
Es decir:

Antes del free
Código: C
  1.  
  2. *(lista_temporal+3)="pepe"
  3. *(lista_temporal+4)="paco"
  4.  
  5.  

Después del free
Código: C
  1.  
  2. *(lista_temporal+3)= liberado
  3. *(lista_temporal+4)= liberado
  4.  
  5.  

Y lo que quiero conseguir es:
Código: C
  1.  
  2. *(lista_temporal+3)= "pepe"
  3. *(lista_temporal+4)= liberado
  4.  
  5.  
para poder redimensionar después con realloc.
Cómo puedo arreglar esto ?
Gracias

22
C/C++ / Re: palabra aleatoria de un fichero
« en: Lunes 1 de Junio de 2009, 17:50 »
Puedes leer todas las palabras del fichero y almacenarlas en un array.
Después eliges una aleatoriamente del array, la copias a otro lado y pones a 0 esa posicion del array para no volver a elegirla más

23
C/C++ / Re: Error en función y no se por qué
« en: Lunes 1 de Junio de 2009, 02:23 »
Vale, ya me contesto solo xD.

Citar
Código: C
  1.  
  2. *(tmp+i)=(char*)calloc(strlen(*(aray+i)+1),sizeof(char));  
  3.  
  4.  
malditos paréntesis xD.
Código: C
  1.  
  2. *(tmp+i)=(char*)calloc(strlen(*(aray+i))+1,sizeof(char));
  3.  
  4.  
Código: C
  1.  
  2. memcpy(*(tmp+i),*(aray+i),strlen(*(aray+i)+1));
  3.  
  4.  
Idem
Código: C
  1.  
  2. memcpy(*(tmp+i),*(aray+i),strlen(*(aray+i))+1);    
  3.  
  4.  
Ya funciona con memcpy o strcpy.
La duda que me queda es qué es más recomendable el memcpy o el strncpy.
Gracias

24
C/C++ / Error en función y no se por qué
« en: Lunes 1 de Junio de 2009, 01:29 »
Hola a todos,
Hice una función para trabajar con un array de strings pero no sé por qué no me funciona.
Les pongo el code:
Código: C
  1.  
  2. void test( char **aray,int size)
  3. {
  4.  
  5. char **tmp;
  6. int i=0;
  7.  
  8. tmp=(char**)calloc(size,sizeof(char*));
  9.  
  10. for(i=0;i<size;i++)
  11. {
  12.     *(tmp+i)=(char*)calloc(strlen(*(aray+i)+1),sizeof(char));   
  13.     //strcpy(*(tmp+i),*(aray+i));
  14.     memcpy(*(tmp+i),*(aray+i),strlen(*(aray+i)+1));
  15. }
  16.    
  17.  
  18. for(i=0;i<size;i++)
  19. {
  20.     free(*(tmp+i));
  21. }
  22.  
  23. free(tmp);
  24.  
  25.  
  26.  

Si uso la declaración de la linea 14, no sé por qué no copia bien la cadena y si uso la declaración de la línea 13 me peta al hacer free.
Pueden decirme que hago mal ?
Gracias.

25
C/C++ / Re: Duda funcion con nº de parametros variables
« en: Miércoles 27 de Mayo de 2009, 22:45 »
Trabajar con punteros si uno no tiene cuidado puede causar desastres xD.
Gracias.

Páginas: [1] 2 3