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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Temas
Páginas: 1 2 3 [4] 5 6
31  Sistemas Operativos / Windows / (Consulta) Archivo en el mismo directorio, con el mismo nombre en: 14 Agosto 2016, 14:00 pm
Hola, muy buenas. Por razones que no vienen a cuento, puse que se vieran todos los archivos ocultos del sistema de Windows 8.1. Cuando hice esto, en el escritorio aparecieron varios archivos, pero ya me lo esperaba. Lo que no me esperaba es que dos de esos dos archivos tuvieran el mismo nombre, pero con tamaños diferentes. Entonces, la duda que se me presenta es, desde la consola, ¿cómo es posible referirse a uno de esos dos archivos en concreto?. Captura de pantalla de los dos archivos:



Sé que es una duda un poco tonta, pero tengo la curiosidad. Gracias de antemano
32  Programación / Programación C/C++ / [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila? en: 10 Agosto 2016, 15:30 pm
Hola, muy buenas. La duda que tengo viene de que yo creía que una cadena en C++ (con std::string) se almacenaba en el heap (en el montón), pero con el código que voy a mostrar ahora parece que se almacena en la pila. Por eso pregunto, ¿std::string guarda la cadena en el heap o en la pila?

Código por el que pienso que una cadena se almacena en la pila
Código
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. int main() {
  6. std::string cadena = "Hola";
  7. const char *cadena_c = (const char *)(addressof(cadena));
  8. unsigned int i = 0;
  9.  
  10. std::cout << std::hex;
  11. for(i = 0; i < sizeof(cadena); i++)
  12. std::cout << (unsigned int)cadena_c[i] << " - " << cadena_c[i] << std::endl;
  13.  
  14. return 0;
  15. }

Esta es la salida que obtengo con MinGW-w64 (resultado similar con g++ de Ubuntu):
Código:
10 - ►
fffffffe - ■
23 - #
0 -
0 -
0 -
0 -
0 -
4 - ♦
0 -
0 -
0 -
0 -
0 -
0 -
0 -
48 - H
6f - o
6c - l
61 - a
0 -
ffffffff -  
ffffffff -  
ffffffff -  
fffffff5 - §
18 - ↑
40 - @
0 -
0 -
0 -
0 -
0 -

Como ven, se ve claramente que está en la pila (al menos yo lo veo así, quizás me equivoque).

Si se almacena en la pila, es raro porque según la página de cplusplus, incluso el constructor lanza una excepción si falla a la hora de asignar memoria. Que yo sepa, el stack ya lo tenemos asignado...

Código:
A bad_alloc exception is thrown if the function fails when attempting to allocate storage.

Espero que me puedan aclarar la duda :D Muchas gracias de antemano
33  Programación / Programación C/C++ / [C++] Mini aporte, solución para la mayoría de problemas con la entrada de datos en: 5 Agosto 2016, 02:29 am
Hola, muy buenas. Hoy quería poner una solución que quizás no se haya tenido en cuenta. Por ejemplo, es una solución para los problemas como: ¿por qué a veces cuando leo datos de la consola se salta alguna toma de datos? Bueno, la respuesta a eso es que probablemente al introducir datos en algún paso anterior, se han introducido datos de más y esos datos están esperando a salir, por lo que en la siguiente toma de datos, se toman datos del paso anterior.

Bueno, entonces, la solución que he descubierto (yo no la conocía) es usar el método std::istream::sync. Lo que hace este método es sincronizar el búfer interno en el que se almacenan esos datos de pasos anteriores con la toma de datos actual. Entonces, lo que habría que hacer es colocar ese método antes de cualquier toma de datos:

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4. // Aquí llenaremos el búfer de datos innecesarios para demostrar el uso de std::cin.sync
  5. std::cout << "Introduzca datos: ";
  6. std::cin.get();
  7.  
  8. // ... Código
  9.  
  10. std::cout << "Introduzca datos de nuevo: ";
  11. std::cin.sync();
  12. // Pedimos un carácter y lo imprimimos:
  13. std::cout << (char)std::cin.get();
  14.  
  15. return 0;
  16. }

Este código tendría la siguiente salida (en este ejemplo):
Código:
Introduzca datos: aaaaaaaaaaaaaaaaa
Introduzca datos de nuevo: r
r

Como ven, a pesar de haber llenado el búfer con el carácter 'a', se ha impreso el último carácter leído. Eso demuestra que funciona. Lo que no me queda del todo claro es cómo funciona este método, así que quizás sea ineficiente o algo por el estilo.

Sabiendo esto, ¿alguien sabe si usar todo el rato std::istream::sync tiene algún inconveniente? Gracias!
34  Programación / Programación C/C++ / (Consulta) Sobre la sobrecarga del operador & en: 31 Julio 2016, 02:10 am
Hola, muy buenas. Estoy mirando un poco sobre C++, aunque esté centrado en C, por diversión, cuando de repente me fijé en que se podría sobrecargar el operador de & (operador para sacar la dirección de una variable/objeto). Entonces, la duda es, si una clase tiene sobrecargada el operador &, ¿cómo puedo sacar la dirección de esa clase? La única manera que se me ocurre es hacer un método que retorne 'this', pero debería haber otra manera, ¿no?

Código de ejemplo:
Código
  1. #include <iostream>
  2.  
  3. class Foo {
  4. public:
  5. int operator &();
  6. };
  7.  
  8. int main() {
  9. Foo foo;
  10.  
  11. std::cout << &foo << std::endl;
  12.  
  13. return 0;
  14. }
  15.  
  16. int Foo::operator &() {
  17. return 5;
  18. }

La salida, efectivamente será:
Código:
5

Muchas gracias
35  Programación / Programación C/C++ / (Consulta) Pasando a las funciones fscanf argumentos nulos en: 29 Julio 2016, 16:55 pm
Hola, me preguntaba si se puede pasar argumentos nulos a las funciones fscanf para que se ignore tal argumento.

Código de ejemplo donde se ilustra como ignorar una línea. Solo funcionaría si se pueden pasar argumentos nulos:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.        fscanf(stdin, "%s[^'\n']", NULL);
  5.        fprintf(stdout, "Linea ignorada");
  6.  
  7.        return 0;
  8. }

Esto lo he probado bajo Linux (Debian) y me ha funconado sin que se produzcan errores. Eso si, el compilador me ha advertido. Lo que no sé si es estándar o me ha funcionado de casualidad.

P.D.: En el caso que esto no funcione como debiera, ¿hay alguna forma de que fscanf ignore lo que yo quiera?

Muchas gracias
36  Programación / Programación C/C++ / (Consulta) Punteros a punteros en C en: 19 Julio 2016, 11:18 am
Hola, muy buenas. Ante todo gracias por pasarlos, y por leer mi duda. El problema que tengo es con el siguiente código:

Código
  1. void funcion(const char * const * cadenas) {
  2. cadenas = 0xFFFFFFFF;
  3. }

Si yo compilo este código, no me dará un error como tal (simplemente una advertencia). Lo que me resulta raro es que si este código compila, significa que el último puntero es el que está tomando prioridad, porque el const opera sobre lo que tiene a su izquierda (a no ser que esté a la izquierda del todo, que en cuyo caso, opera sobre lo que tiene a la derecha). Es decir:

Código
  1. void funcion(const char * const * cadenas)
  2.               ^

Este const opera sobre el char

Código
  1. void funcion(const char * const * cadenas)
  2.                        ^   ^

Este const opera sobre el puntero señalado

Entones de esto deducimos que el único puntero no constante es el último. Al poder modificar en la función el valor del puntero dado, eso quiere decir que el último puntero es el que está tomando prioridad, mientras que debería tomar prioridad el primer puntero, es decir, este:

Código
  1. void funcion(const char * const * cadenas)
  2.                        ^

La duda final podría ser: por lo visto no entiendo/sé muy bien las reglas de prioridad, porque yo creía que al ser el mismo operador (*), tenía prioridad el de más a la izquierda, pero según lo expuesto, y en este caso, tiene más prioridad el de más a la derecha...
37  Programación / Programación C/C++ / (Consulta) fprintf imprime carácter de fin de archivo (-1) en: 2 Julio 2016, 08:43 am
Hola, muy buenas. No estoy seguro de por qué pasa el problema, así que os vengo a preguntar. El caso es que vi una pregunta en este foro sobre C y quise crear un código para ver si yo sería capaz de hacerlo (tengo que hacer ejercicios xD). El caso es que el programa parece que realiza su cometido salvo por un aspecto: al final, al imprimir el resultado, a parte de imprimirse el resultado, se imprime un carácter de fin de archivo (0xFF o -1). Código:

Código
  1. #include <string.h>
  2. #include <limits.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5.  
  6. void get_longest_prefix(char dest[], char *strings[], unsigned int num_strings);
  7.  
  8. int main() {
  9. char *strings[3][2] = {{"Planeta", "Platano"}, {"planetoide", "Platino"}, {"planetario", "Placenta"}};
  10. char result[16];
  11.  
  12. get_longest_prefix(result, (char **)strings, sizeof(strings)/sizeof(char *));
  13.  
  14. /*unsigned int i;
  15. for(i = 0; i < 16; i++)
  16. fprintf(stdout, "%u\n", result[i]);*/
  17.  
  18. fprintf(stdout, "Longest common prefix: %s", result);
  19.  
  20. fgetc(stdin);
  21. return 0;
  22. }
  23.  
  24. void get_longest_prefix(char dest[], char *strings[], unsigned int num_strings) {
  25. // No pongo el contenido de la función para no spoilear al que preguntó sobre  el ejercicio xD
  26. }

Salida:
Código:
Longest common prefix: pla _
NOTA: El guión simboliza el guión de la consola, eso no se imprime por el programa

Dense cuenta de que se imprime un espacio entre el último carácter y el guión de la consola.

Lo más extraño de todo es que si descomento el fragmento de código que me muestra la cadena en su valor numérico, este carácter de fin de archivo no se imprime. Si descomento el fragmento la salida queda:

Código:
112
108
97
0
0
0
0
0
5
0
0
0
0
0
0
0
Longest common prefix: pla_

Como ven, ahora no hay espacio entre la última a y el guión.

_______________________
NOTA ACLARATORIA. Sé que es un carácter de fin de archivo porque copié de la consola el carácter y lo pegué en un documento con la misma codificación que la consola (OEM-850), y luego abrí el archivo con HxD (visor hexadecimal) y vi que el carácter era 0xFF
38  Programación / Programación C/C++ / (Aporte) Una pregunta trampa que me hizo mucha gracia en: 23 Junio 2016, 05:52 am
Hola, muy buenas. Resulta que estaba haciendo un test sobre C que había en Internet y me encontré con la siguiente pregunta:

¿Cuál será la salida del siguiente programa?

Código
  1. #include<stdio.h>
  2. int main()
  3. {
  4.    int i=0;
  5.    for(; i<=5; i++);
  6.        printf("%d", i);
  7.    return 0;
  8. }

Les animo a descubrir la trampa xD
39  Informática / Software / (Consulta) Índices manuales en el programa Microsoft Office Word 2013 en: 17 Junio 2016, 21:21 pm
Hola, muy buenas. Primero quiero aclarar que ya sé que este no sea el foro más adecuado para preguntar cosas sobre este programa, pero creo que serán capaces de responder :D

La duda es la siguiente: yo estoy escribiendo un documento relativamente largo, por lo que le puse un índice (es un índice manual, es solo texto). Lo que quiero hacer es que cuando exporte ese documento a PDF, este tenga disponible un índice o "tabla de contenidos" para poder saltar a esa sección del documento.

¡Muchas gracias!
40  Programación / Programación C/C++ / (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI? en: 15 Junio 2016, 08:39 am
Hola, muy buenas. Quería preguntar en base al siguiente código:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. char cadena[16];
  5.  
  6. fscanf(stdin, "%s[^16]", cadena);
  7. fprintf(stdout, cadena);
  8.  
  9. return 0;
  10. }

En este código, uso %s[^16] para delimitar los caracteres que puede tener la cadena, pero al probar este código y probando con cadenas mayores a 16 caracteres, el programa me daba error de segmentation fault (me lo ha dicho el debugger del MinGW-w64). Esto me lleva a la siguiente pregunta: ¿usar esta manera para delimitar los caracteres es ANSI, o solo está disponible para solo ciertos compiladores?

Gracias :D
Páginas: 1 2 3 [4] 5 6
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines