2013-11-02 2 views
0

У меня проблема с моим кодом. Когда в то время, когда я запускаю его, он падает ... Когда я отлаживаю его, он говорит, что это ошибка «Ошибка сегментации». Но я не могу найти ошибку. Here's код:не может найти ошибку в моем коде .... Ошибка сегментации

listaArchivo.H (заголовок)

#ifndef LISTAARCHIVOS_H 
    #define LISTAARCHIVOS_H 

    #include "Archivo.h" 

    struct _listaArchivos{ 
     Archivo arch; 
    }; 
    typedef _listaArchivos* ListaArchivos; 

/* 
* creates and initializes a new lista of archivos. 
*/ 
    ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista; 

     (*lista)->arch=NULL; 

     return *lista; 
    } 

/* 
* inserts 'archivo' in 'lista'. 
*/ 
    void insertarArchivoListaArchivos(ListaArchivos &lista, Archivo archivo){ 
     Archivo *nuevoArchivo; 
     nuevoArchivo=new Archivo; 
     *nuevoArchivo=archivo; 
     if (lista==NULL){ 
      lista->arch=*nuevoArchivo; 
      lista->arch->Anterior=NULL; 
      lista->arch->Siguiente=NULL; 
     } 
    } 

"Archivo.h" (заголовок)

#ifndef ARCHIVO_H 
    #define ARCHIVO_H 
    struct _archivo{ 
     Cadena nombreArchivo; 
     Cadena Atributos; 
     Cadena Contenido; 
     _archivo *Siguiente; 
     _archivo *Anterior; 
    }; 
    typedef _archivo* Archivo; 

/* 
* Crea e inicializa un archivo con nombre 'nombreArchivo' 
*/ 
    Archivo crearArchivo(Cadena nombreArchivo){ 

     Archivo *nuevoArchivo; 
     nuevoArchivo=new Archivo; 

     (*nuevoArchivo)->Atributos="Lectura/Escritura"; 
     (*nuevoArchivo)->Contenido=NULL; 
     (*nuevoArchivo)->nombreArchivo=nombreArchivo; 
     (*nuevoArchivo)->Siguiente=NULL; 
     (*nuevoArchivo)->Anterior=NULL; 

     return *nuevoArchivo; 
    } 

@Vishnu Kanwar Вот код оттуда, где я звонил в эту функцию:

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <cstdlib> 
#include <conio.h> 

#include "Sistema.h" 
#include "Archivo.h" 
#include "Directorio.h" 
#include "ListaArchivos.h" 
#include "Constantes.h" 
using namespace std; 


int main() 
{ 
    /* VARS */ 
    Cadena c_DIR=(char *)"DIR"; 
    Cadena c_CREATEFILE=(char *)"CREATEFILE"; 
    Cadena c_DELETE=(char *)"DELETE"; 
    Cadena c_ATTRIB=(char *)"ATTRIB"; 
    Cadena c_IF=(char *)"IF"; 
    Cadena c_DF=(char *)"DF"; 
    Cadena c_TYPE=(char *)"TYPE"; 
    Cadena c_CREARSISTEMA=(char *)"CREARSISTEMA"; 
    Cadena c_DESTRUIRSISTEMA=(char *)"DESTRUIRSISTEMA"; 
    Cadena c_EXIT=(char *)"EXIT"; 
    Cadena Segmento; 
    Cadena comando; 
    Cadena parametro1; 
    Cadena parametro2; 
    bool seguir; 
    int contador=0; 
    char frase[50]; 
    Archivo *arch; 
    ListaArchivos *lista; 

    /* DO WHILE UNTILL BOOL=TRUE */ 
    do{ 
    cout <<"> "; 

    /* ALGORITHM FOR DIVIDING THE FRASE IN TOKENS */ 
    fgets(frase,50,stdin); 
    Segmento=strtok(frase," "); 
    while(Segmento!=NULL){ 
      if(contador == 0){ 
       comando=Segmento; /* GUARDA EL COMANDO */ 
      } 
      if (contador == 1){ 
        parametro1=Segmento; /* GUARDA EL PRIMER PARAMETRO */ 
      } 
      if(contador == 2){ 
       parametro2=Segmento; /* GUARDA EL SEGUNDO PARAMETRO */ 
      } 
      Segmento=strtok(NULL, " "); 
      contador++; 
    } 

    /* SELECTS "COMANDO" COMPARING WITH THE OTHER CHAR* */ 
    if (strcmp(comando,c_DIR)== 0){ 
     cout <<"Uso comando DIR"<<endl<<endl; 
    } 
    else{ 
     if (strcmp(comando,c_CREATEFILE)== 0){ **/*HERE IS WHERE I MAKE THE CALLS*/** 

      *lista=crearListaArchivos(); 


      cout<<"LISTA CREATED SUCCESSFULLY !!"<<endl; 

      *arch=crearArchivo(parametro1); 
      cout<<"ARCHIVO CREATED"<<endl; 

      insertarArchivoListaArchivos(*lista,*arch); 

      cout <<"THE ARCHIVO WAS ADDED SUCCESFULLY !!"<<endl<<endl; 
     } 
     else{ 
      if (strcmp(comando,c_DELETE)== 0){ 
       cout <<"Uso comando DELETE "<<endl<<endl; 
      } 
      else{ 
       if (strcmp(comando,c_ATTRIB)== 0){ 
        cout <<"Uso comando ATTRIB"<<endl<<endl; 
       } 
       else{ 
        if (strcmp(comando,c_IF)== 0){ 
         cout <<"Uso comando IF"<<endl<<endl; 
        } 
        else{ 
         if (strcmp(comando,c_DF)== 0){ 
          cout <<"Uso comando DF"<<endl<<endl; 
         } 
         else{ 
          if (strcmp(comando,c_TYPE)== 0) { 
           cout <<"Uso comando TYPE"<<endl<<endl; 
          } 
          else{ 
           if (strcmp(comando,c_CREARSISTEMA)== 0){ 
            cout <<"Uso comando CREARSISTEMA"<<endl<<endl; 
           } 
           else{ 
            if (strcmp(comando,c_DESTRUIRSISTEMA)== 0){ 
             cout <<"Uso comando DESTRUIRSISTEMA"<<endl<<endl; 
            } 
            else{ 
             if (strcmp(comando,c_EXIT)==0){ 
              cout <<"Saliendo del programa..."<<endl<<endl; 
              seguir=false; 
             } 
             else{ 
              cout << "Comando incorrecto."<<endl<<endl; 
             } 
            } 
           } 
          } 
          } 
         } 
        } 
       } 
      } 
     } 
    }while(seguir); 

    return 0; 
} 

Проблема начинается КОГДА Я вызываю функции crearArchivo и crearListaArchivo в основном. Остальное, кажется, работает нормально. Если у вас есть представление о том, как я могу решить эту ошибку, пожалуйста, помогите мне. Спасибо ОЧЕНЬ МНОГО! :)

+2

Вы пробовали переходить через код с помощью отладчика, чтобы узнать, где произошла ошибка? – jpw

+2

Включите предупреждения компилятора. Вы должны получить его в строке '(* lista) -> arch = NULL;' - прочитать его! –

+1

также, '* lista' определяет указатель на список, но не выделяет для него память. Вызов разыменования UB – clcto

ответ

0
ListaArchivos crearListaArchivos(){ 
    ListaArchivos *lista; 

выше Lista является _listaArchivos** и что неинициализированным в вашем коде. Как исправить (выполнить следующую строку кода успешно), необходимо инициализировать память указываемого lista

`lista=new ListaArchivos` 

Подождите! до сих пор у нас есть действительный _listaArchivos* но не _listaArchivos сделать его действительным вы должны сделать:

*lista = new _listaArchivos; 

Теперь *lista указывает на действительный объект _listaArchivos в памяти, и вы можете выполнить оставшуюся часть кода, который использует (* Lista).

(*lista)->arch=NULL; 

    return *lista; 
} 

EDIT: Даже, хотя два new исправления вопрос выделения, но этот стиль кодирования делает сбор мусора вызовом и очень трудно управлять.

+0

ListaArchivos crearListaArchivos() { ListaArchivos * lista = new ListaArchivos; (* lista) -> arch = NULL; возвращение * списокa; } Прямо сейчас, это так, я думаю, что я выделил память, но все равно ошибка сохраняется – Bastian

+0

нет у вас нет. память выделяется только один раз, в то время как вам нужны распределения памяти, как предложено в приведенном выше ответе –

+0

@Bastian: crearListaArchivos() {ListaArchivos * lista = new ListaArchivos; (* lista) = новый _listaArchivos; (* Lista) -> арка = NULL; return * lista; } –

0
ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista; 

     (*lista)->arch=NULL; 

     return *lista; 
    } 

Не создает ничего. Он просто объявляет переменную и возвращает ее. Это не очень хороший способ.

Попробуйте что-нибудь подобное.

ListaArchivos crearListaArchivos(){ 
     ListaArchivos *lista = new ListaArchivos(); 

     lista->arch=NULL; 

     return *lista; 
    } 

И прочитал на указатели, память, и, конечно же, эта ссылка здесь

resource aquisition is initialization

+1

все еще прослушивается, это двойной указатель, ему нужны два выделения –

+0

Где вы видите здесь «**»? NULL отлично подходит для арки. По крайней мере, из фрагмента в вопросе. –

+0

Это все еще прослушивается, да.Вы видите, что мне нужно сделать, чтобы составить список struct _archivo, тип для этого списка - listaArchivo. В crearListaArchivos() идея объявить, инициализировать и вернуть список «lista» _archivo. – Bastian

Смежные вопросы