[C++]Dudas varias.

Sé que hay funciones para liberar memoria eliminando objetos que ya no nos interesen, pero no es lo que necesito.

El caso es que tengo un vector de una longitud muy grande, del que sólo me interesan los datos almacenados en los 5 primeros índices. Había pensado crear otro vector, copiar estos datos y cargarme el grande para liberar recursos. ¿Se puede hacer ésto?

PD: he tenido problemas con mi otro hilo y por eso he tenido que crear este [ayay]

EDITO:
He provado haciendo ésto:
free((char *)vector);

El problema es que después de hacerlo, puedo acceder al vector sin problemas y sigue guardando los valores.
Para liberar un array dinámico:

delete [] array;


Y si, claro que puedes crear otro array, ¿Porque no vas a poder?.
kbks escribió:Y si, claro que puedes crear otro array, ¿Porque no vas a poder?.

A lo que me refería era a si me lo podía cargar, no a si podía crear otro, eso está claro jeje.

GRACIAS!!!
manugarrote escribió:
kbks escribió:Y si, claro que puedes crear otro array, ¿Porque no vas a poder?.

A lo que me refería era a si me lo podía cargar, no a si podía crear otro, eso está claro jeje.

GRACIAS!!!


Ah! joder, ahora que lo dices leyendolo mejor veo que te había entendido mal. Pues si, por supuesto que te puedes cargar el array, pero solo si está en memoría dinámica. Si lo creas estáticamente se eliminará al llegar al final de la función en la que lo declaras.
una de dos, o lo que hace es liberar el primer char del vector, o lo que sucede es que te lo borra bien pero puedes seguir accediendo a ello desde la variable.

Me explico, en c puedes acceder a cualquier punto de la memoria. Lo que sucede es que el sistema operativo, al intentar ecribir en memoria reservada a otra aplicación, casca. Sin embargo, si que puedes acceder al punto que quieras de la memoria y leerlo, aunque tu aplicación no tenga reservada la memoria. al hacer el free simplemente liberas ese trozo de memoria de la aplicación y la dejas disponible, pero la información que había ahí se sigue guardando. Es la basurilla que lees cuando reservas memoria y no la inicializas.
Es lo que dice Blue, con el free((char *)vector); ya has liberado la memoria de ese vector, pero los datos no se borran, solo que cuando el programa necesite memoria pues la cojera de ahi tambien sobrescribiendo esos datos puesto que el espacio de memoria que utilizaba el vector ya no esta reservado y si usas el puntero "vector" sin asignarle memoria pues vas a leer lo que se escriba ahi en cada momento y puede darte un volcado de memoria por acceder a memoria reservada.

Un Saludo!

Lo mas facil es:

char temp[5];

char[0] = vector[0];
......
char[4] = vector[4];

free(vector);
vector = (char *)malloc(sizeof(char)*5);

vector[0] = char[0];
......
vector[4] = char[4];

Y ya tienes el vector solo del tamaño de 5 caracteres y con los 5 primeros.

(no se si el codigo esta bien del todo sintanticamente porque estoy un poko oxdidado con punteros jeje.
Os cuento, necesito leer los caracteres de un archivo, pero leyéndolos como enteros. Es decir, que si me encuentro la letra A, en la variable en la que se me almacena el elemento leido, me guarde el número 63 (su correspondiente en código ASCII).

Lo tengo hecho así, pero no funciona:
// MIO!!!!!!!!!!!!!!

#include <iostream>
#include <iomanip>
#include <fstream>
//#include "raiz.h"

using namespace std;

int main() {
    //Variables
    char vector[255];
    int leido;
    int numcaracteres=0;
    ifstream inFile;
   
    //Inicializamos etodos los elementos del vector a 0
    for (int i=1;i<255;i++)
        vector[i]=0;
   
    //Abrimos archivo
    inFile.open("test.txt");
    if (!inFile) {
        cout << "Error al abrir el archivo";
        exit(1); // termina
    }
   
    //Contamos todos los caracteres (repitiendo)
    while (inFile >> leido) {
          vector[leido]++;
          numcaracteres++;}
          inFile.close();
          cout << "Total caracteres = " << numcaracteres;
          return 0;
             
}


¿Alguna idea? GRACIAS!!!
Wenas manu, pos segun lo tienes en el codigo te va a petar si lees un fichero de mas de 255 caracteres. Utiliza un realloc o malloc para redimensionar el array dinamicamente (no se si has dado punteros en C :S ). Para leer el caracter ascii usa la funcion "int asc(caracter)" cuando leas el caracter lo pasas a esa funcion y el resultado lo almacenas en el vector, asi tendras el valor ascii del caracter leido y no el char, otra manera es convertir el tipo al sacarlo por pantalla "printf("Caracter: %c, ASCII: %d",caracter,caracter);".

La unca pega que le veo es lo de limitar el vector a 255 caracteres.

¿Es un ejercicio de la uni o algo parecido? Esque me suena haber hecho eso mismo pero leyendo los caracteres de un texto y cuantas veces se repite cada uno, que me da que es lo que quieres hacer y por eso usas un vector justo de 255.

Pues lo que haces esta bien, lees el caracter y sumas uno a la posicion de ese caracter en el vector habiendo inicializado todo a cero.

// DE MANU!!!!!!!!!!!!!!

#include <iostream>
#include <iomanip>
#include <fstream>
//#include "raiz.h"

using namespace std;

int main() {
    //Variables
    char vector[255];
    int leido;
    int numcaracteres=0;
    ifstream inFile;
   
    //Inicializamos etodos los elementos del vector a 0
    for (int i=1;i<255;i++)
        vector[i]=0;
   
    //Abrimos archivo
    inFile.open("test.txt");
    if (!inFile) {
        cout << "Error al abrir el archivo";
        exit(1); // termina
    }
   
    //Contamos todos los caracteres (repitiendo)
    while (inFile >> leido) { <-- aqui no se como funciona el ifstream pero mejor usa un descriptor FILE y fread
          vector[leido]++;
          numcaracteres++;}
          inFile.close();
          cout << "Total caracteres = " << numcaracteres;
          return 0;
}


¿que error te da o que te sale por pantalla?
En realidad lo que pretende no es leer los caracteres del fichero en un vector, sino iterar por cada uno de los caracteres del fichero, obtener su código ASCII, y usar el vector como acumulador para ver cuántas veces aparece cada carácter. El número de caracteres que tenga el fichero no importa.

El problema por el que no funciona es porque la variable leido es un int, y el stream de salida de un fichero devuelve un char. Si cambias el tipo funcionará.
char en el fondo es un byte, un número sólo que un poco especial, así que si lo asignas a leido con un casting funciona perfectamente.
Por último para no mezclar C++ y C, lo mejor que puedes hacer es seguir usando streams y no descriptores FILE. Lo mismo para malloc / realloc / free. Utiliza el new y el delete. Esto ya es consejo de estilo, pero en teoría debería funcionar igual siempre que no los mezcles ( es decir, no reserves memoria con un new, y liberes con un free, y cosas así)

   
char leido;
...
...

while ( inFile >> leido )
   {
      vector[static_cast<int>(leido)]++;
      numcaracteres++;
   }
9 respuestas