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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 45
131  Programación / Programación C/C++ / Re: Guardar palabras entre " " y separadas por comas en un array. Lenguaje C en: 12 Agosto 2016, 17:13 pm
También en la línea 10 se te olvida escribir la función xD

Código
  1. token = strtok(buffer,","); // Se te olvidó strtok!!
132  Programación / Programación C/C++ / Re: [C] Duda, código y memoria. en: 11 Agosto 2016, 06:53 am
Cuando pones un código, lo mejor sería que dijeras el problema CONCRETO que se te presenta. En este caso, estás usando Windows (porque incluyes windows.h), pero estás usando la función chdir, la cual creo que no se puede usar en Windows (creo que se usa en sistemas Linux). Lo siento, pero si quieres cambiar el directorio en Windows, vas a tener que usar la API de Windows, y si vas a trabajar en sistemas Linux, puedes seguir usando chdir.

Ejemplo de cómo cambiar el directorio con la API de Windows (ejemplo sacado de Internet):

NOTA: El código puede parecer largo. Lo que pasa es que aquí se hacen más pasos que cambiar el directorio, pero en esencia, deberías ser capaz de ver cómo usar la API de Windows.

Código
  1. #include <windows.h>
  2. #include <iostream>
  3.  
  4. int main() {
  5.    const int bufferSize = MAX_PATH;
  6.    char oldDir[bufferSize]; // store the current directory
  7.  
  8.    // get the current directory, and store it
  9.    if (!GetCurrentDirectory(bufferSize, oldDir)) {
  10.        std::cerr << "Error getting current directory: #" << GetLastError();
  11.        return 1; // quit if it failed
  12.    }
  13.    std::cout << "Current directory: " << oldDir << '\n';
  14.  
  15.    // new directory
  16.    const char* newDir = R"(C:\path\to\directory\)"
  17.    if (!SetCurrentDirectory(newDir)) {
  18.        std::cerr << "Error setting current directory: #" << GetLastError();
  19.        return 1; // quit if we couldn't set the current directory
  20.    }
  21.    std::cout << "Set current directory to " << newDir << '\n';
  22.  
  23.    // Delete some files
  24.    DeleteFile("file1.txt");
  25.    DeleteFile("bin\\file2.exe");
  26.    DeleteFile(R"(data\things\other\file3.zip)");
  27.  
  28.    // Reset the current directory back to what it was.
  29.    if (!SetCurrentDirectory(oldDir)) {
  30.        std::cerr << "Error resetting current directory: #" << GetLastError();
  31.        return 1;
  32.    }
  33.    std::cout << "Reset current directory. \n";
  34.  
  35.    // ...
  36.  
  37.    return 0;
  38. }

FUENTE del código: pincha aquí
133  Programación / Programación C/C++ / Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila? en: 10 Agosto 2016, 17:10 pm
Ahh. Vale. Eso ya me cuadra más. ¡¡Muchas gracias por resolver la duda!!
134  Programación / Programación C/C++ / Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila? en: 10 Agosto 2016, 16:37 pm
Creo que ya lo entiendo. Se guarda tanto en el stack como en la pila. Me explico, en primera instancia, si no hay problemas, la cadena se guarda en la pila, pero cuando adjuntamos nuevos datos, este pasa a estar en memoria dinámica. Código que he utilizado:

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main() {
  5. std::string cadena = "Hola";
  6.  
  7. std::cout << "Direccion en main de objeto: " << &cadena << std::endl;
  8. std::cout << "Direccion en main de cadena: " << (void *)cadena.c_str() << std::endl;
  9.  
  10. cadena.append(". Esto es una adjunción dentro de una función");
  11.  
  12. std::cout << "Direccion despues de append: " << (void *)cadena.c_str() << std::endl;
  13.  
  14. return 0;
  15. }

Direcciones obtenidas:
Código:
Direccion en main de objeto: 0x23fe10
Direccion en main de cadena: 0x23fe20
Direccion despues de append: 0x8418f0
135  Programación / Programación C/C++ / Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila? en: 10 Agosto 2016, 16:16 pm
No lo veo necesario, pues he sacado la dirección de una variable LOCAL, que se almacena en la pila. En cualquier caso, para que no quede ningún tipo de duda, lo pondré:

Código:
Direccion de variable local: 0x23fe30
Direccion del objeto cadena: 0x23fe10
Direccion de cadena: 0x23fe20
Direccion de un byte en el heap: 0x3518f0
136  Programación / Programación C/C++ / Re: [C++] (Consulta) ¿std::string guarda la cadena en el heap o en la pila? en: 10 Agosto 2016, 16:08 pm
He usado el siguiente código, y creo que no cabe duda que se almacena en la pila, pero eso me genera muchas preguntas.

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4.  
  5. int main() {
  6. unsigned int variable = 0;
  7. std::string cadena = "Hola";
  8. char *caracter = new char;
  9.  
  10. std::cout << "Direccion de variable local: " << &variable << std::endl;
  11. std::cout << "Direccion de cadena: " << (void *)cadena.c_str() << std::endl;
  12. std::cout << "Direccion de un byte en el heap: " << (void *)caracter << std::endl;
  13.  
  14. delete caracter;
  15. return 0;
  16. }

Salida obtenida:
Código:
Direccion de variable local: 0x23fe30
Direccion de cadena: 0x23fe20
Direccion de un byte en el heap: 0x4b18f0

Lo deduzco por dos razones:
1º- La dirección de la variable local y la dirección de la cadena siempre están juntas con ese espacio de bytes.

2º- Siempre que ejecuto el programa de nuevo, la pila parece permanecer en la misma dirección (la dirección de la variable local y de la cadena permanecen en un rango limitado) mientras que la dirección de la variable en el heap cambia constantemente.

Si confirmo que se guarda en la pila, entonces preguntaré mis dudas
137  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
138  Programación / Programación C/C++ / Re: Problema con feof en: 9 Agosto 2016, 21:08 pm
AlbertoBSD, tienes la razón. El indicador de final de archivo solo se activa si se ha intentado leer uno o más bytes, pero no se ha/han podido leer porque no quedan más

Esto significa que hay que comprobar el final de archivo después de una operación de lectura.
139  Programación / Programación C/C++ / Re: ayuda.hacer un programa en C, que haga lo mismo que hace el comando cp en ubuntu en: 9 Agosto 2016, 18:43 pm
La mayoría de dispositivos trabaja con bloques de 512 bytes, ¿no sería mejor usar un búfer de 512 bytes? También podrías parametrizar el tamaño del búfer y hacer un malloc, como el comando dd.

Otra cosilla, aunque este programa en la mayoría de casos funcione sin inconvenientes, hay algunos casos en los que fallará. Creo que esta sería la solución:

Código
  1. while(!feof(origen)){
  2. leido = fread(buffer,1,256,origen);
  3. if(0 < leido)
  4. fwrite(buffer,1,leido,destino);
  5. }
140  Programación / Programación C/C++ / Re: [Grafo] Base para el Algoritmo de Dijkstra en: 8 Agosto 2016, 05:01 am
Esto me vendrá bien para aprender el tema de los grafos. ¡Gracias!
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 [14] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ... 45
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines