• Martes 7 de Mayo de 2024, 14:38

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 - ProfesorX

Páginas: 1 ... 4 5 [6] 7 8 ... 32
126
C/C++ / Re:Leer Fichero
« en: Jueves 26 de Enero de 2012, 21:45 »
Primero que nada, seria bueno saber si el archvo de texto tiene un formato predeterminado, o sea, si los datos estas separados por espacios, por comas, o siguen algun otro tipo de secuencia, eso facilitaria mucho las cosas.

Ahora, si el contenido del archivo es completamente aleatorio, es decir, que los datos no tienen un formato predeterminado, eso lo dificulta un poco, aun asi, no es imposible.

Como yo lo veo, el algoritmo que podrias seguir en caso de que los datos no tengan un formato predeterminado es:

1. Leer el caracter.
2. Comprobar si el caracter leido es un numero del 0 al 9, un punto (.) o un signo de menos (-)
3. En caso afirmativo, almacenar ese numero/punto/signo en un arreglo de char, y regresar al paso 1.
4. En caso negativo, descartar el caracter, convertir lo que haya almacenado en el arreglo de char y regresar al paso 1.
4. Repetir los pasos del 1 al 4 hasta que hayas leido todo el archivo.

Espero que eso te de una mejor idea de lo que debes hacer.

Saludos :)

127
C/C++ / Re:[Problema] Imprimir un carácter escaneado en pantalla
« en: Domingo 22 de Enero de 2012, 23:29 »
El problema esta con scanf("%c",&symbol);, en algunas ocasiones scanf no funciona de manera adecuada, y ese es el problema al tratar de leer un caracter con scanf, lo mejor es utilizar fgets(), ademas necesitas limpiar el buffer con getchar() para que no te acarree porblemas, te dejo el codigo modificado para que te des una idea de como debe ser.

Código: [Seleccionar]
#include <cstdio>

void naturales (int n, char c[]);

void naturales (int n, char c[]){

int count, count2;

for(count=1; count<=n; count++){
printf("%d ", count);
for(count2=1; count2<=count; count2++){
printf("%c", c[0]);
}
printf("\n");
}
}

int main(){

int numero;
    // Leeremos el caracter como si fuera cadena,
    // ya que fgets agrega el caracter nulo
    // despues de leer.
char symbol[2];

printf("Introduzca un numero: ");
scanf("%d",&numero);
    // Limpiar el buffer despues de usar scanf
    // para que fgets funcione de manera correcta
    while (getchar() != '\n');
printf("Introduzca un caracter: ");
    fgets(symbol, 2, stdin);
//scanf("%c",&symbol);
//fflush(stdin);

printf("\n");

naturales(numero, symbol);

return 0;
}

Saludos :)

128
ASM (Ensamblador) / Re:SObre INstruccion JA
« en: Martes 10 de Enero de 2012, 20:15 »

y mi mayor problema es como esto se basa en las banderas CF y ZF?

Como dije en mi anterior mensaje, esto ya es un poco mas tecnico, de como funciona el lenguaje maquina o ensamblador, todo este tema es demasiado extenso como para explicartelo en unas cuantas lineas, tratare de resumirte lo importante respecto a las banderas CF y ZF.

Para empezar respecto a las banderas, el 0 se considera como falso, y el 1 coimo verdadero.

CF = Carry Flag, Bandera de acarreo, esta bandera cambia a 1 si hay acarreo (verdadero), 0 si no hay acarreo (falso).

ZF = Zero Flag, Bandera de cero, esta bandera cambia a 1 si el resultado de la operacion da cero (verdadero) o un valor diferente de cero (Falso).

Ahora cuando comparas dos valores, es como si hicieras una resta, entonces dependiendo del resultado de esa resta, las banderas cambiaran.

Regresando al ejemplo anterior, si por ejemplo comparas el 3 con el 2 y haces la resta (en binario):

11-10=01.

Como puedes ver, el resultado no produjo un acarreo (porque estamos restando un valor mayor a uno menor), por lo tanto el CF = 0

El resutado de la resta tampoco fue cero como puedes ver el resultado fue uno, por lo tanto ZF = 0

Esi significa que entonces el resultado es mayor que, y como puedes ver quedo perfectamente comprobado por las banderas CF = 0 Y ZF = 0.

Si comparas 2 y 2 obtienes:
10 - 10 = 00

En este caso, el reslutado no produjo un acarreo tampoco (porque estamos restando valores iguales), por lo tanto el CF = 0

Pero, el resutado de la resta en este caso fue cero,  por lo tanto ZF = 1

Entonces como puedes ver se determina que los numero son iguales cuando CF = 0 y ZF = 1, entonces el JA no funciona en este caso.

Bueno, es lo mejor que te puedo explicar sin extenderme demasiado, pero el resto de saltos (JAE, JE, etc) funciona de manera parecida.

Saludos :)


129
ASM (Ensamblador) / Re:SObre INstruccion JA
« en: Martes 10 de Enero de 2012, 18:15 »
Es simple JA es el nemonico de Jump if Above, que seria el equivalente a mayor que.

Se ocupa despues de hacer una comparacion, es decir, tu comparas dos valores (CMP) y si el valor del primer operando es mayor al segundo operando hace el salto a la etiqueta (direccion) indicada.

Ejemplo:
Código: [Seleccionar]
;Compara AX y BX
CMP AX, BX
;Si AX es mayor, salta a etiqueta1, si no sigue la ejecucion sin saltar
JA Etiqueta1
;Esto se ejecuta si no salta
ADD AX, 1
Etiqueta1:
ADD BX, 1

Es Facil ves? Ahora si necesitas ser mas tecnico te dire que cada ves que comparas, el registro de banderas (flag) cambia el valor de sus bits, dependiendo del resultado de la comparacion, entonces cuando haces JA lo que hace es comparar si el registro CF y el ZF son igual a cero para determinar si el numero es mayor.

Espero que con eso te quede mas claro como funciona.

Saludos :)

130
C/C++ / Re:Motrar La Densidad Mayor y Menor
« en: Viernes 16 de Diciembre de 2011, 19:56 »
Gracias Por Nada a los que vieron y no me ayudaron la verdad no los entiendo si lo ven es porque algo tienen que entender de c/c++ pero me parace que este foro no ayuda mucho hasta luego el programa lo termine con ayuda de un amigo el cual por culpa de ustedes lo moleste en sus vacaiones. GRACIAS POR NADA!!!!!!!

En este foro la ayuda es gratuita, asi que no puedes venir a exigir que se te ayude solo porque tienes un problema que te urge resolver.

La mayoria de los que ayudamos aqui trabajamos, y solo respondemos preguntas en nuestro tiempo libre.

En mi caso tengo en estos momentos una carga de trabajo bastante alta, y no me da tiempo de estar aportando mucho, en el caso de tu problema requeria dedicarle una hora por lo menos, para revisar codigo compilar, y publicar una respuesta.

Si quieres ayuda garantizada, pagale a alguien para que lo haga, y a esa persona si exigele si no te lo hace en un tiempo razonable.

No creas que porque es un foro de programacion estamos obligados a contestarte, la ayuda es un privilegio, no un derecho.

Por el tipo de codigo que publicas deduzco que eres estudiante, asi que solo te dire que cuando trabajes lo comprenderas, y veras que no es tan facil tener tiempo libre una vez que trabajas, y que tampoco tienes obligacion en contestar puesto que no recibes dinero a cambio, si acaso a veces las gracias nada mas, y digo a veces, porque la mayoria de veces les contestas sus dudas y ni las gracias te dan, como si fuera nuestra obligacion contestar y dar una respuesta.

Solo recuerdalo la proxima vez que publiques una duda, si es que lo llegas a hacer.

Saludos :)

131
C# / Re:creacion de dll
« en: Martes 6 de Diciembre de 2011, 03:49 »
Publicaste tu codigo, pero me queda la pregunta ¿cual es tu duda en este caso? ¿te marca algun error? ¿o que problema tienes con esto?

132
C# / Re:creacion de dll
« en: Domingo 4 de Diciembre de 2011, 21:38 »
Hola Picyo, disculpa por no haber contestado antes, pero no he entrado al foro por causa de mi trabajo.

Bueno, revisando tu codigo, te dire que tiene los siguientes errores:

1. En el primer bloque te falta cerrar una llave, tienes 3 llaves "{", pero solo dos "}", agrega la que te falta

2. El nombre de tu namespace esta equivocado, en el primer bloque es Clases_propias y en el segundo bloque ClasesPropias, debe ser igual en los dos bloques, ya sea que corrijas el primero o el segundo, en los dos se debe escribir exactamente igual, respetando guiones, mayuscula y minusculas.

3. En el segundo bloque, la definicion y asignacion de tu variable miembro se encuentran fuera de la clase, la definicion debe ir dentro de la clase, y la asignacion dentro de un metodo, de hecho el error que mencionas lo dice claramente:

Citar
A namespace does not directly contain members such as fields or methods

Traducido:

Citar
Un namespace no contiene directamente miembros como campos (las variables miembro se consideran campos) o metodos


O sea que tu codigo debe quedar asi:

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ClasesPropias;

namespace UsoDeClasePropia
{
    // instanciar y declarar objeto de mi clase
    public partial class Form1 : Form
    {
        // Definicion de tu variable miembro Persona1
        // dentro de la clase Form1
        ClasePersona Persona1;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Asignacion de tu variable Miembro
            // dentro del metodo Form1_Load
            Persona1 = new ClasePersona();

        }
    }
}

Saludos y suerte :)

133
Visual C++ / Re:Configurar VC para proyecto "limpio"
« en: Sábado 12 de Noviembre de 2011, 21:36 »
Hola Raul100.

Mira, desafortunadamente los archivos que mencionas son necesarios para el funcionamiento optimo del entorno de Visual Studio, y la mayoria no pueden ser eliminados completamente.

Por ejemplo, los .ilk son archivos de compilacion incremental, estos te ayudan para que cuando modifiques un proyecto y lo recompiles, la siguiente vez sea mas rapida la compilacion. En proyectos pequeños no notaras la diferencia, pero en proyectos grandes con decenas de archivos y miles de lineas de codigo si hay una gran diferencia en el tiempo que tarda la compilacion.

Los archivos .pdb son archivos que contienen la informacion de depuracion de tu programa, sin este archivo, no puedes usar la depuracion paso a paso (linea por linea) en tu codigo fuente.

Y asi cada archivo tiene su lugar e importancia.

A continuacion te dejo un enlace con los diferentes tipos de archivos creados por Visual Studio para que estes mas enterado de para que sirve cada archivo :)

http://msdn.microsoft.com/en-us/library/3awe4781%28v=vs.80%29.aspx

Como veras, la mayoria son necesarios, son creados automaticamente cada vez que compilas un proyecto, y pues desafortunadamente tendras que hacerte a la idea de que ahi estaran.

La buena noticia, es que si te preocupa el espacio, en caso de que quieras llevarte el proyecto de una a otra maquina de trabajo y que no sea tan grande todo lo que te llevas, te dire que en ese caso, puedes omitir esos archivos al copiarlos a otra maquina. Como mencione antes, al recompilar un proyecto, si esos archivos  no existen, visual estudio los volvera a crear desde un principio.

Al llevarte un proyecto de una maquina a otra, los unicos archvos indispensables que tendras que copiar son:

Archivos de solucion: .sln.

Archivos de proyecto: .vcproj, .vcxproj

Archvios de codigo fuente: .c, .cpp, .h

Archivos de recursos: .rc.

El resto puedes omitirlos al copiarlos como dije antes, ya que cuando recompiles en la maquina nueva, volveran a ser creados.

Saludos :)

134
C/C++ / Re:Problema con enunciado de un problema en C
« en: Lunes 10 de Octubre de 2011, 03:39 »
Hola lanset, bueno, lo que yo entiendo que te esta pidiendo el enunciado es que digas el total de datos que estan arriba del promedio, es decir, primero tienes que sacar el promedio de los datos de la lista, y despues deberas contar cuantos datos son mayor al promedio.

Ejemplo si los datos son 5, 6, 7

El promedio seria 6 ((5+6+7)/3).

El numero de datos mayor al promedio seria uno, o sea, el 7.

Bueno, asi es como yo entiendo el enunciado.

Saludos :)

135
C# / Re:ObjectDisposedException, dibujar en picturebox, herencia visual
« en: Martes 4 de Octubre de 2011, 16:09 »
Hola Sined99.

Si dices que tienes problemas porque se cierra el formulario, porque en lugar de cerrarlo, mejor solamente lo ocultas con el metodo Hide(), y cuando necesites mostrarlo, utiliza el metodo Show().

Puedes utilizar ademas el evento FormClosing que se lanza cuando se trata de cerrar el formulario, y ahi cancelar el cerrado y utilizar el Hide() ahi.

Saludos :)

136
Visual C++ / Re:datos en arreglo
« en: Viernes 30 de Septiembre de 2011, 10:22 »
No se hacen tareas :)

137
Visual C++ / Re: Codigo de Matriz Inversa y Método de Gauss
« en: Sábado 24 de Septiembre de 2011, 16:30 »
Citar
no rayes el código
, hay partes que no se entienden
En realidad el no lo rayo a proposito, si te fijas tambien aparece con letra inclinada en algunas partes, simplemente olvido encerrar el codigo, si no lo encierras, entonces los [ s] y los [ i] se convierten a subrayados e inclinados respectivamente.

Si te interesa el codigo, te lo dejo a continuacion correctamente encerrado.

Inversa de una Matriz
Código: [Seleccionar]
#include <iostream>
using namespace std;

int i,j, k, s;
float m1[1000][1000], coef, aux[1000], elemento;
     
int main()
{
cout << "ntBienvenido al Generador de Matrices Inversasn";
cout << "Por favor introduzca el tamaño de la matrizn";
cin >> k;

for (i=0;i<k;i++)
{
for (j=0;j<k;j++)
{
cout << "Ingrese el valor de [" <<i<<"]["<<j<<"]";
cin >> m1 [i][j];
}
}

for (i=0;i<k;i++)
for(j=k;j<2*k;j++)
{
if(i==(j-k))
m1[i][j]=1;
else
m1[i][j]=0;
}
//Iteraciones
for (s=0;s<k;s++)
{
elemento=m1[s][s];
for (j=0;j<2*k;j++)
m1[s][j]=m1[s][j]/elemento;

for(i=0;i<k;i++)
{
if (i==s)
;
else
{
coef= m1[i][s];
for (j=0;j<2*k;j++)
aux[j]=m1[s][j]*(coef*-1);
for (j=0;j<2*k;j++)
m1[i][j]=m1[i][j]+aux[j];
}
}
}
//Imprimir la matriz inversa

for (i=0;i<k;i++)
{
for(j=k;j<2*k;j++)
cout << "t"<<m1[i][j];
if (j==k)
cout <<"n";
}

}

Método de Gauss
Código: [Seleccionar]
#include <iostream>
using namespace std;

int i,j,k,l,s;
float m1[1000][1000], coef, aux[1000], elemento;
     
int main()
{
cout << "ntBienvenido al Solucionador de ecuaciones 2010n";
cout << "Por favor determine el numero de incognitas a resolver: ";
cin >> k;
l=k+1;

for (i=0;i<k;i++)
{
for (j=0;j<l;j++)
{
cout<<"nAhora introduzca los coeficientes de ["<<i<<"]["<<j<<"]";
cin >> m1 [i][j];
}
}

for (s=0;s<k;s++)
{
elemento=m1[s][s];
for (j=0;j<l;j++)
m1[s][j]=m1[s][j]/elemento;
for (i=0;i<k;i++)
{
if (i==s)
;
else
{
coef=m1[i][s];
for (j=0;j<l;j++)
aux[j]=m1[s][j]*(coef*-1);
for (j=0;j<l;j++)
m1[i][j]=m1[i][j]+aux[j];
}
}
}

//Imprimir las soluciones
for (i=0;i<k;i++)
{
cout << "t x ["<<i<<"] "<<m1[i][k] <<"n";
}

}

Saludos :)

138
C/C++ / Re:Violacion de segmento al modificar el contenido de un puntero
« en: Sábado 24 de Septiembre de 2011, 16:04 »
Hola sergio_, bienvenido al foro :)

Estas cometiendo el clasico error al trabajar con punteros, usar punteros sin inicializar.

Por si no lo sabias, un puntero es un tipo especial de variable que guarda direcciones de memoria, nada mas. Para poder utilizarlo sin problemas debemos decirle que guarde (apunte) una direccion de memoria libre. Esto se hace por medio de la funcion malloc (si trabajas con C) que se encuentra en la libreria stdlib.h o el operador new (si trabajas con C++). Cuando termines de utilizar el apuntador, debes liberar la memoria. Si usaste malloc debes usar free para liberar, y si usaste new debes usar delete. Si no le decimos que apunte a una direccion especifica, apuntara a una direccion al azar de la memoria, es por eso que obtienes un segfault, ya que tu puntero apunta a una direccion de memoria no valida y tratas de cambiar su contenido.

Hay otro error ademas de ese en tu codigo, estas definiendo tu variable buffer como un arreglo de char de 8, cuando en realidad tu cadena contiene 9 caracteres, ya que todas las cadenas contienen obligatoriamente el caracter nulo '\0' (aunque tu no lo veas) al finalizar la cadena, para indicar que es el fin de la cadena. Aunque al inicializar arreglos de char no es necesario colocar el tamaño del arreglo, ya que el compilador lo deduce automaticamente, bien pudiste haber escrito  char buffer[] = "hola com"; y el compilador automaticamente deduce que el tamaño del arreglo es de 9 caracteres. Si quieres especificar el tamaño de tu arreglo y despues asignarle el valor la forma de hacerlo es por medio de la funcion strncpy() que esta definida en la libreria string.h:

Código: [Seleccionar]
char buffer[9];
strncpy(buffer, "hola com", 9);

Te dejo un ejemplo de como debes inicializar correctamente los punteros:

Código: [Seleccionar]
#include <cstdio>
#include <cstdlib>
#include <cstring>

int main()
{
    char buffer[] = "hola com";

    // Utiliza malloc si trabajas con C
    //char* buffer2 = (char*) malloc(sizeof(char) * 9);
    char* buffer2 = new char[9];
    strncpy(buffer2, "hola com", 9);

    buffer[0]='a';
    buffer2[0] = 'a';

    //int* a = (int*) malloc(sizeof(int));
    int* a = new int();
    *a = 123;
    *a = 245;

    // Si utilizaste malloc, usa free para liberar
    //free(buffer2);
    //free(a);
    delete buffer2;
    delete a;


    return 0;
}

Saludos :)

139
C/C++ / Re:Problema con punteros el O.S. cierra el programa
« en: Lunes 19 de Septiembre de 2011, 00:12 »
Aunque seguramente sea muy tarde, dejo la solución a los problemas:


Nunca es tarde, a alguien mas le puede servir al informacion ;)

Por cierto, saludos brother :) y disculpa, no lei tu mensaje antes, si no te hubiera apoyado :P

140
C/C++ / Re:No encuentro mi error
« en: Domingo 18 de Septiembre de 2011, 20:49 »
Hola portirijillo.

El problema que tienes ocurre debido al redondeo de los valores de tipo float.

Desafortunadamente, las computadoras solo entienden digitos binarios enteros (0 y 1), para representar los numeros de tipo flotante se escoge una codificacion para reprensentar un numero por medio de un exponente y una mantisa, pero al hacer esta conversion, en muchos casos el numero equivalente obtenido no es exactamente el numero que queremos almacenar, siempre habra un error de redondeo.

Puedes comprobarlo tu mismo, imprimiendo el valor guardado y veras que a veces no coincide el valor capturado/calculado con el valor verdadero:

Código: [Seleccionar]
void captura(){
    float monto,pago,cambio=0;
    printf("Programa que calcula el cambio con monedas");
    printf("\nInserte el total a pagar >");
    scanf("%f",&monto);
    // Lo probe y en mi caso capture 4.63, pero guardo
    // 4.6300001144, como podras notar tu mismo con .10f
    printf("%.10f\n", monto);
    printf("Inserte el dinero recibido >");
    scanf("%f",&pago);
    printf("%.10f\n", pago);
    cambio=pago-monto;
    // al poner .10f notaras que el valor de cambio en
    // realidad es 5.3699998856 y no 5.37 como pensabas
    printf("Su cambio es %.10f",cambio);
    monedas(cambio);
}

Por desgracia, no hay forma de evitar ni de predecir este error en el redondeo utilizando valores de tipo flotante.

La solucion que se me ocurre que podrias emplear es separar los centavos de las pesos (o dolares, quetzales, euros o cualquiera que sea la moneda que utilices, ya que no dices de que pais eres, en mexico nuestra moneda es el peso, asi que por eso digo pesos ;)), y tratar los centavos como si fueran cantidades enteras y no flotantes, es decir, en lugar de decir 0.10 pesos, dirias y capturarias 10 centavos. Luego para las cantidades en pesos multiplicalas por 100, de esa forma trabajaras solo con centavos, o sea en el caso de 5 pesos serian 500 centavos, luego sumale los centavos, y utiliza variables y operaciones enteras, al trabajar con enteros no hay problemas de redondeo, y obtendrias la cantidad en monedas exacta.

Tomando tu ejemplo, dirias algo como "deme la cantidad en pesos" y capturas 4, luego "dame la cantidad en centavos" y capturarias 63, luego multiplicas 4*100, da 400 y le sumas los centavos, da 463, y entonces haces las operaciones utilizando 463 en lugar de 4.63, obviamente restarias 25, 10, 5 y 1 en lugar de 0.25, 0.10, 0.5 y 0.1, no se si me di a entender.

Saludos y suerte :)

141
SQL Server / Re:Consulta SQL
« en: Viernes 9 de Septiembre de 2011, 01:04 »
Tienes que hacer una consulta "self-join", es decir, unir la tabla (join) consigo misma como si fueran dos tablas diferentes, por medio de aliases (as). Te dejo un ejemplo de como seria tomando como ejemplo la tabla que mencionas:

Código: [Seleccionar]
select c1.cliente from compra as c1 inner join compra as c2
on c1.cliente = c2.cliente
where c1.producto = 'manzanas' and c2.producto = 'peras';

Saludos :)

142
Dudas informáticas / Re:donde se almacenan los archivos temporalmente
« en: Lunes 29 de Agosto de 2011, 03:47 »
Bueno, para responder tu primera duda, me parece que se archivan en lugares diferentes dependiendo de la aplicacion.

Por ejemplo. al quemar, se guardan en la carpeta Temp, su ubicacion varia segun la version de windows, revisa la variable de entorno Temp para su ubicacion exacta.

Al comprimir, los archivos se guardan en el directorio actual.

Y asi, segun la operacion a realizar

Tu segunda duda me parece que no tiene respuesta, ya que cada programa usa rutas de destino diferentes, no creo que sea posible saber la ruta de destino con antelacion.

Saludos :)

143
C# / MOVIDO: donde se almacenan los archivos temporalmente
« en: Lunes 29 de Agosto de 2011, 03:38 »
El tema no es especifico de programacion en C#

Movido a Dudas Informaticas:

http://solocodigo.com/47037/donde-se-almacenan-los-archivos-temporalmente/

144
C# / Re:El compilador no da error, pero no se ejecuta correctamente mi WindowsForm
« en: Domingo 28 de Agosto de 2011, 08:12 »
ah todo esto me gustaria que este juego tubiese un menu, digamos que creo un Windows.Form llamado "Index.cs" , y me gustaria que apretando un boton me llevase a "form1.cs" , por ejemplo.

Bueno, si lo que quieres es un menu como los clasicos menu de las aplicaciones (Archivo, Edicion, etc) simplemente añade un control MenuStrip al formulario, y añade las opciones que necesites.

Si lo que deseas es llamar a un formulario 1 desde otro formulario 2, deberas añadir tu formulario 2, crear en ese formulario 2 un objeto de tipo formulario 1 y luego llamar el metodo Show del formulario 1 por medio del boton del formulario 2.

Te lo explico con mas detalle, suponiendo que tu formulario 2 se llamara Index como en tu ejemplo, y el formulario uno se llamara Form1 ;).

1. Añades un formulario 2 llamado Index (de aqui en adelante le diremos Index al formulario 2).

2. Añades un boton al formulario Index.

3. Añades una variable privada llamada form1 para referirte al formulario uno.

4. En el contructor creas (new) una instancia del Form1.

5. En el evento Click de tu boton, llamas al metodo Show del formulario 1.

6. El codigo de Index quedaria asi:

Código: [Seleccionar]
    public partial class Index : Form
    {
        // Variable privada para referirte al formulario 1
        private Form1 form1;
        public Index()
        {
            InitializeComponent();
            // Creas una instancia del formulario 1
            form1 = new Form1();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Llamas al metodo Show del formulario 1
            form1.Show();
        }
    }

7. En el formulario uno, añades codigo para el evento FormClosing para evitar que se cierre el formulario 1, en lugar de cerrarlo, vamos a ocultarlo cuando pulses el boton de cerrar (la x roja) del formulario 1. El codigo del evento quedaria asi:

Código: [Seleccionar]
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // Cancelamos el cerrado del formulario
            // y en lugar de cerrarlo, solo lo ocultaremos
            e.Cancel = true;
            // Llamamos al metodo Hide para ocultar el formulario
            this.Hide();
        }

8. Finalmente, en lugar de crear un Form1 al inicio de la aplicacion, creamos un Index. El codigo de Main() quedaria asi:

Código: [Seleccionar]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            // En lugar de crear un Form1, creamos un
            // Index, recuerda que en Index estaremos
            // creando el Form1
            Application.Run(new Index());
           
        }

Espero te sirva la informacion.

Saludos :)

145
C# / Re:El compilador no da error, pero no se ejecuta correctamente mi WindowsForm
« en: Sábado 27 de Agosto de 2011, 19:05 »
Hola whaitie, el error esta en el siguiente metodo

Código: [Seleccionar]
        public void theForm()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //I added this call, to a method that starts up a round
            initGame();
        }

Ese metodo se supone que deberia ser el constructor de la clase (recuerdas el hilo anterior donde hablabamos de costructores), como te habia comentado la vez pasada, el constructor es el metodo que se utiliza para inicializar el objeto, y se ejecuta automaticamente cuando el objeto es creado. Dado que la clase se llama Form1, el constructor deberia llamarse Form1(), sin embargo no hay ningun constructor llamado Form1(), al parecer cuando copiaste el programa del libro cambiaste el nombre del constructor de Form1(), a theForm(), entonces dado que el nombre del metodo no coincide con el nombre de la clase (que es el requisito para ser el constructor, recuerda, el constructor siempre se llama igual que la clase), el constructor nunca es llamado, y nunca se ejecuta InitializeComponent() que es lo que inicializa los componentes (controles) de tu formulario, y carga las imagenes, por eso el formulario aparece en blanco.

Pero ademas hay otro error de logica, dentro del metodo theForm() hay una llamada a un metodo llamado initGame(), que a su vez llama a Application.Restart(), que reinicia el programa de nuevo, al ser llamado dentro del constructor, hace que se reinicie el programa y vuelva a crear el objeto, lo que genera que entre en un cliclo infinito, y que aparezcan infinidad de ventanas sin dar tiempo a que puedas cerrar el programa.

La solucion es que cambies el nombre nombre del metodo a Form1() (o como quiera que se llame la clase, recuerda eso, en este caso la clase se llama Form1, pero si cambias el nombre de la clase, debes cambiar el nombre del metodo costructor para que coincida con el nombre de la clase, recuerda eso) para que el metodo InitializeComponent() sea llamado, y elimina la llamada a initGame(), el codigo debera quedar asi:

Código: [Seleccionar]
        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //Eliimina la siguiente linea
            //initGame();
        }

Saludos :)

146
Bases de Datos / Re:consulta select sql con 2 condiciones where
« en: Lunes 22 de Agosto de 2011, 16:33 »
Bueno, tiene tiempo que no trabajo con Visual Basic 6, pero me parece que no puedes hacer una condicion que te busque en todos los elementos de un combobox automaticamente, tendrias que hacer un ciclo para iterar en cada elemento del combobox, y de esa forma construir tu consulta SQL. Aparte de eso, la sintaxis de tu sentencia SQL esta equivocada, no puedes poner 2 veces la clausula where dentro de la misma consulta, y ademas colocas el and fuera de la cadena de consulta. Un detalle adicional, no es recomendable concatenar cadenas  para hacer la consulta, ya que hace tu consulta vulnerable a ataques de Inyeccion SQL, lo mejor es hacer consultas parametrizadas, aunque no recuerdo como se hacen en Visual Basic 6, tendrias que averiguarlo por tu cuenta.

Te dejo un ejemplo de como deberias construir la consulta individual sin parametrizar, queda en ti hacer el ciclo para recorrer cada elemento del combobox, si esa es tu intencion, y averiguar como se hace una consulta parametrizada.

Código: [Seleccionar]
Data1.RecordSource = "SELECT * FROM Pagos WHERE Nombre_de_actividad='" & Combo1.Text & "' And numero_de_cliente=" & Val(Text3.Text)

Saludos :)

147
C/C++ / Re:Problema al hacer una Agenda Telefonica en C++
« en: Domingo 21 de Agosto de 2011, 03:53 »
Consejo, utiliza las etiquetas code para encerrar tu codigo, ya que mejora la legibilidad.

El problema esta en el ciclo while (clasico error de logica), tiene como condicion i < 10, pero nunca incrementas i, por lo tanto i siempre sera menor de cero, y nunca saldra del ciclo.

Solamente incrementa i dentro del ciclo:

Código: [Seleccionar]
    while(i<10 && seguir)
    {
        if(strcmp(Persona[i].Nombre,dato)==0)
        {
            seguir=false;
            pos=i;
        }
        // Falta incrementar i dentro del ciclo, si no lo incrementas
        // siempre sera = cero y nunca saldra del ciclo.
        i++;
    }

Saludos :)

148
C# / Re:Problema teorico con Ref y Out ..
« en: Domingo 21 de Agosto de 2011, 00:54 »
Citar
me darias una definicion de Argumentos de los metodos?

O te confundiste o no entiendo tu pregunta.

Si buscas definicion de argumento, ya te dije que es sinonimo parametro, significan los mismo, solo que en algunos textos le llaman argumentos, y en otros parametros.

http://es.wikipedia.org/wiki/Argumento_%28inform%C3%A1tica%29

Si no es esa tu pregunta, explicate mejor.

149
C# / Re:Problema teorico con Ref y Out ..
« en: Sábado 20 de Agosto de 2011, 21:08 »
Hola whaitie.

Es un gusto ver que te esfuerzas por aprender, rara vez veo gente en los foros que realmente les interesa aprender, la mayoria solo les interesa resolver la tarea, o que les den todo hecho, sin aprender nada en el proceso.

Por el tipo de preguntas que haces, me parece que es la primera vez que aprendes un lenguaje de programacion, asi que te haria la siguiente recomendacion, de ser posible, trata de llevar un curso o conseguir un tutor "en persona", esto te beneficiara mucho, ya que algunos temas son muy extensos para tratar en solo unas lineas de mensaje, ademas si te surgen dudas al momento, te las podran responder mucho mas rapido que por mensajes.

Dicho eso, tratare de responderte de la mejor manera posible, citando parrafos de tu mensaje original, preparate para un mensaje largo :)

Citar
Ref y Out.

Segun entiendo , se usan para dar valores a variables , de otro valor de una variable Privada/Protegida, utilizando un metodo/constructor, o me equivoco ?

Si entendi bien tu pregunta, diria que si estas un poco equivocado. Para que comprendas mejor, debo explicarte un poco sobre parametros, y por que se utilizan.

En los inicios de la programacion, se utilizaban variables globales, o sea variables que eran validas en todo el programa.  Conforme los programas fueron creciendo en complejidad y tamaño, usar variables globales se volvio un problema, ya que al ser validas en todo el programa, debias definir variables con nombre unico y diferente, pero en un programa muy largo, facilmente podias cometer el error de utilizar una variable que ya tuvieras definida para otra cosa y modificar su valor por accidente, acarreando problemas.

Despues surgio la programacion por modulos, en donde ya podias definir variables locales, validas solamente en el modulo donde estaban definidas. Pero estaba el problema de poder utilizar los valores de esas variables fuera del modulo, o tambien el poder utilizar valores definidos en un modulo, en otro modulo, sin utilizar variables globales, es ahi que surgieron los parametros, que permiten precisamente el paso de valores de un modulo a otro sin necesidad de usar variables globales.

Tenemos 2 tipos de parametro, por valor y por referencia.

En los parametros por valor, se copia el valor de la variable. Util cuando necesitamos un valor que este fuera del modulo, y no vamos a modificarlo, o no queremos que el valor modificado salga del modulo.

En los parametros por referencia. se pasa una referencia (o apuntador) a la variable original que esta fuera del modulo. Util cuando vamos a modificar el valor de la variable y necesitamos que el valor modificado salga del modulo. A esta categoria pertenecen las variables ref y out en C#.

Para el caso de C# y programacion orientada a objetos, modulo = metodo, a partir de ahora utilizare el termino metodo :)

Asi que regresando a tu pregunta, ref y out no solo se utilizan para dar valores de propiedades private/protected, sino que en general se utilizan, como dije antes, cuando necesitamos modificar el parametro y deseamos utilizar el valor modificado fuera del metodo, y no, no solo se utiliza en los constructores, sino en cualquier metodo.

Citar
1) Color es un Constructor?

Si, Color() es un constructor, pero dado que al parecer te confundes con eso, tratare de explicartelo.

Un constructor es un tipo especial de metodo, que se utiliza para "construir", es decir, inicializar el objeto cuando es creado (de ahi el nombre de constructor). Es en el constructor donde deberas colocar todo el codigo necesario para inicializar y preparar el objeto, incluido asignar valores a variables private/protected que necesitas que tengan un valor predeterminado, y que no esten en blanco, como es el caso de tu ejemplo.

Para identificar el metodo constructor, siempre tendra el mismo nombre del objeto, en este caso el objeto se llama Color, su constructor sera Color(). Si el objeto se llamara Cliente, su constructor seria Cliente(). Los constructores pueden tener parametros, pero no pueden regresar valores, ni tampoco ser pueden ser declarados como void o private. Ejemplo:

Código: [Seleccionar]
        // Ejemplo de constructor con parametros
        public Color(int rojo, int verde, int azul)
        {
            this.red = rojo;
            this.green = verde;
            this.blue = azul;
        }
        // Modo incorrecto de definir un constructor
        // no puede ser private ni void
        private void Cambio(int rojo, int verde, int azul)
        {
            //this.red = rojo;
            //this.green = verde;
            //this.blue = azul;
        }

El metodo constructor es llamado automaticamente cuando se crea el objeto, no necesitas llamarlo explicitamente, de hecho, si tratas de llamarlo manualmente te dara error.

Si no creas un constructor explicitamente, el compilador crea un constructor vacio por defecto.

Citar
2) El metodo GetColors se utiliza para que los datos almazenados de las variables puedan seguir usandose en otros metodos de la clase?

No, en este caso el objetivo del Metodo GetColors es acceder a los valores de las variables fuera de la clase, por eso estan definitos como out (parametros por referencia, lee mi respuesta anterior). Cualquier variable definida dentro de la clase, puede ser utilizada en toda la clase, a menos que la variable halla sido definida dentro de un metodo, en cuyo caso es local al metodo y solo valida dentro del mismo. Lo mismo pasa si la variable es definida dentro de un bloque, esa variable es local al bloque y no es valida fuera de ese bloque. aun cuando ese bloque este dentro de un metodo.

Un ejemplo de lo que dije antes:
Código: [Seleccionar]
        public void Variables()
        {
            // Variable i es local al metodo, no accesible fuera de el
            int i = 0;
           
            // La variable j es local al bloque for, no accesible
            // fuera de este bloque
            for (int j = 0; j < 5; j++)
            {
                Console.WriteLine(j);
            }

            // Esta linea dara error, ya que j solo era valida
            // en el bloque for
            Console.WriteLine(j);
        }

Mas informacion sobre variables: http://es.wikipedia.org/wiki/Variable_%28programaci%C3%B3n%29

Citar
3)Ref es casi tecnicamente lo mismo que Out verdad?, pero cual seria su verdadero uso y cuando conviene más?.

Pareciera que son lo mismo, pero no es asi.

Ambas sirven cuando necesitamos regresar valores de un metodo, pero ref se utiliza cuando necesitamos asegurarnos que la variable que le pasamos al metodo tiene un valor ya que pensamos utilizar ese valor dentro del metodo, pero ademas vamos a modificar esa variable, y out se utiliza cuando no importa o no necesitamos que la variable tenga un valor, ya que dentro del metodo le vamos a asignar el valor. ¿Confundido? Tratare de explicar porque se da esto y un ejemplo de su utilizacion.

Todo este asunto viene de los lenguajes antecesores de C#, C y C++. En C/C++ se utilizan apuntadores para implementar el paso de parametros por referencia (lee la explicacion de parametros arriba), pero un error muy comun de programacion en estos lenguajes es utilizar punteros sin asignar, o punteros nulos. Esto puede ser grave ya que las variables si no las asignamos explicitamente por lo general contienen valores aleatorios, que nos pueden dar resultados incorrectos en el mejor de los casos e incluso "congelar" la maquina en el peor de los casos.

Viendo esta problematica es que en Java (y C#) se implemento ref y out, de esa forma en tiempo de compilacion estas diciendo que tipo de uso le vas a dar al parametro, y si necesitas o no que el parametro tenga un valor previo.

Un ejemplo para que veas la diferencia, lee los comentarios, prueba modificando ref y out como menciono en los comentarios, para que veas mas claramente el efecto de ref y out.

Código: [Seleccionar]
    class Cambio
    {
        public Cambio()
        {
        }

        public static void Intercambio(ref int valor1, ref int valor2)
        {
            int temp;
            temp = valor2;
            valor2 = valor1;
            valor1 = temp;
        }

        public static void Asignar(out int a, out int b)
        {
            a = 1;
            b = 2;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int var1, var2;
           
            // Si utilizas ref en lugar de out
            // te dara error de variable local no asignada
            // ya que no has asignado valores a
            // var1 y var2
            Cambio.Asignar(out var1, out var2);
           
            // Si utilizas out en lugar de ref
            // te dara error de uso del parametro
            // out sin asignar, puesto
            // que no le estas asignando valores
            // dentro del metodo a las variables
            Cambio.Intercambio(ref var1, ref var2);
        }

Citar
4)Esto es lo que dice el libro, y en color azul señalo lo que no entiendo:

Esto esta relacionano con tu pregunta anterior, lee la respuesta anterior.

Citar
el argumento no es una matriz ?

Creo que no entendi muy bien esta pregunta, si estas diciendo que argumento es sinonimo de matriz, no, no es asi argumento mas bien es sinonimo de parametro. Si te refieres a que la lista de argumentos (parametros) de GetColor son una matriz, tampoco es cierto, son valores individuales, no es ni una matriz ni un vector.

Espero que con esto halla aclarado un poco tus dudas.

Saludos y suerte :)

150
C# / Re:No entiendo bien lo que es COM
« en: Viernes 19 de Agosto de 2011, 02:42 »
COM = Component Object Model


Google y Wikipedia son tus amigos

Ingles:
http://en.wikipedia.org/wiki/Component_Object_Model

Español:

http://es.wikipedia.org/wiki/Component_Object_Model

Páginas: 1 ... 4 5 [6] 7 8 ... 32