.at() probleme



  • hier mal der Quelltext:

    conflib.cpp

    #include <iostream>
    #include <stdlib.h>   //exit();
    
    #include "conflib.hpp"
    
       conf Zeilen;
       conf Conf;
       conf Linien;
    
        void confLoad(const char *Pfad)
        {
    
            Conf.File.open(Pfad, std::ios::in);
    
            while(!Conf.File.eof())
            {
                Conf.File.getline(Linien.linie, 1024);
                Zeilen.zeile.push_back(Linien.linie);
            }
    
        }
    
        void confClose()
        {
            Conf.File.close();
        }
    
        void confSave(const char *Name)
        {
            Conf.File.open(Name, std::ios::out);
        }
    

    conflib.hpp

    #ifndef CONFLIB_HPP_INCLUDED
    #define CONFLIB_HPP_INCLUDED
    
    #include <string>
    #include <vector>
    #include <fstream>
    
    struct conf
    {
        char linie[1024];
        std::fstream File;
        std::vector <std::string> zeile;
    };
    
    extern conf Zeilen;
    extern conf Conf;
    extern conf Linien;
    
    #endif // CONFLIB_HPP_INCLUDED
    

    conflib_aus

    #include <stdlib.h>   //exit();
    #include <iostream>
    
    #include "conflib.hpp"
    #include "conflib_aus.hpp"
    
        conf_aus Search;
        conf_aus A;
        conf_aus E;
        conf_aus Var;
    
        void confGroup(const char *Group_Name)
        {
    
            for(unsigned int i=0; i < Zeilen.zeile.size(); i++)
            {
               int Ende_Name = Zeilen.zeile[i].size();
    
                    if(Zeilen.zeile[i].at(0) == '[' && Zeilen.zeile[i].at(Ende_Name-1) == ']')
                    {
                       Search.Name = Zeilen.zeile[i].substr(1, Ende_Name-1);
    
                       A.Anfang_Group = i + 1;
                       do
                       {
                           i++;
                       }while(Zeilen.zeile[i].at(0) != '[');
                       E.Ende_Group = i - 1;
                    }
    
            }
    
            if(Group_Name != Search.Name.c_str())
            {
                exit(0);
            }else{
                exit(-1);
            }
    
        }
    
        void confRead(const char *Group_Name, const char *Read_Name)
        {
            for(int i = A.Anfang_Group; i < E.Ende_Group; i++)
            {
                int j=0;
                if(Zeilen.zeile[i].at(j) != '=')
                {
                    j++;
                }
    
                if(Read_Name == Zeilen.zeile[i].substr(0, j))
                {
                    exit(0);
                }else{
                    exit(-1);
                }
    
                Var.Name_Var = Zeilen.zeile[i].substr(j+1);
            }
            std::cout << Var.Name_Var << std::endl;
        }
    

    conflib_aus.hpp

    #ifndef CONFLIB_AUS_HPP_INCLUDED
    #define CONFLIB_AUS_HPP_INCLUDED
    
    #include <string>
    
    struct conf_aus
    {
        std::string Name;
        int Anfang_Group;
        int Ende_Group;
        std::string Name_Var;
    };
    
    extern conf_aus Search;
    extern conf_aus A;
    extern conf_aus E;
    extern conf_aus Var;
    
    #endif // CONFLIB_AUS_HPP_INCLUDED
    

    Debug den Quelltext bitte ich weiß nicht was ich falsch mach.



  • Ich debugge deinen Quelltext jetzt nicht, du musst schon selbst schauen, wo dein Fehler auftritt (hast du einen Breakpoint gesetzt?).

    Was mir auffällt, ist dass du in der Datei conflib_aus.cpp mehrfach die Funktion exit() wahrscheinlich falsch verwendest (meinst du da break?).

    Außerdem benutzt du die Funktion at() nur in der Datei conflib_aus.cpp, von daher musst du auch nur dort schauen, vermutlich greifst du auf einen char im string zu, obwohl der string nicht so lange ist.



  • so ich hab den Fehler durch ausprobieren herraus bekommen wo die .at() den Fehler verursachen:

    [cpp] for(unsigned int i=0; i < Zeilen.zeile.size(); i++)
    {
    int Ende_Name = Zeilen.zeile[i].size();

    if(Zeilen.zeile[i][0] == '[' && Zeilen.zeile[i].at(Ende_Name-1) == ']')
    {
    Search.Name = Zeilen.zeile[i].substr(1, Ende_Name-1);

    A.Anfang_Group = i + 1;
    do
    {
    i++;
    }while(Zeilen.zeile[i][0] != '[');
    E.Ende_Group = i - 1;
    }

    }[/cpp]
    Das hat der Debugger mir nicht angezeigt.



  • Hast du dir schon den Hinweis von Fellhuhn auf der 2. Seite angeschaut?



  • ja das hab ich auch weg gemacht.



  • In Zeile 27 von conflib_aus prüfst du nicht, ob i außerhalb der Vektorgrößen liegt.



  • Ich prüfe in der Zeile i ob der erste Buchstabe [ ist.

    Edit:
    Der debugger zeigt mit das an:

    Building to ensure sources are up-to-date
    Build succeeded
    Selecting target: 
    Debug
    Adding source dir: /media/nico_/sicherung/ubuntu/Projekt/conflib/
    Adding source dir: /media/nico_/sicherung/ubuntu/Projekt/conflib/
    Adding file: libconflib.a
    Starting debugger: 
    done
    Registered new type: wxString
    Registered new type: STL String
    Registered new type: STL Vector
    Setting breakpoints
    Debugger name and version: GNU gdb (GDB) 7.1-ubuntu
    No symbol table is loaded.  Use the "file" command.
    Breakpoint 1 ("/media/nico_/sicherung/ubuntu/Projekt/conflib/conflib_aus.cpp:27) pending.
    No symbol table is loaded.  Use the "file" command.
    Breakpoint 2 ("/media/nico_/sicherung/ubuntu/Projekt/conflib/conflib_aus.cpp:19) pending.
    


  • gamebuntu schrieb:

    Ich prüfe in der Zeile i ob der erste Buchstabe [ ist.

    Aber nicht, ob die Zeile i existiert.



  • nein nur ob in der zeile die [ am anfang steht.



  • gamebuntu schrieb:

    nein nur ob in der zeile die [ am anfang steht.

    Hargnnn, das sollte ein Hinweis auf Verbesserung sein!!



  • ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
    bin ich so dooooooooooooooooooooooofffffffffffff 🙄
    Stimmt du hast recht ich muss noch prüfen ob es die Zeile überhaupt gibt. 😃



  • Ohne dich wäre ich nie trauf gekommen danke. 😃


Anmelden zum Antworten