Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - eferion

#881
Código (cpp) [Seleccionar]
Prueba* pPrueba( );

Esta línea está mal.

Los objetos se pueden crear, bien de forma estática:

Código (cpp) [Seleccionar]

Prueba pPrueba( );


Bien de forma dinámica:

Código (cpp) [Seleccionar]

Prueba* pPrueba = new Prueba( );


Pero lo que tu has puesto es una forma híbrida que no funciona.

Por cierto, si creas un objeto con new... recuerda que has de poner un delete cuando dejes de usarlo... si no vas a dejar tu programa plagado de lagunas de memoria.

Código (cpp) [Seleccionar]

int main() {
Prueba* pPrueba = new Prueba( );

pPrueba()->saludo();

        delete pPrueba( );

system("pause>nul");

return 0;
}
#882
Cita de: edr89 en  4 Octubre 2013, 19:04 PM
Como debo hacer para poder usar el operador flecha? no sirve con estructuras?

tendria que declarar:
typedef fila *nodo NODO

Esa línea no tiene ningún sentido.

Si tu tienes:


struct
{
   st_num *head;
   st_num *last;
}fila;


No puedes crear nuevas instancias de la estructura, ya que la estructura no tiene nombre. Para poder crear instancias nuevas tienes que darle un nombre a la estructura:


struct fila
{
   st_num *head;
   st_num *last;
};


Entonces ahora ya si puedes hacer:


typedef struct fila NODO;


Aunque si lo que quieres es definir un tipo para el puntero tendría que ser:

typedef struct fila* NODO;

Con esto usar los nodos es tan sencillo como:



NODO nodo; // has declarado una variable, llamada nodo, que es un puntero a una estructura de tipo fila.

nodo->head = NULL;
nodo->last = NULL;


Tu piensa que el operador flecha sirve para acceder al contenido de los punteros... si no tienes punteros no tiene sentido el operador flecha. Con esto mismo también te digo que a veces es mejor evitar el uso de memoria dinámica...
#883
No desesperes... son cosas que pasan.
#884
sizeof no funciona por arte de magia. sizeof no es una función normal de c... es más como una directiva de precompilador.

sizeof únicamente puede calcular el tamaño de arrays si éstos se le pasan completos, es decir:


char array[20];
char *array2[] = &array;

int size1 = sizeof( array ); // size1 = 20
int size2 = sizeof( array2 ); // size2 = 4... es un puntero
int size3 = sizeof( *array2 ); // warning, no se puede calcular


Si necesitas conocer el tamaño del array, o bien lo tienes que pasar como parámetro, o bien, en el caso de cadenas de caracteres, terminas la cadena con '\0' y lo que haces es buscar la posición de ese carácter para determinar su tamaño... por ejemplo con strlen.

Si no quieres que se sobreeescriba el fichero, utiliza un tercer fichero para descomprimir... pide el nombre o bien ponle un prefijo / sufijo al archivo que introduzca el usuario. Entonces, para comprimir pasas del fichero base al que te facilita el usuario, como hasta ahora, y para descomprimir pasas del facilitado por el usuario a este nuevo que te digo.

Para comprobar el funcionamiento de tu programa con archivos más grandes prueba a crearte tus propios archivos, no tengas miedo... además es la mejor forma de comprobar si tu programa funciona correctamente en todas las circunstancias.

PD.: si pones un de, para, con, desde o al al principio o al final de una línea no te va a funcionar el programa... deberías mirar eso.
#885
A ver, tu tienes una estructura o clase cualquiera:


struct estructura
{
  void (*FuncPtr)();
};


Y por otro lado tienes una función que devuelve un puntero a una estructura de este tipo:


struct structura* Funcion( );


Si quieres acceder a algún miembro de la estructura, dado que es puntero tienes que utilizar el operador '->'. Si devolviese la estructura por valor en vez de por referencia tendrías que utilizar el operador '.' para acceder a los miembros de la estructura.

Si, en concreto, quieres acceder al puntero a función almacenado en la estructura, dicho acceso puede escribirse así:


// primera forma:
Funcion( )->FuncPtr( );

// segunda forma:
struct estructura* p_estructura = Funcion( );
p_estructura->FuncPtr( );


Pero vamos, que antes de correr tanto ponte a aprender la base, que estas cosas ya irán llegando solas.

Un saludo.
#886
El código es un poco extraño y difícil de seguir.

Podrías mejorar su legibilidad si te creas un vector con el valor de los billetes y monedas...


int[15] monedas = { 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 }; // Billetes y monedas de Euro.


Con un vector así, calcular las vueltas resulta en un algoritmo sencillo de manejar y seguir:


int i;
for ( i=0; i<15; ++i )
{
 int qt = diff / monedas[ i ];
 if ( qt != 0 ) // Solo hacemos calculos si de la moneda actual hay que devolver algo
 {
   diff -=  qt * monedas[ i ];
   printf( "valor moneda: %f, cantidad: %d\n", (float)monedas[ i ] / 100.0, qt );
 }
}


Pero claro, si te tienes que ceñir a ese pseudocódigo no hay margen de maniobra.




Referente a tus errores, tienes 2:

* El del diff que dices, tiene toda la pinta de que se te ha colado un caracter no imprimible y es lo que está dando el error. Prueba a borrar la linea y reescribirla... a mi me ha compilado.

* Las comprobaciones de 50000, 5000, ... van con doble igual '==' con solo un igual estás haciendo una asignación.
#887
Sería de ayuda entender lo que quieres conseguir y qué es lo que no funciona como esperas.
#888
Programación C/C++ / Re: problema con archivos
2 Octubre 2013, 21:13 PM
Tienes varios fallos:

* Cadena no puede tener la longitud del nombre buscado más uno. Te pongo un ejemplo, si buscas ANGEL y el nombre que te toca leer es ROBERTO... pues ROBERTO no va a entrar en 6 caracteres, necesita 8. Lo ideal es que cadena tenga una longitud lo suficentemente larga como para aceptar cualquier nombre. 100 o 200 caracteres suelen ser suficientes.

* El memset no te sirve para nada, ya terminas la cadena con el '\0', luego cadena siempre va a contener un string válido.

* La variable tam puedes eliminarla sin problemas, no la necesitas para nada.

* TAM está definida a 10, esto te limita el nombre a buscar a 9 caracteres... igual que con el primer punto, te puedes permitir el lujo de ampliarlo un poco.

* La línea del strchr no tiene mucha lógica... cuando tu lees con fgets ya te está finalizando la cadena con '\0'

Y así a bote pronto no veo nada más. Corrige eso a ver si te funciona mejor.

Un saludo.
#889
Programación C/C++ / Re: problema con archivos
2 Octubre 2013, 20:04 PM

char cadena[10];
cadena[ 0 ] = 'A';
printf( "%s", cadena );


Puedes ejecutar este código unas 200 veces que las 200 va a fallar el programa, bien con una violación de segmento, bien mostrando un montón de ***** en pantalla.

Cuando el programa reserva memoria ( de forma automática o tú con malloc ), ésta no se inicializa de forma automática... tiene basura, que no es otra cosa que información aleatoria ( si esa memoria no ha sido utilizada desde que se arrancó el equipo ) u obsoleta ( si esa memoria ha sido utilizada por otro programa que la ha modificado para sus usos y después la ha liberado ). En cualquier caso no es información útil para ti.

Si en el ejemplo de arriba tu quieres que el printf saque por pantalla símplemente la A tienes que asegurarte de finalizar la cadena. En c las cadenas de texto se finalizan con un caracter nulo, luego la forma correcta de actuar sería:


char cadena[10];
cadena[ 0 ] = 'A';
cadena[ 1 ] = '\0';
printf( "%s", cadena );


Ahora, el 100% de las ejecuciones van a sacar una única A por pantalla.
#890
Los archivos de imagen se basan en un estándar. Dicho estándar rige las normas de codificación. Entre esas normas se detallan los posibles saltos de línea.

Tu piensa que estos estándares van ligados al formato, no al sistema operativo, lo que permite que la imagen se pueda abrir y guardar sin problemas en cualquier sistema operativo.