En Xml.h tengo:
#ifndef XML_HPP
#define XML_HPP
// El largo máximo que pueden tener las etiquetas, sin contar el '\0' final.
int const ETQMAX = 15;
// El largo máximo que pueden tener los valores, sin contar el ‘\0’ final.
int const VALMAX = 30;
// El largo máximo que pueden tener los textos, sin contar el ‘\0’ final.
int const TXTMAX = 1024;
struct Xml;
typedef struct parAtrib {
char id[ETQMAX+1];
char valor[VALMAX+1];
};
// Devuelve un nuevo xml con un elemento con una copia de la etiqueta
// Precondición: etiqueta solo contiene letras y/o numeros
// Precondición: 0 < strlen(etiqueta) <= ETQMAX
// Poscondición: !xmlEstaAnidado(xmlCrearNodoCompleto(etiqueta))
Xml* xmlCrearNodoCompleto(const char* etiqueta);
// Devuelve un nuevo xml con un elemento con una copia de texto
// Precondición: texto no contiene ocurrencias de ‘<’ y ‘>’.
// Precondición: strlen(texto) <= TXTMAX
// Poscondición: El texto se guarda comprimido
// Poscondición: !xmlEstaAnidado(xmlCrearNodoTexto(texto))
Xml* xmlCrearNodoTexto(const char* texto);
....... y mas cosas
#endif
en el Xml.cpp tengo:
#include "Xml.h"
#include <string.h>
typedef struct listaAtrib {
parAtrib * valor;
listaAtrib * siguiente;
};
typedef struct nodoCompleto {
char etiqueta[ETQMAX+1];
Xml *primerHijo;
listaAtrib * atributos;
};
typedef struct nodoTexto {
char valTxt[TXTMAX+1];
};
typedef union nodo {
nodoCompleto * nodoC;
nodoTexto * nodoT;
};
typedef struct Xml {
Xml * padre, *sigHno;
nodo * valor;
bool es_texto; //False == nodoCompleto; True == nodoTexto
};
// Devuelve un nuevo xml con un elemento con una copia de la etiqueta
// Precondición: etiqueta solo contiene letras y/o numeros
// Precondición: 0 < strlen(etiqueta) <= ETQMAX
// Poscondición: !xmlEstaAnidado(xmlCrearNodoCompleto(etiqueta))
Xml* xmlCrearNodoCompleto(const char* etiqueta){
Xml* nuevoxml = new Xml;
nuevoxml -> padre = 0;
nuevoxml -> sigHno = 0;
nuevoxml -> es_texto= 0;
strcpy(nuevoxml -> valor -> nodoC -> etiqueta, etiqueta);
nuevoxml -> valor -> nodoC -> primerHijo = 0;
nuevoxml -> valor -> nodoC -> atributos = 0;
return nuevoxml;
}
// Devuelve un nuevo xml con un elemento con una copia de texto
// Precondición: texto no contiene ocurrencias de ‘<’ y ‘>’.
// Precondición: strlen(texto) <= TXTMAX
// Poscondición: El texto se guarda comprimido
// Poscondición: !xmlEstaAnidado(xmlCrearNodoTexto(texto))
Xml* xmlCrearNodoTexto(const char* texto){
Xml* nuevoxml = new Xml;
nuevoxml -> padre = 0;
nuevoxml -> sigHno = 0;
nuevoxml -> es_texto= 1;
strcpy(nuevoxml -> valor -> nodoT -> valTxt, texto); // copio el texto como viene y lo guardo
return nuevoxml;
}
Y cuando llamo desde el principal cualquiera de estas dos constructoras me da error de volcado de pila en tiempo de ejecucion:
principal.cpp :
#include "Xml.h"
#include <iostream.h>
#include <stdio.h>
int main () {
char etiqueta[ETQMAX+1] = "etiqueta0";
Xml* hijo1 = xmlCrearNodoTexto(etiqueta);
return 0;
}
Alguien tiene idea de porque sale este error????