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

[SOLUCIONADO] Segmentation Fault.

Estas en el tema de Segmentation Fault. en el foro de C/C++ en Foros del Web. Hola, Desde ya muchas gracias por su atención. Estoy empezando en C++, ya que nunca había programado en este lenguaje. cree una clase, que la ...
  #1 (permalink)  
Antiguo 15/01/2014, 06:25
 
Fecha de Ingreso: junio-2009
Mensajes: 64
Antigüedad: 15 años, 2 meses
Puntos: 6
Segmentation Fault.

Hola,
Desde ya muchas gracias por su atención. Estoy empezando en C++, ya que nunca había programado en este lenguaje.

cree una clase, que la resumo, pero es algo así:

Código C++:
Ver original
  1. #ifndef INIDICOM_H
  2. #define INIDICOM_H
  3.  
  4.  
  5. using namespace std;
  6. #include <string>
  7. using std::string;
  8. #include <cstring>
  9.  
  10. class iniDicom
  11. {
  12.  
  13.  
  14.     public:
  15.         iniDicom();
  16.         virtual ~iniDicom();
  17.  
  18.         char* getPreamble();
  19.         char* getPrefix();
  20.         char* getGroup_number();
  21.  
  22.          bool setString(char* value_var);
  23.          bool isDicom();
  24.          int  countLength();
  25.  
  26. private:
  27.         char* preamble[128];
  28.         char* prefix[4];    
  29.         char* group_number[2];
  30.  
  31.  
  32.           void asingValues(char* value_char, int iniNumber, char* value_var);
  33. };
  34. #endif // INIDICOM_H

Y tengo la implementación:

Código C++:
Ver original
  1. iniDicom::iniDicom(){
  2.    }
  3.  
  4. iniDicom::~iniDicom(){
  5. }
  6. /*getPreamble() : string
  7. */
  8. char* iniDicom::getPreamble(){
  9.         return *preamble;
  10. }
  11. /*getPrefix() : string
  12. */
  13. char* iniDicom::getPrefix(){
  14.         return *prefix;
  15. }
  16.  
  17.  
  18.  char* iniDicom::getGroup_number(){
  19.         return *group_number;
  20.   }
  21.  
  22.  
  23.  
  24. bool iniDicom::setString(char* value_var){
  25.     asingValues(*preamble, 0, value_var);
  26.  
  27.     return true;
  28. }
  29.  
  30.  
  31. void iniDicom::asingValues(char* value_char, int iniNumber, char* value_var){
  32.     int i, largo = strlen(value_char);
  33.  
  34.     for(i=0;i<largo;i++){
  35.         value_char[i] = value_var[iniNumber+i] ;
  36.     }
  37.  
  38. }
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. int iniDicom::countLength(){
  46.  
  47.     //preamble es igual a 128---> se reemplaza.
  48.     int tmp = 128 + sizeof(*prefix) + sizeof(*group_number)+ sizeof(*element_number);
  49.     tmp += sizeof(*value_representation) + sizeof(*value_length) + sizeof(*value);
  50.     return tmp;
  51.  
  52.     }
  53.  
  54.  
  55. bool iniDicom::isDicom(){
  56.    if(((string)*prefix)=="DICM"){
  57.         return true;
  58.    }else{
  59.         return false;
  60.    }
  61.  
  62. }

el problema es que cuando corro me sale "Segmentation Fault". La verdad es que no se como asignar, mi idea era, obtener de un archivo una cantidad de caracteres, meterlos en un char y después dividirlo en cada uno de los atributos. Cual creen que es la mejor forma de hacerlo?. Muchas Gracias y Saludos.
  #2 (permalink)  
Antiguo 15/01/2014, 06:55
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 8 meses
Puntos: 606
Respuesta: Segmentation Fault.

Tengo una duda... porque programando con C++ (y no con C) estás usando char* como cadenas en lugar de usar el objeto string?

Aparte de esa pregunta... en las cadenas que usas, has reservado la memoria antes de acceder a sus posiciones?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 15/01/2014, 07:10
 
Fecha de Ingreso: junio-2009
Mensajes: 64
Antigüedad: 15 años, 2 meses
Puntos: 6
Respuesta: Segmentation Fault.

En principio muchas gracias por tu respuesta Malenko.

En realidad dude si hacerlo con string o con char, al principio quería usar string pero después considere que quedaba mas prolijo trabajar con espacios de memoria reservado y pensé que seria un poco mas eficiente trabajar de esa manera; la verdad todavía lo estoy dudando.

Te consulto, ¿la asignación de los espacios de memoria los debo hacer en forma posterior?

Saludos.
  #4 (permalink)  
Antiguo 15/01/2014, 10:04
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 8 meses
Puntos: 35
Respuesta: Segmentation Fault.

La asignación de memoria la debes hacer antes de asignarle un valor, usando malloc(). Pero en C++ directamente usa la clase string y te olvidas de la memoria!
  #5 (permalink)  
Antiguo 15/01/2014, 10:48
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 8 meses
Puntos: 606
Respuesta: Segmentation Fault.

Como te han comentado, no tiene sentido usar C++ solo para tener clases y no usar el resto de potencial.

Yo optaría por usar la clase string, pero además has de vigilar los bugs al acceder a posiciones de array sin antes saber si existen:

Código C++:
Ver original
  1. void iniDicom::asingValues(char* value_char, int iniNumber, char* value_var){
  2.     int i, largo = strlen(value_char);
  3.  
  4.     for(i=0;i<largo;i++){
  5.         value_char[i] = value_var[iniNumber+i] ;
  6.     }
  7.  
  8. }

Esta función acepta 2 arrays que pueden ser de diferente tamaño y un entero. En el bucle for solo controlar por la longitud de la cadena "value_char" pero si "iniNumber+1" es superior a "strlen(value_var)" te dará un error por "Segmentation fault" o similares.

Por otro lado, en caso de querer continuar usando punteros y cadenas mediante char*, recuerda que tendrías que reservar el tamaño (con malloc) en el constructor de iniDicom
__________________
Aviso: No se resuelven dudas por MP!
  #6 (permalink)  
Antiguo 15/01/2014, 11:19
 
Fecha de Ingreso: junio-2009
Mensajes: 64
Antigüedad: 15 años, 2 meses
Puntos: 6
Respuesta: Segmentation Fault.

carbon y Malenko,
Entendí perfectamente. Muchas Gracias.
Salduos.

Etiquetas: int, programa, string
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 05:16.