|
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
1
« 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 // console.h #ifndef __CONSOLE_H__ #define __CONSOLE_H__ #include <iostream> #include <fstream> using std::cout; using std::cin; using std::cerr; using std::streambuf; using std::ofstream; using std::ifstream; class console { private: ofstream n_cout; ofstream n_cerr; // new streams ifstream n_cin; streambuf* old_cout; streambuf* old_cerr; // old streams streambuf* old_cin; public: console(); ~console(); void hide(); void show(); // not implemented yet }; #endif
console.cpp #include "console2.h" #include <windows.h> console::console() { // create a console window AllocConsole(); // redirect cout to console window this->old_cout = cout.rdbuf(); this->n_cout.open("CONOUT$"); cout.rdbuf( this->n_cout.rdbuf() ); // redirect cerr this->old_cerr = cerr.rdbuf(); this->n_cerr.open("CONOUT$"); cerr.rdbuf( this->n_cerr.rdbuf() ); // redirect cin this->old_cin = cin.rdbuf(); this->n_cin.open("CONIN$"); cin.rdbuf( this->n_cin.rdbuf() ); } console::~console() { // restore streams cin.rdbuf( this->n_cin.rdbuf() ); cerr.rdbuf( this->n_cerr.rdbuf() ); cout.rdbuf( this->n_cout.rdbuf() ); // free console resources FreeConsole(); }
// main.cpp #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { // all WNDCLASSEX, RegisterClassEx,CreateWindow, etc stuff console c; int number = 0; cout << "n cout works"; cerr << "n cerr works"; cin >> number; // cin works DWORD error = GetLastError(); // INVALID_HANDLE_VALUE ¿ por qué ? cout << "n The number is: " << number; // Esto ya no funciona cerr << number; // ahora escribe todo lo que haya en el buffer }
2
« 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
« en: Jueves 22 de Julio de 2010, 20:44 »
Hola, he escrito una clase lista cuya interfaz declaro a continuación class linkedlist { public: linkedlist(void); // default constructor linkedlist (const linkedlist& tocopy); // copy constructor ~linkedlist(); // destructor bool insert ( const int value ); // insert element bool remove ( void ); // remove first element bool is_empty ( void ) const; // returns if the list is empty int size ( void ) const; // return list size linkedlist& operator = (const linkedlist& list); // overload = operator int& operator [] ( const int index ) const; // overload subscript operator private: struct node { int value; // node struct node* next; }; int elements; // amount of elements node* firstnode; // first node };
Lo que quiero conseguir es que cuando escriba esto linkedlist* lista1 = NULL; linkedlist* lista2 = NULL; // creo lista1 con new lista2 = lista1;
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 linkedlist& operator = (const linkedlist* &list);
pero no consigo que cuando se ejecuta la linea 7 entre en la funcion. Alguien sabe como hacer esto ? Gracias
4
« 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: class linkedlist { public: linkedlist(void); // default constructor ~linkedlist(); // destructor const bool insert ( const int value ); // insert element private: struct node { int value; // node struct node* next; }; int elements; // amount of elements node* firstnode; // first node };
codigo: // insert element const bool linkedlist::insert (const int value) { node* newnode = NULL; node* lastnode = NULL; newnode = new node; // alloc new node if ( !newnode ) return false; // if new fails newnode->value = value; // asign value newnode->next = NULL; // init next element if ( this->elements == 0) // there is no nodes this->firstnode = newnode; // assign first node else { lastnode = this->firstnode; // goto last node while (lastnode->next) lastnode = lastnode->next; lastnode->next = newnode; // set new node as next node } this->elements++; // update node count return true; } // destructor linkedlist::~linkedlist() { node* currentnode = NULL; node* nextnode = NULL; if (this->elements > 0) // list has nodes { currentnode = this->firstnode; // get first node while ( currentnode ) // while has nodes { nextnode = currentnode->next; // get next node delete currentnode; currentnode = NULL; // delete node currentnode = nextnode; // update current node } this->firstnode = NULL; //this->elements = NULL; ----> innecesario } return; }
5
« 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
« en: Jueves 11 de Febrero de 2010, 00:28 »
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:
Si, te entendi al ver (*(*(vector+i)))=*(temporal+pos);
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 Gracias de nuevo. Salu2
7
« en: Miércoles 10 de Febrero de 2010, 23:48 »
Pude leer la explicación antes de que editaras. Gracias Eternal. Salu2
8
« en: Miércoles 10 de Febrero de 2010, 23:12 »
Cierto. No mire los warnings. He sustituido el prototipo y el malloc por esto void alsr(int *vector, int inicio, int fin, int cuantos);
Linea 29 en aleatorio.c vector =(int*)malloc(cuantos *sizeof(int));
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
« 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 void alsr(int **vector, int inicio, int fin, int cuantos);
aleatorio.c #include<stdio.h> #include<stdlib.h> #include "aleatorio.h" void alsr(int **vector, int inicio, int fin, int cuantos) { int *temporal=NULL; int i; int j; int pos; int lon; lon=fin-inicio; /*Pedir memoria para temporal.*/ temporal =(int*)malloc(lon *sizeof(int)); if(temporal==NULL) return; for(i=0;i<lon;i++) { *(temporal+i)=inicio+i; } /*Pedir memoria array externo*/ *vector =(int*)malloc(cuantos *sizeof(int)); if(vector==NULL) return; /*Llenamos el vector de aleatorios*/ for(i=0;i<cuantos;i++) { /* Si tengo mas de un elemento */ if(cuantos > 1) { /*Copio el elemento de esa posicion al original*/ *(vector+i)=*(temporal+pos); /*Realmente atrasamos el elemento del array*/ for(j=pos;j<lon-1;j++) *(temporal+j)=*(temporal+j+1); /*Vamos eliminando el ultimo elemento*/ lon--; temporal =(int*)realloc(temporal ,lon *sizeof(int)); } else { *(vector+i)=*(temporal); } } temporal=0; return; }
main.c #include <stdio.h> #include <stdlib.h> #include "aleatorio.h" #define cantidad 2 int main(int argc,char *argv[]) { int *tmp=0; int i; alsr(&tmp,1,5,cantidad); for(i=0;i<cantidad;i++) { } }
10
« 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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http] Js (donde peta) [code=js] function dmonth(iMonth, iYear) { return 32 - new Date(iYear, iMonth, 32).getDate(); } function ponceldas() { var celdas=''; var i; var j; for(i=0;i<6;i++) { celdas+='<tr>'; for(j=0;j<7;j++) celdas+='<td class="day"></td>'; celdas+='</tr>'; } document.getElementById('calendario').tBodies[0].innerHTML+=celdas; pond(0,0); } function pond(y,m) { var celdas; var i; var maxdias; var dia=1; var day; var hoy; if (m==0 && y==0) { hoy=new Date(); day=hoy.getDate(); hoy.setDate(1); } else hoy=new Date(parseInt(y),parseInt(m),1); // dias del mes actual maxdias=dmonth(hoy.getMonth(),hoy.getFullYear()); celdas=document.getElementById('calendario').tBodies[0].getElementsByTagName('td'); // mes y año document.getElementById('mes').selectedIndex=hoy.getMonth(); document.getElementById('anio').innerHTML=' '+hoy.getFullYear()+' '; //vacio todas las celdas for(i=0;i<celdas.length;i++) celdas[i].innerHTML=''; // calculo el desplazamiento del dia de la semana en base al que js me da for(i=(hoy.getDay()+6)%7;i < celdas.length;i++) { if (dia<=maxdias) { celdas[i].innerHTML=dia; dia+=1; } } } function pm() { pond(document.getElementById('anio').textContent,document.getElementById('mes').value); }
11
« en: Miércoles 16 de Diciembre de 2009, 19:13 »
Encontré el fallo. La conversión no era válida porque: DirectCast(micontrol.Text,Type.GetType(micontrol.Tag2.ToString()))
devuelve Typey esto Convert.ChangeType(micontrol.Text, Type.GetType(micontrol.Tag2.ToString()))
devuelve Object que es lo que me interesaba. Ale, si alguien tiene / ha tenido el mismo problema ya sabe la solución. Saludos
12
« 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: y la declaracion de la propiedad: <TypeConverter(GetType(StringConverter))> _ <Browsable(True), DescriptionAttribute("Propiedad Tag 2"), CategoryAttribute("EProperties")> _ Public Property Tag2() As Object Get Return (Me._tag2) End Get Set(ByVal value As Object) Me._tag2 = value End Set End Property
Entonces, en la propiedad Tag2 almaceno el nombre del tipo al que quiero convertir el contenido Text de mi TextBox. Queda asi: micontrol.Text="12/12/1999" micontrol.Tag2="System.DateTime"
Entonces al añadir el item al ArrayList, esta sentencia me falla: miarraylist.Add(DirectCast(micontrol.Text,Type.GetType(micontrol.Tag2.ToString()))
No es correcta la conversion ? Cómo puedo solucionar esto ? Gracias
13
« 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
« en: Martes 15 de Septiembre de 2009, 19:42 »
scanf si puede leer blancos y algunas cosas más. Por ejemplo scanf("%20[a-z-1-9 ]",buffer );
É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
« 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
« 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 main.c typedef struct { char nombre[20]; int puntos; }ITEM; void func1(ITEM *persona, int longitud) { char *nombres[]={"Fernando","Pablo"}; int i; for(i=0;i<longitud;i++) { strcpy(&(*(persona +i )). nombre,*(nombres +i )); // aqui falla &(*(persona+i)).puntos=30; } int main( int argc, char *argv[]) { ITEM listaitem[]= { {"Manuel",20},{"Fernando",10} }; int i; func1(listaitem,2); for(i=0;i<2;i++) { printf("n %s %d",listaitem [i ]. nombre,listaitem [i ]. puntos); } }
17
« en: Lunes 1 de Junio de 2009, 21:31 »
Elimino la linea 37 y entonces se ejecuta lista_temporal =(char**)realloc(lista_temporal ,longitud_lista_temporal *sizeof(char*));
Basta con eso ? Gracias
18
« 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
« 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
« 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
« 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: void redimlista(char **lista_palabras,const int longitud_lista) { char **lista_temporal; int i; int num; int longitud_lista_temporal; char palabra[8]; /* Pido memoria para almacenar los punteros a cadena */ lista_temporal =(char**)calloc(longitud_lista ,sizeof(char*)); /* Voy a copiar toda la lista de palabras al array temporal */ for(i=0;i<longitud_lista;i++) { /* Reservo memoria para almacenar la cadena 8 porque 8 es la longitud máxima de las palabras */ *(lista_temporal +i )=(char*)calloc(8,sizeof(char)); /*Copio la cadena */ strcpy(*(lista_temporal +i ),*(lista_palabras +i )); } /* Guardo la longitud del array de palabras */ longitud_lista_temporal=longitud_lista; /* Elijo una palabra aleatoriamente de la lista de palabras */ num =rand()%longitud_lista_temporal ; /* Copio la palabra elegida */ strcpy(palabra ,*(lista_temporal +num )); /* Adelanto todos los elementos un lugar */ for(i=num;i<longitud_lista_temporal-1;i++) *(lista_temporal+i)=*(lista_temporal+i+1); /* Linea problematica */ free(*(lista_temporal +i )); longitud_lista_temporal--; lista_temporal =(char**)realloc(lista_temporal ,longitud_lista_temporal *sizeof(char*)); /* .... mas codigo... */ }
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 *(lista_temporal+3)="pepe" *(lista_temporal+4)="paco"
Después del free *(lista_temporal+3)= liberado *(lista_temporal+4)= liberado
Y lo que quiero conseguir es: *(lista_temporal+3)= "pepe" *(lista_temporal+4)= liberado
para poder redimensionar después con realloc. Cómo puedo arreglar esto ? Gracias
22
« 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
« en: Lunes 1 de Junio de 2009, 02:23 »
Vale, ya me contesto solo xD. malditos paréntesis xD. Idem
Ya funciona con memcpy o strcpy. La duda que me queda es qué es más recomendable el memcpy o el strncpy. Gracias
24
« 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: void test( char **aray,int size) { char **tmp; int i=0; tmp =(char**)calloc(size ,sizeof(char*)); for(i=0;i<size;i++) { //strcpy(*(tmp+i),*(aray+i)); } for(i=0;i<size;i++) { }
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
« en: Miércoles 27 de Mayo de 2009, 22:45 »
Trabajar con punteros si uno no tiene cuidado puede causar desastres xD. Gracias.
|
|
|