Ayuda con c++

Buenas, al compilar un programa obtengo estos errores:
In file included from src/matriz_basico.cpp:9:
include/matriz_basico.h:30: error: new types may not be defined in a return type
include/matriz_basico.h:30: note: (perhaps a semicolon is missing after the definition of ‘matriz’)
include/matriz_basico.h:30: error: two or more data types in declaration of ‘CrearMatriz’
src/matriz_basico.cpp:19: error: expected constructor, destructor, or type conversion before ‘buscar’


el archivo matriz_ basico.h es( la linea 30 es: void CrearMatriz(matriz& m,int f,int c);) :
struct elemento{
   char c;
   elemento *sig;
};
struct registro{
   registro *sig;
   elemento *c_ele;
};
struct matriz{
   int filas,columnas;
   registro *sig;
}
/**
  * @brief Crea un tipo de dato Matriz
  * @param m Crea la estructura interna del tipo de dato matriz.
  * @param f Nº de filas con la que se creara la matriz
  * @param c Nº de columnas con la que se creara la matriz
  * @pre f y c deben de ser positivos
  */
void CrearMatriz(matriz& m,int f,int c);
....


Y matriz_basico.cpp es:
....
void CrearMatriz(matriz& m,int f,int c){
   if(f>0 &&  c>0 && m==0){//Probamos que no sean nº negativos ¿y que la matriz no este inicializada ya con otros valores.?
      m.filas=f;//Guardamos el nº de filas y columnas
      m.columnas=c;
      registro *p_reg1=m.sig=new registro;//Empezamos a crear la estructura de la matriz
      elemento *p_ele;
      for(int i=0;i<f;i++){//Creamos los registros que se necesitan para hacer la matriz indicada
         p_ele=p_reg1->c_ele=new elemento;
         for(int j=1;i<c;i++){//Creamos los elementos que se necesitan para hacer la matriz indicada
            p_ele->sig=new elemento;
            p_ele=p_ele1->sig;
            p_ele->sig=NULL;
         }
      p_reg->sig=new registro;
      p_reg=p_reg->sig;
      p_reg->sig=NULL;//Los valores NULL indican que ya no hay mas datos enlazados.
      }
   }
}
.....


¿Porque obtengo esos errores de compilacion?


Ademas de esos errores de compilación en ese programa tambien tengo otros errores de compilación en este programa:

cadenas.h
#ifndef CADENAS_H_
#define CADENAS_H_
struct Cadenas{
   char **cad;
   int n;
   int n_usados;
};
/**
  * @brief Creamos el TDA. Por defecto crea un vector de 5 cadenas;
  * @param c , TDA sobre el que se va a inicializar
  * @pre c ha debido ser creado con anterioridad.
*/
void CrearCadenas(Cadenas& c);

/**
  * @brief Indica el tamaño de la cadena
  * @param m  Cadena sobre la cual se va a conocer el tamaño
  * @pre La cadena tiene que haber sido creada
  * @return Devuelve el numero de cadenas dentro del TDA
*/
int SizeCadenas(const Cadenas& c);

/**
  * @brief Añade una cadena al TDA
  * @param c TDA sobre la cual se va insertar una nueva cadena
  * @param nueva  cadena que se va insertar en el TDA
  * @pre nueva no puede estar vacia;c debe de existir
*/
void AddCadenas(Cadenas& c, const char *nueva);

/**
  * @brief Indica el tamaño de una cadena del TDA
  * @param m TDA sobre el cual se va realizar la consulta
  * @param i numero de cadena que se va conocer el tamaño
  * @pre i debe ser mayor que 0 y ser igual o menor que el número de cadenas usadas,m
  * @return devuelve el tamaño de una cadena. En caso de que no cumpla con los pre devolvera un numero<0
*/
int LenCadenas(const Cadenas& m, int i);

/**
  * @brief Averiguamos la cadena contenida en una posicion del TDA
  * @param m TDA sobre el cuál vamos a realizar la consulta
  * @param i Posicion de la cadena dentro del TDA
  * @param out Extrae la cadena
  * @pre i debe de ser mayor que 0 y ser igual o menor que el numero de cadenas usadas; out debe de existir.
*/
void GetCadenas (const Cadenas& m, int i, char *out);

/**
  * @brief Elimina toda el TDA, liberando memoria
  * @param m TDA que va a ser destruido
  * @pre m debe de existir
*/
void DestruirCadenas(Cadenas& m);
#endif


y cadenas.cpp
#include <iostream>
#include "cadenas.h"
using namespace std;

void CrearCadenas(Cadenas& c){
   c.n=5;//Por defecto pordemos almacenar 5 cadenas
   c.n_usados=0;
   c.cad=new char*[c.n];//Reservamos espacio para 5 cadenas
}

int SizeCadenas(const Cadenas& c){
   return c.n;
}

void AddCadenas(Cadenas& c, const char *nueva){
   if(c.n-c.n_usados>0){//Tenemos espacio para almacenar la cadena
      c.n_usados++;
      c.cad[c.n_usados]=new char[strlen(nueva)];//reservamos espacio para la nueva cadena
      strcpy(c.cad[c.n_usados],nueva);//Copiamos la cadena
   }
   else{
      Cadenas c_aux;
      c_aux.n=c.n+5;//Se reserva espacio para 5 cadenas mas
      c_aux.n_usados=c.n_usados+1;
      c_aux.cad=new char*[c.n];
      for(int i=0;i<c.n_usados;i++){
         c_aux.cad[i]=new char[strlen(c.cad[i])];//Se reserva espacio para el tamaño de cada cadena
         strcpy(c_aux.cad[i],c.cad[i]);//copiamos las cadenas
      }
      c_aux.cad[c_aux.n_usados]=new char[strlen(nueva)];//reservamos espacio para la nueva cadena
      strcpy(c_cad.cad[c_aux.n_usados],nueva);//copiamos la cadena
      //Llamamos a destruir Cadena
      c=&c_aux;//Asignamos la direccion de un puntero al original
   }
}

int LenCadenas(const Cadenas& c, int i){
   if(i>=0 && i<=c.n_usados)//se comprueba que el cumple con las condiones para estar en el vector
      return strlen(c.cad[i]);
   else
      return -1;
}

void GetCadenas(const Cadenas& c, int i, char *out){
   if(i>=0 && i<=c.n_usados && out!=0)
      out=&c.cad[i];
}
void DestruirCadenas(Cadenas& c){
   if(c!=0){
      for(int i=0;i<c.n_usados;i++)
         delete[] c.cad[i];
      delete[] c.cad;
   }

}


Errores:
src/cadenas.h:5: error: variable or field ‘CrearCadenas’ declared void
src/cadenas.h:5: error: ‘Cadenas’ was not declared in this scope
src/cadenas.h:5: error: ‘c’ was not declared in this scope
In file included from src/cadenas.cpp:2:
src/cadenas.h:5: error: variable or field ‘CrearCadenas’ declared void
src/cadenas.h:5: error: ‘Cadenas’ was not declared in this scope
src/cadenas.h:5: error: ‘c’ was not declared in this scope
src/cadenas.cpp:5: error: variable or field ‘CrearCadenas’ declared void
src/cadenas.cpp:5: error: ‘Cadenas’ was not declared in this scope
src/cadenas.cpp:5: error: ‘c’ was not declared in this scope
src/cadenas.cpp:11: error: expected ‘,’ or ‘...’ before ‘&’ token
src/cadenas.cpp:11: error: ISO C++ forbids declaration of ‘Cadenas’ with no type
src/cadenas.cpp: In function ‘int SizeCadenas(int)’:
src/cadenas.cpp:12: error: ‘c’ was not declared in this scope
src/cadenas.cpp: At global scope:
src/cadenas.cpp:15: error: variable or field ‘AddCadenas’ declared void
src/cadenas.cpp:15: error: ‘Cadenas’ was not declared in this scope
src/cadenas.cpp:15: error: ‘c’ was not declared in this scope
src/cadenas.cpp:15: error: expected primary-expression before ‘const’

Son muchos errores, pero creo que si arreglo el causante del fallo, se solucionan todos los demas errores.
A ver si te puedo ayudar.

Aquí void CrearMatriz(matriz& m,int f,int c) estás pasando una referencia cuando deberías pasar un puntero. Es decir, tendrías que declarar la función tal como:

void CrearMatriz(matriz *m,int f,int c);

A la hora de crear usar -> en lugar de .

m->filas=f;//Guardamos el nº de filas y columnas
m->columnas=c;

A la hora de llamar la función tienes dos opciones:

- Declarar una matriz estática:

matriz m;

Tendrías que llamar a la función así:

CrearMatriz(&m,f,c);

- Declarar una matriz dinámica:

matriz *m:
m = new matriz;

Y llamamos a la función:

CrearMatriz(m,f,c);

Al salir:

delete m;

Pero ya que usas c++, declara una clase en lugar de una struct y usa el constructor:

class matriz
{
int filas,columnas;
registro *sig;

matriz(int f,int c);
}

Y luego declaras la función matriz:

matriz::matriz(int f, int c)
{
if (f>0 && c>0){//Probamos que no sean nº negativos ¿y que la matriz no este inicializada ya con otros valores.?
filas=f;//Guardamos el nº de filas y columnas
columnas=c;
etc...
}

Fíjate que no es necesario usar el puntero a la matriz.

Luego, cuando queramos crear una matriz:

matriz m = new matriz(f,c);

Espero que te sirva.

Un saludo
pasteles escribió:
struct elemento{
   char c;
   elemento *sig;
};
struct registro{
   registro *sig;
   elemento *c_ele;
};
struct matriz{
   int filas,columnas;
   registro *sig;
}
/**
  * @brief Crea un tipo de dato Matriz
  * @param m Crea la estructura interna del tipo de dato matriz.
  * @param f Nº de filas con la que se creara la matriz
  * @param c Nº de columnas con la que se creara la matriz
  * @pre f y c deben de ser positivos
  */
void CrearMatriz(matriz& m,int f,int c);
....



Te da el fallo en la linea 30 que es CrearMatriz, pero el error está antes. Si te fijas, la tercera estructura Matriz no tiene ; al final de la definición.

Presta más atención a los mensajes de error del compilador:
include/matriz_basico.h:30: note: (perhaps a semicolon is missing after the definition of ‘matriz’)
Joder que despiste, bueno lo he corregido y solo me da este error :
src/matriz_basico.cpp:21: error: expected constructor, destructor, or type conversion before ‘buscar’

Si no he declarado ninguna clase porque espera un constructor o un destructor?

En lo referente a cadenas no encuentro el dichoso fallo.
Haz lo que te ha dicho GreatXavi para la definición de la función.
Pega el resto del código referente a matriz porque con los fragmentos que hay no sé decirte más.

Respecto al de cadenas, yo compilo lo que has escrito y no me da esos errores, se queja porque falta incluir string.h (strlen, strcpy), por alguna confusión en nombres de variables (c_cad.cad en lugar de c.cad, linea 32) y por alguna cosa más de punteros (mira lo que te ha comentado GreatXavi) y limpia los restos de anteriores compilaciones que tengas por ahí antes de seguir.
5 respuestas