Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Punteros y Arrays dinámicos

Estas en el tema de Punteros y Arrays dinámicos en el foro de C/C++ en Foros del Web. Hola,tengo problemas con un ejercicio que consiste en que tengo una lista formada por un contador(int) y un array (que dentro tiene estructuras)de cantidad N ...
  #1 (permalink)  
Antiguo 21/05/2015, 12:13
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Pregunta Punteros y Arrays dinámicos

Hola,tengo problemas con un ejercicio que consiste en que tengo una lista formada por un contador(int) y un array (que dentro tiene estructuras)de cantidad N en principio.
Cuando el array se llene,tengo que crear un array dinámico nuevo con la capacidad N aumentada (en mi ejercicio he llamado max a esta variable).
Una vez he creado este array dinámico,copio los elementos del array viejo en este array nuevo y elimino el array viejo.
Finalmente,tengo que hacer que la lista apunte a este nuevo array dinámico.
Código C++:
Ver original
  1. //Declaración de tipos:
  2. typedef struct {
  3.    int codigo;
  4.    std::string nombre;
  5.    double valor;
  6. } tRegistro;
  7.  
  8. typedef tRegistro *tRegPtr;
  9.  
  10. typedef struct {
  11.    tRegPtr registros;
  12.    int cont;
  13. } tLista;
  14.  
  15.  
  16. //Función en la que tengo los errores:
  17. bool insertar(tLista &lista, tRegistro registro, int &max) {
  18.     bool aniadido = false;
  19.     max = N;
  20.     if (lista.cont == max) {//Si la lista está llena,se incrementará el tamaño del array en otras N posiciones.
  21.         max += N;
  22.         //Creo un nuevo array dinámico con la nueva cantidad de max.
  23.         tRegPtr *registrosAux = new tRegPtr[max];
  24.  
  25.         //Copio los elementos del array anterior al nuevo array dinámico.
  26.         for(int i = 0; i < lista.cont; i++){
  27.             registrosAux[i] = lista.registros[i];//AQUÍ ERROR 1
  28.         }
  29.         //Destruimos el array viejo de la lista porque ya se llenó.
  30.          delete [] lista.registros;
  31.  
  32.          //Hacer que el puntero lista.registros apunte al nuevo array.
  33.          lista.registros = registrosAux;//AQUÍ ERROR 2
  34.     }
  35.     //Siempre añade un nuevo elemento solo que comprueba si tiene la lista llena antes para ver si incrementa o no esta cantidad.
  36.     lista.registros[lista.cont] = registro;
  37.     lista.cont++;
  38.     aniadido = true;
  39.     return aniadido;
  40. }
Tengo dos errores y en ambos me dice que pertenecen a error C2440: '='
ERROR 1: no se puede realizar la conversión de 'tRegistro' a 'tRegPtr'
ERROR 2:no se puede realizar la conversión de 'tRegPtr *' a 'tRegPtr'

PD:Si ya de paso me pueden explicar o dar algún tip para entender bien esto de los punteros,me ayudaría muchísimo porque no termino de entenderlo :(
  #2 (permalink)  
Antiguo 21/05/2015, 12:44
 
Fecha de Ingreso: mayo-2015
Mensajes: 19
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Punteros y Arrays dinámicos

Creo que entiendes bien punteros pero telias con las referencias que haces con typedef:
Código:
tRegPtr *registrosAux
tRegPtr es un tipo de dato puntero, y estas diciendo ahí que registrosAux es un puntero a puntero al registro, solo quita ese asterisco.
En el segundo error es poner el asterisco:
'tRegPtr *' a 'tRegPtr'
ya que estas asignando un tipo puntero a tRegPtr a un tipo tRegPtr. Ten en cuenta que la lista la pasas por referencia pero es un puntero!
  #3 (permalink)  
Antiguo 21/05/2015, 13:03
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Punteros y Arrays dinámicos

Me has líado un poco más *-* ,yo siguiendo la teoría del temario de mi clase,creo que tengo declarado correctamente el crear el nuevo array dinámico así:

tRegPtr *registrosAux = new tRegPtr[max];

Por otro lado,hoy mismo le pregunté a mi profesora mi duda en el que tengo el segundo error y me dijo que lo pusiera tal cual lo he puesto porque se supone que registrosAux,al ser un array dinámico significa que es ya por dentro un puntero al primer elemento del array .

Aparte de eso,he probado corrigiendo según me has dicho y me siguen saliendo los mismos errores :/
  #4 (permalink)  
Antiguo 21/05/2015, 13:06
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Punteros y Arrays dinámicos

Supongo que por algún lugar habrá un #include <string> y no entiendo lo que estás haciendo con la N y de dónde sale. De hecho con ese código la N te dará error al compilar

Un puntero es una dirección de memoria para almacenar un dato. Por tanto si tu asignas a un puntero otro dato como tu has hecho no hace lo que tú quieres, de hecho consideraría que lo que hay a la derecha del operador de asignación (=) es una dirección de memoria.

Para acceder o modificar el dato que contiene un puntero utiliza el operador de indirección (*) tal y como te muestro a continuación:

Código C++:
Ver original
  1. for(int i = 0; i < lista.cont; i++){
  2.             *registrosAux[i] = lista.registros[i];//AQUÍ YA NO ERROR 1
  3.         }

Dos aclaraciones básicas:
Modificar dato del puntero
Código C++:
Ver original
  1. int a=1;
  2. int * puntero;
  3. *puntero=2; // Ahora a vale 2
Implicaciones de utilizar el operador de asignación
Código C++:
Ver original
  1. char* letra;
  2. int * puntero;
  3. *letra='H'; // El dato de cadena ahora es H
  4. *puntero=2; // El dato de puntero vale 2
  5. puntero=letra; // Se intenta apuntar con puntero a letra sin embargo no se puede al ser
  6.                        // distintos tipo.

Código C++:
Ver original
  1. char* letra;
  2. char *letra_nueva
  3. *letra='H'; // El dato de cadena ahora es H
  4. *letra_nueva='J'; // El dato vale J
  5. letra=letra_nueva; // Ahora letra apunta a la dirección de memoria de letra_nueva
  6. *letra_nueva='I'; // Como cambie la dirección de memoria si cambio el dato de letra o letra_nueva cambio ambos


Código C++:
Ver original
  1. char* letra;
  2. char *letra_nueva
  3. *letra='H'; // El dato de cadena ahora es H
  4.  
  5. *letra_nueva='J'; // El dato vale J
  6. *letra=*letra_nueva; // Ahora letra coge el valor de letra_nueva
  7. // Si modificase letra_nueva no afectaría a letra
  #5 (permalink)  
Antiguo 23/05/2015, 08:14
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Punteros y Arrays dinámicos

La constante N la tenía en otro lado porque este programa lo estaba haciendo con módulos :) ,solo intenté poner lo básico y olvidé poner la N en ese momento.

Al final,logré solucionarlo así :
-En el ERROR 1,tenía que modificar el tipo tRegistro.
tRegPtr registrosAux = new tRegistro[max];

-En el ERROR 2,al corregir lo anterior,ya se suprimía este error.

Etiquetas: arrays, int, punteros, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:28.