elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


  Mostrar Mensajes
Páginas: 1 ... 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 ... 161
581  Programación / Programación C/C++ / Re: Buenos días,tengo muchas dudas con un ejercicio de caracteres. en: 26 Febrero 2018, 11:26 am
Piensa en una lista de caracteres aleatorios y no conoces su orden en una cinta de papel y esta cinta de papel pasa por debajo de un hoja con una ventanita que solo deja ver un carácter. Tienes una lápiz para escribir los resultados.
¿Cómo procederías?

Código:
    |----------------| < hoja opaca
    |       _ventana |
====|===???|A|????===|==== < cinta con caracteres
    |       -        |
    |----------------|
Los ? son los caracteres que quedan ocultos y solo se mostrarán al pasar por la ventana
582  Programación / Programación C/C++ / Re: ¿Alguien podria explicarme como funciona el puntero tipo función? en: 25 Febrero 2018, 19:30 pm
Para entender el tema de los punteros primero hay que saber qué es un puntero en su sentido más básico.
Un puntero es una variable de tamaño de la palabra del procesador (size_t, que suele ser un typedef de unsigned long), 64bits o 32bits según el procesador.

El tipo de dato del puntero (int*, char*, double*, etc) sirve para que sumando o restando unidades se tome una dirección relativa a ese puntero para conseguir el siguiente dato. Dicho con ejemplo:
Un char es de tamaño de 1 byte. Un int es de tamaño de 4 bytes.

· Supongamos que char* c está en la posición 100.
  c+1 regresará 101, pues internamente C hara 100 + (1 * 1).

· Supongamos que int* i está en la posición 200.
  i+1 regresará 204, pues internamente C hará 200 + (1 * 4).


A lo que íbamos.
El código también se aloja en la memoria del ordenador y el nombre de las funciones indican su punto de entrada, eso es dónde empieza su porción de código.
De igual forma las funciones tienen un tamaño y esto se lo da tanto su tipo de dato devuelto como los tipos de datos que hay en sus argumentos (a todo esto se le llama firma y por esta razón se deben usar prototipos si una función está definida después de que sea llamada; de aquí los archivos de cabecera, etc. C debe conocer el tamaño de la función para alojarla en la memoria). Y esta es la razón por la que pueden existir punteros a funciones e incluso arrays de funciones.

Al igual que a un puntero a int se de declara como
int *i;

Un puntero a función debe declararse con el mismo tipo que la función a la que va a apuntar.
Supongamos que tenemos la siguiente función:
Código:
int suma(int n1, int n2) {
    return n1 + n2;
}
El puntero debe retornar un int y tener dos argumentos de tipo int. La declaración sería entonces:
Código:
int (*pfun)(int, int)

Como puede verse es declarar una función normal pero con la particularidad del paréntesis en el nombre (*pfun). Esto es necesario porque si no hubiera estos parentesis sería lo siguiente:
Código:
int *pfun(int, int)

Que reubicando el asterisco:
Código:
int* pfun(int, int)

Eso es: sería una función llamada pfun que devolvería un puntero a entero (int*) y tendría dos argumentos enteros (int); para romper el tipo de dato e informar que se trata de un puntero se usa el paréntesis (*pfun).
Para que lo veas mejor:
Si para declarar un puntero haces lo siguiente:
Código:
int *i
Vemos que int es el tipo de dato que será el puntero e
*i (nótese que al nombre le antecede el asterisco) indica de que se trata de un puntero.

Así en
Código:
int (*pfun)(int, int)

Sabemos de que se trata de un puntero (*pfun), los parentesis, como ya se ha dicho, son para que el asterisco forme parte del nombre, que devuelve un int y tiene dos argumentos tipo int.

Ahora como el nombre de una función representa su punto de entrada, al igual que un array, como ya te dije en otro post, no hace falta el & para conseguir su dirección.

Así tenemos que:
Código:
#include<stdio.h>

int suma(int n1, int n2) {
    return n1+n2;
}

int main(){
    int (*pfun)(int, int);
    pfun = suma;

    printf("2 + 3 = %d", pfun(2, 3));
}
583  Programación / Programación C/C++ / Re: Tengo algunas dudas sobre punteros en C/C++ y otras cosillas. en: 25 Febrero 2018, 02:33 am
Te recomiendo esto, donde además de explicar los punteros también explica cómo hace uso de la memoria C: http://www2.elo.utfsm.cl/~lsb/elo320/clases/c3.pdf
584  Programación / Programación C/C++ / Re: Tengo algunas dudas sobre punteros en C/C++ y otras cosillas. en: 23 Febrero 2018, 23:36 pm
Muy buenas las explicaciones de los compañeros del foro, pero voy a añadir mi granito de arena:

Te has equivocado al decir:
Citar
*puntero = &variable; //Significaria que el puntero contiene el numero de la direccion en memoria de esa variable.

Eso solo serviría en un caso que, por ahora no deberías entrar, que son punteros a punteros. Para ti esa línea debe ser:
Código:
puntero = &variable; //Significaria que el puntero contiene el numero de la direccion en memoria de esa variable.

Nótese la falta del asterisco.

Ahora varias cosas:
El operador & se usa para conseguir la dirección de variables y es lo utilizado para pasarle la dirección de una variable a un puntero.

Como bien sabes un puntero es un tipo de dato, como int, double, char, etc, y por tanto las funciones pueden devolver punteros (direcciones de memoria). Una de estas funciones es strtok, pero también hay otras como strstr, strchr, strcpy, etc. Cuando las veas imagina que a tu variable puntero le acabas de pasar la dirección de comienzo de una cadena.

Por otra parte las cadenas para tí deben ser un puntero a su primer carácter, de hecho C las trata así. scanf, por ejemplo, espera punteros a partir del segundo argumento, por ejemplo cuando consigues un número:
Código:
scanf("%i", &numero);
puedes ver que a scanf se le pasa la dirección de la variable numero así puede meter dentro de esa variable el número adquirido. Pero como ya he dicho una cadena es un puntero y en scanf para conseguir una cadena se hace así:
Código:
scanf("%s", cadena);
pues cadena ya es un puntero declarado como char *cadena.
De igual forma en printf cuando se usa %s también espera una cadena, eso es un puntero a char* y por tanto no hay que dereferenciar dicho puntero, ya lo hace internamente la función.

Es cierto que te va a costar dominar los punteros, pero cuando lo hagas te preguntarás cómo los otros lenguajes de programación pueden vivir sin estos tipos de datos tan versátiles.
585  Programación / Programación C/C++ / Re: Duda con el codigo en: 23 Febrero 2018, 23:12 pm
Aún puedes simplificar mucho más:
Para todas las operaciones, en vez de hacer
Código
  1. int operating::suma()
  2. {
  3.   int suma;
  4.   suma=num1+num2;
  5.   return suma;
  6. }

puedes hacer
Código
  1. int operating::suma()
  2. {
  3.   return num1+num2;
  4. }

Con lo que en la clase podrías eliminar rsum, rrest, producto y div.

Hasta podrías hacer que a leenum se le pasen como parámetros dos números y los  guarde en num1 y num2 dejando el trabajo de pedir números al llamante y ser operating una clase puramente matemática, sin mensajes por pantalla de ningún tipo.
586  Programación / Programación C/C++ / Re: Singleton, pero sin clases. en: 19 Febrero 2018, 17:43 pm
Usa un struct anónimo así:
Código
  1. struct {
  2.    // Datos del struct
  3. } mi_dato_unico;

De esta forma solo existirá esa única variable de ese tipo de estructura y no se podrán generar más al no darse un nombre a ese tipo de dato. Si bien en la zona de definición de variables pueden generarse tantas como se deseen, pero solo en ese momento.

Lo siento, comparto, creo que te entendí mal en un principio. Supongo que trabajas con Windows. Aquí tienes una buena página, solo deberás adaptarla un poco.
De igual forma trabaja con clases, así que no será leído que buscas, supongo.
https://support.microsoft.com/es-es/help/307395/how-to-use-visual-c-to-close-another-application
587  Programación / Programación C/C++ / Re: URGENTE AYUDA!! en: 19 Febrero 2018, 07:40 am
Digo que pongas una captura de pantalla del programa fallando o hagas un copia-pega del terminal. Para saber qué ocurre.
588  Programación / Programación C/C++ / Re: URGENTE AYUDA!! en: 19 Febrero 2018, 01:26 am
Pon un ejemplos malo y qué es lo que esperas.
589  Programación / Programación C/C++ / Re: No encuentro el error en este codigo para ordenar en: 17 Febrero 2018, 22:40 pm
Te cambio la función Sort por esta, bastante más sencilla:
Código
  1. void sort(item *a, int n) {
  2.    int i, j;
  3.    for(i=0; i<n-1; ++i) {
  4.        for(j=i+1; j<n; ++j) {
  5.            if(a[i].key > a[j].key) {
  6.                item t = a[i];
  7.                a[i] = a[j];
  8.                a[j] = t;
  9.            }
  10.        }
  11.    }
  12. }
590  Programación / Programación C/C++ / Re: No encuentro el error en este codigo para ordenar en: 17 Febrero 2018, 19:06 pm
A simple vista he visto que:
Línea 20 has puesto & cuando el AND lógico es &&.
Páginas: 1 ... 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines