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

#421
yo aun me lio con algunas cosas de apuntadores, pero a ver si consigo explicarme bien:

primero, en vez de declarar un puntero como int *a intenta declararlo como int* a. parece una tonteria, y para el compilador es lo mismo, pero de la segunda manera se ve claramente que a es una variable de tipo puntero a int. en cambio de la primera se puede pensar que *a es un puntero a int.

segundo, imaginate a la variable tipo puntero a int como una variable que almacena 2 datos, una direccion de memoria a la que apunta y el valor que hay en esa direccion. si haces un printf("%d", a), el resultado sera un numero largo que indica la direccion de memoria a la que apunta. en cambio, *a indica el valor almacenado en esa direccion de memoria.

las diferencias entre, por ejemplo, una variable int a y una variable int* b son que:
1. el valor almacenado se saca con: a y con *b
2. la direccion de memoria donde esta almacenada la propia variable se saca con: &a y &b
3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con: b

quizas te preguntes entonces que para que sirven los punteros ya que aparentemente hacen lo mismo pero de una manera distinta y mas complicada. pues el principal uso de los punteros es poder gestionar la memoria de manera dinamica (poder asignar y liberar memoria despues de haber compilado). algo que, por ejemplo, te permitiria hacer un programa que preguntase al usuario cuantos datos quiere ingresar y entonces tu podrias usar la memoria justa sin riesgo a usar demasiada ni a quedarte corto.

te dejo un pequeño codigo tipico de aprender apuntadores (da algunos warnings al compilar pero corre perfectamente):

#include <stdio.h>

int main()
{
int a=12, *b;
printf("\nPARA a:\ndireccion propia: &a= %d\nvalor de a: a= %d\n\n", &a, a);
b=&a; //hacemos que el puntero b apunte a la variable a
printf("PARA b:\napunta a la direccion: b= %d\nel valor almacenado ahi es: *b= %d\ndireccion propia: &b= %d\n\n", b, *b, &b);
return 0;
}


su salida:

CitarPARA a:
direccion propia: &a= 1606416780
valor de a: a= 12

PARA b:
apunta a la direccion: b= 1606416780
el valor almacenado ahi es: *b= 12
direccion propia: &b= 1606416768

y ultimo, cuando hagas alguna funcion con parametros tienes que preguntarte si modificaras el valor de algun parametro. si no te interesa hacerlo, puedes pasar el parametro como una "variable normal" y usarla como tal. si necesitas modificar el valor de la variable, entonces le tienes que pasar a la funcion la direccion de memoria donde esta almacenada la variable, para que asi digamos que pueda escribir sobre ella. y para pasar la direccion de memoria entonces tienes que usar punteros.

ultimo codigo de ejemplo:

#include <stdio.h>

void funcion(int n, int* p);

int main() {
int a=1, b=5;
printf("VARIABLES ANTES DE LA FUNCION:\na= %d\nb= %d\n", a, b);
funcion(a, &b);
printf("VARIABLES DESPUES DE LA FUNCION:\na= %d\nb= %d\n", a, b);
return 0;
}

void funcion(int n, int* p) {
// n es una variable de tipo int "normal". n contiene el valor de la variable a. PASO POR VALOR (no se puede modificar)
// p es una variable de tipo puntero a int. p contiende la direccion de memoria de b. PASO POR REFERENCIA (se puede modificar)
printf("VALORES EN LA FUNCION:\nn= %d\n*p= %d\n", n, *p);
        // intentamos modificar las variables
(*p)=3;
n=2;
}


y su salida, donde se ve que 1 variable se ha modificado y la otra no:

Citar
VARIABLES ANTES DE LA FUNCION:
a= 1
b= 5
VALORES EN LA FUNCION:
n= 1
*p= 5
VARIABLES DESPUES DE LA FUNCION:
a= 1
b= 3

espero que sirva de ayuda... si tienes alguna duda no tienes mas que consultar. un saludo!
#422
Programación C/C++ / Re: palindromo
13 Julio 2012, 19:41 PM
estoy de acuerdo con durasno, veo mas sencillo recorrer el texto comparando 2 indices que empiezan al principio y al final, y se recorren hasta llegar a la mitad de la cadena. dejo aqui mi codigo, lo he probado y funciona:

#include <stdio.h>
#include <string.h>

#define SIZE 256

int main(int argc, char** argv)
{
char buffer[SIZE];
int i, j, cond=1;

printf("Introduzca la frase: ");
fgets(buffer, SIZE-1, stdin);
buffer[strlen(buffer)-1]='\0';

//eliminar espacios en blanco
for (i=0; i<strlen(buffer)-1; i++) {
if (buffer[i] == ' ') {
for (j=i; j<strlen(buffer)-1; j++) {
buffer[j]=buffer[j+1];
}
buffer[strlen(buffer)-1]='\0';
}
}
printf("La frase sin espacios es: %s\n", buffer);

//comprobar si es palindromo
for (i=0; i<strlen(buffer)/2 && cond==1; i++) {
if (buffer[i] != buffer[strlen(buffer)-i-1]) {
cond=0;
}
}

if (cond == 1) {
printf("Es palindromo.\n");
} else {
printf("No es palindromo.\n");
}

return 0;
}
#423
me gustaria a mi tambien compartir el codigo que he hecho, seguramente para nada sea el mas eficiente pero me gustaria saber como podria optimizarlo. genera la combinacion de AAAAA00000 a ZZZZZ99999 (no en el orden tipico).

#include <stdio.h>

#define NUM 5 //numero de letras

void cambiar_letras(char* letras, int* pos);

int main(int argc, char** argv)
{
FILE *fd;
char letras[]="AAAAA";
int posLet=0, i;

fd=fopen("diccionario.txt", "w");

while (posLet < NUM)
{
for (i=0; i<100000; i++)
fprintf(fd, "%s%.5d\n", letras, i);

cambiar_letras(letras, &posLet);
}

fclose(fd);
return 0;
}

void cambiar_letras(char* letras, int* pos)
{
int i;

for (i=0; i<=*pos && *pos<=NUM; i++)
{
if (letras[i] < 'Z') {
(letras[i])++;
break;
} else {
letras[i]='A';
if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
(*pos)++;
}
}
}


pd. gracias DickGumshoe por el especificador de formato %.5d en los enteros, no tenia ni idea de que podia representarse el 1 como 00001.
#424
una pregunta asi por curiosidad... cuanto os dura el programa ejecutandose y cuanto os ocupa el archivo generado?

lo pregunto porque yo para hacer esta combinacion mas corta "AAAA000 hasta ZZZZ9999" llevaba unos 20 minutos o mas y 35GB de archivo cuando le he dado a cancelar. no se si me he liado haciendo el programa o que...

gracias!
#425
Citarpero todavia la operacion que me pasas no resuelve la problematica, a ver si sumas un vector todo sale bien, pero si intentas simular la logistica de una calculadora se te rompe la caveza xDDD !!

explicame eso de la logistica de una calculadora porque no le veo la gracia.

si como has dicho he entendido el problema que tienes, entonces lo que te he dicho SI lo resuelve. lo que no hare sera darte el codigo, llevo 1 hora y media con esto y por la actitud que tienes creo que ya ha sido suficiente.

relee la explicacion que te he hecho arriba y una vez lo entiendas el codigo lo sacaras en 5 minutos. si tambien operas con numeros reales con decimales entonces tendras que cambiar algo, pero deberias poder sacarlo si, repito una vez mas, entiendes lo que te he explicado.

un saludo y suerte
#426
quizas soy yo el que esta un poco espeso hoy pero es que si no es lo que te he dicho antes no acabo de entenderlo. podrias poner un ejemplo claro del problema?

con el codigo que has puesto, si un usuario pica los botones: 1, 5, 2, +, 1, 4

entonces tu tendrias esto en ese momento: vector1=[1,5,2], vector2=[1,4]

hasta aqui si? si no es asi, dime como es porque entonces no entiendo lo que pides.

si hasta aqui es asi, entonces tienes que aplicar lo que te he dicho antes:

numero1= 1*10^2 + 5*10^1 + 2*10^0 = 100 + 50 + 2 = 152
numero2= 1*10^1 + 4*10^0 = 10 + 4 = 14
suma=numero1+numero2

la funcion que te pase del vector al numero en decimal se implementa con un sencillo for usando las funciones exponencial tuya o de la biblioteca math y luego otra funcion que te diga el numero de posiciones que tiene un vector dado.
#427
ah vale ahora he entendido y antes se me cruzo con lo de la variable xd

para lo primero, pues si yo usaria lo del NoIP, y una vez establezcas conexion siempre puedes editar tu programa (por si te cambias el nombre del NoIP) y pasarselo de nuevo borrando el anterior.

lo de cambiar el valor permanentemente de un programa pues ni idea de como hacerlo sin archivos de configuracion... aunque bueno siempre puedes usar un archivo oculto para ello. el 90% de la gente normal no sabe que existen archivos que no se ven en el explorador de carpetas.

me quedo atento a ver si alguien sabe modificar un valor de un programa permanentemente. un saludo!
#428
has leido mi respuesta? porque yo creo que no.
#429
imagina que tu tienes el numero en base decimal 123 escrito como un vector de la siguiente manera: vector=[1,2,3]

si quieres pasar del vector a un numero normal, lo que tienes que hacer es multiplicar cada termino del vector por 10 (ya que esta en base decimal) elevado a la posicion que ocupa ese termino en el vector.

en este caso: numero= 1*10^2 + 2*10^1 + 3*10^0 = 100+20+3 = 123

no se explicarme mejor, pero es el mismo sistema que se usa para pasar un numero en base binaria a uno decimal. en este caso, al ser base binaria, en vez de 10 se usa el 2 eleveado a la posicion que ocupe el digito. por ejemplo:

1010 en binario: 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 8+2 = 10 en decimal

edito: solo para decir que es que directamente el sistema numerico es asi. en un numero cualquiera, por ejemplo el 123, el 3 ocupa la posicion de las unidades (del 0 al 9), el 2 el de las decenas (del 0*10 al 9*10), y el 1 el de las centenas (del 0*10^2 al 9*10^2). asi que es esto, pero aplicado a un numero mayor como es tu caso. espero que me haya explicado, un saludo
#430
una pregunta... para que quieres la ip del equipo donde se ejecute?

hasta donde tengo entendido, en un troyano de conexion inversa la victima se conecta al atacante. puedes hacer un cliente que se ejecute y busque continuamente cada x tiempo a un server. en el cliente, declaras una variable con la ip tuya (usando algun servicio como NoIP o similar) y digo variable para luego poder modificarla si lo deseas desde tu ordenador.

tu ejectuas el server en tu ordenador, y conforme se vayan infectando se irian conectando a ti.

si me he saltado algo o me he inventado alguna cosa hazmelo saber, pero creo haber entendido que es esto lo que buscabas y no creo que hagan falta archivos de texto auxiliares ni nada asi.

un saludo!