0

マイコードに問題があります。実行するとクラッシュします...デバッグ中に「セグメンテーション違反」エラーが表示されます。しかし、私はバグを見つけることができません。コードは次のとおりです。

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 を呼び出すと、問題が発生します。残りはうまく機能しているようです。このバグを解決する方法を知っている場合は、助けてください。どうもありがとうございます!:)

4

2 に答える 2

0
 ListaArchivos crearListaArchivos(){
        ListaArchivos *lista;

        (*lista)->arch=NULL;

       return *lista;
    }

何も作成しません。変数を宣言して返すだけです。これはあまり良い方法ではありません。

のようなものを試してみてください。

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

        lista->arch=NULL;

       return *lista;
    }

そして、ポインタ、メモリ、そしてもちろん、このリンクを読んでください

リソース取得は初期化です

于 2013-11-02T19:45:20.697 に答える