nano-stalker Temat założony przez niniejszego użytkownika |
Access violation writing location error. » 2015-07-05 21:53:30 Witam. Piszę własną pomocniczą bibliotekę do tworzenia logów itp. i napotkałem kilka problemów mimo że niedawno to wszystko działało... Access violation writing location, właśnie taki błąd wyskakuje w okienku, mimo że kod kilka minut wcześniej działał. Przepraszam za tak żenujący opis problemu, ale nie wiem jak go opisać. "active CXX0030: Error: expression cannot be evaluated" takie coś mam w tym podglądzie (add watch) co to oznacza? Proszę oto kod, jest dość długi i zdaje się że mało zrozumiały... Aha i błąd występuje na końcu pliku Log.cpp. main.cpp #include "Logger.h" #include "Loader.h" #include <iostream>
using namespace ml; using std::cin;
void main() { std::cout << "Hello world!\n"; Loader load; cout << "\nDodawanie adresu"; if( load.adres( "C:/Info.log" ) ) cout << "\nOtworzono!"; cout << "\nPrzypisywanie..."; load.debugMode( "C:/DebugMode.log" ); load.setBreaker( '"' ); cout << "\n\nMa na imię: " << load.strLoad( "name=" ) << endl; cout << "Lubi: " << load.strLoad( "like=" ) << endl; cout << "Ma lat: " << load.intLoad( "lat=" ) << endl; cout << "Nazwisko: " << load.strLoad( "nazwisko=" ) << endl; cin.get(); }
Log.h
#pragma once
#include <string> #include <fstream>
using std::string; using std::fstream;
namespace ml { class Log { public: Log( void ); ~Log( void ); private: void addNote( char ); void addNote( string ); void addNote( int ); void addNote( float ); void addNote( double ); bool openFromPath( string ); bool isReady(); void activateLogging( bool ); fstream logfile; string path; friend class Logger; bool endlInfo; bool numerationOn; int numerationInfo; bool active; }; }
Log.cpp #include "Log.h"
using namespace ml;
Log::Log() { endlInfo = true; active = true; numerationOn = false; numerationInfo = 0; }
Log::~Log() { }
void Log::addNote( char text ) { if( active ) if( isReady() ) logfile << text; else if( openFromPath( path ) ) if( isReady() ) logfile << text; }
void Log::addNote( string text ) { if( isReady() ) logfile << text; else if( openFromPath( path ) ) if( isReady() ) logfile << text; }
void Log::addNote( int liczba ) { if( active ) if( isReady() ) logfile << liczba; else if( openFromPath( path ) ) if( isReady() ) logfile << liczba; }
void Log::addNote( float liczba ) { if( active ) if( isReady() ) logfile << liczba; else if( openFromPath( path ) ) if( isReady() ) logfile << liczba; }
void Log::addNote( double liczba ) { if( active ) if( isReady() ) logfile << liczba; else if( openFromPath( path ) ) if( isReady() ) logfile << liczba; }
bool Log::openFromPath( string path ) { logfile.open( path, std::ios::out ); if( logfile.bad() ) return false; else return true; }
bool Log::isReady() { if( logfile.is_open() ) return true; else return false; }
void Log::activateLogging( bool yesNo ) { active = yesNo; }
Logger.h #pragma once
#include "MicroLib.h" #include "Log.h"
namespace ml { class Logger { public: Logger( void ); ~Logger( void ); void addKernel( Log & kernel ); bool addPath( string sciezka_do_pliku ); void openKernel( Log * kernel ); Log * issueLog(); Log & adrssueLog(); void add( string ); void add( string, int ); void add( int, string ); void add( int ); void add( string, int, string ); void add( int, string, int ); void add( float ); void add( string, float ); void add( float, string ); void add( float, string, float ); void add( string, float, string ); void add( double ); void add( string, double ); void add( double, string ); void add( double, string, double ); void add( string, double, string ); void addHead( string znak ); void addHead( string znak, int liczba_powtorzen ); void addHead( string znak, int liczba_powtorzen, int liczba_linii ); void prefix( string ); void prefixOn( bool ); void suffix( string ); void suffixOn( bool ); void numerationOn( bool ); void endlOn( bool ); void logActive( bool ); protected: Log * log; bool endlineOnInfo; bool numerationOnInfo; bool prefixOnInfo; bool suffixOnInfo; bool kernelHasLoaded; string prefixUsed; string suffixUsed; private: void addNumeration(); void addPrefix(); void addSuffix(); void addEndl(); }; }
Loader.h #include "Logger.h" #include <string> #include <fstream>
using namespace std;
namespace ml { const string BUG_NOTFIND = "<[BUG_OF_LOAD_NOTFIND]>"; class Loader { public: Loader(); ~Loader(); bool adres( string ); bool adres( ifstream & ); string strLoad( string ); int intLoad( string ); long lngLoad( string ); double dubLoad( string ); void setBreaker( char ); void debugMode( string ); void debugMode( Log & ); protected: ifstream * file; string * bufor; char breaker; private: Logger log; string fileAdres; }; }
Loader.cpp #include "Loader.h"
using namespace ml;
Loader::Loader() { fileAdres.clear(); file = NULL; file = new ifstream; log.logActive( false ); log.prefix( "[_MicroLib::LoaderDebugger_]" ); }
Loader::~Loader() { }
bool Loader::adres( string adres ) { file->open( adres ); if( file->is_open() ) { fileAdres = adres; return true; } else return false; }
bool Loader::adres( ifstream & file ) { if( file.is_open() ) { this->file = & file; return true; } else return false; }
string Loader::strLoad( string findThis ) { log.add( "\n\n\nRozpoczynam poszukiwanie: " + findThis ); log.add( "Wczytuję plik..." ); string * buf; buf = new string; findThis += breaker; if( file->is_open() ) { file->seekg( 0 ); while( !file->eof() ) { log.add( "Pobieram dane..." ); getline( * file, * buf ); if( * buf == "" && file->eof() ) { log.add( BUG_NOTFIND ); return BUG_NOTFIND; } if( !buf->find( findThis ) ) { log.add( "Znalezłem w linii: " + * buf ); break; } else if( file->eof() ) { log.add( BUG_NOTFIND ); return BUG_NOTFIND; } } } string out; log.add( "Rozpoczynam obróbkę..." ); out.insert( 0, * buf, findThis.size(), buf->size() - findThis.size() - 1 ); log.add( "Wyjście [STR]: " + out ); delete buf; return out; }
int Loader::intLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [INT]: ", atoi( tmp->c_str() ) ); return atoi( tmp->c_str() ); } }
double Loader::dubLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [DOUBLE]: ", atof( tmp->c_str() ) ); return atof( tmp->c_str() ); } }
long Loader::lngLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [LONG]: ", atol( tmp->c_str() ) ); return atol( tmp->c_str() ); } }
void Loader::setBreaker( char breaker ) { this->breaker = breaker; }
void Loader::debugMode( string path ) { Log logKernel; log.addKernel( logKernel ); if( log.addPath( path ) ); log.logActive( true ); }
void Loader::debugMode( Log & logKernel ) { log.openKernel( & logKernel ); log.logActive( true ); }
Program przestał działać gdy zacząłem pisać activateLogging( bool ); dodałem if( active ) w addNote(...). Chodzi o to żeby doprowadzić ten kod do stanu żeby nie wyrzucał tego wyjątku... Wszystkie pliki są zapisywane na C:/ Można to zmienić. Za wszelkie odpowiedzi z Waszej strony dziękuję. PS. jak używać wyszukiwarki w Waszym serwisie? |
|
pekfos |
» 2015-07-05 22:03:35 Ten kod jest pełen niepotrzebnych alokacji, wycieków pamięci i powtarzającego się kodu. Gdzie Logger.cpp? Aha i błąd występuje na końcu pliku Log.cpp. |
Czyli gdzie..? PS. jak używać wyszukiwarki w Waszym serwisie? |
Upoważniam do skorzystania z Google. W naszym serwisie nie ma wyszukiwarki ;) void Loader::debugMode( string path ) { Log logKernel; log.addKernel( logKernel ); if( log.addPath( path ) ); log.logActive( true ); } |
Zapisujesz adres zmiennej lokalnej i używasz jej, po jej zniszczeniu. |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-07-05 22:10:26 Przepraszam oto Logger.cpp #pragma once
#include "Logger.h" using namespace ml;
Logger::Logger() { log = NULL; endlineOnInfo = false; numerationOnInfo = false; prefixOnInfo = false; suffixOnInfo = false; prefixUsed = ""; suffixUsed = ""; }
Logger::~Logger() { }
void Logger::addKernel( Log & kernel ) { log = & kernel; endlineOnInfo = log->endlInfo; numerationOnInfo = log->numerationOn; }
void Logger::openKernel( Log * kernel ) { log = kernel; endlineOnInfo = log->endlInfo; numerationOnInfo = log->numerationOn; }
Log * Logger::issueLog() { return log; }
bool Logger::addPath( string path ) { if( !log->openFromPath( path ) ) return false; else return true; }
void Logger::add( string text ) { addNumeration(); addPrefix(); log->addNote( text ); addEndl(); }
void Logger::add( string text, int liczba ) { addNumeration(); addPrefix(); log->addNote( text ); log->addNote( liczba ); addEndl(); }
void Logger::add( int liczba, string text ) { addNumeration(); addPrefix(); log->addNote( liczba ); log->addNote( text ); addEndl(); }
void Logger::add( int liczba ) { addNumeration(); addPrefix(); log->addNote( liczba ); addEndl(); }
void Logger::add( string text1, int liczba, string text2 ) { addNumeration(); addPrefix(); log->addNote( text1 ); log->addNote( liczba ); log->addNote( text2 ); addEndl(); }
void Logger::add( int liczba1, string text, int liczba2 ) { addNumeration(); addPrefix(); log->addNote( liczba1 ); log->addNote( text ); log->addNote( liczba2 ); addEndl(); }
void Logger::add( float liczba ) { addNumeration(); addPrefix(); log->addNote( liczba ); addEndl(); }
void Logger::add( string text, float liczba ) { addNumeration(); addPrefix(); log->addNote( text ); log->addNote( liczba ); addEndl(); }
void Logger::add( float liczba, string text ) { addNumeration(); addPrefix(); log->addNote( liczba ); log->addNote( text ); addEndl(); }
void Logger::add( float liczba1, string text, float liczba2 ) { addNumeration(); addPrefix(); log->addNote( liczba1 ); log->addNote( text ); log->addNote( liczba2 ); addEndl(); }
void Logger::add( string text1, float liczba, string text2 ) { addNumeration(); addPrefix(); log->addNote( text1 ); log->addNote( liczba ); log->addNote( text2 ); addEndl(); }
void Logger::add( double liczba ) { addNumeration(); addPrefix(); log->addNote( liczba ); addEndl(); }
void Logger::add( string text, double liczba ) { addNumeration(); addPrefix(); log->addNote( text ); log->addNote( liczba ); addEndl(); }
void Logger::add( double liczba, string text ) { addNumeration(); addPrefix(); log->addNote( liczba ); log->addNote( text ); addEndl(); }
void Logger::add( double liczba1, string text, double liczba2 ) { addNumeration(); addPrefix(); log->addNote( liczba1 ); log->addNote( text ); log->addNote( liczba2 ); addEndl(); }
void Logger::add( string text1, double liczba, string text2 ) { addNumeration(); addPrefix(); log->addNote( text1 ); log->addNote( liczba ); log->addNote( text2 ); addEndl(); }
void Logger::addHead( string znak ) { for( int i = 0; i <= 20; i++ ) log->addNote( znak ); addEndl(); }
void Logger::addHead( string znak, int liczba_powtorzen ) { for( int i = 0; i <= liczba_powtorzen; i++ ) log->addNote( znak ); addEndl(); }
void Logger::addHead( string znak, int liczba_powtorzen, int liczba_linii ) { for( int a = 0; a <= liczba_linii; a++ ) { for( int i = 0; i <= liczba_powtorzen; i++ ) log->addNote( znak ); log->addNote( "\n" ); } addEndl(); }
void Logger::addNumeration() { if( numerationOnInfo == true ) { log->addNote( log->numerationInfo ); log->addNote( ". " ); log->numerationInfo += 1; } }
void Logger::addPrefix() { if( prefixOnInfo == true ) log->addNote( prefixUsed ); }
void Logger::addSuffix() { if( suffixOnInfo == true ) log->addNote( suffixUsed ); }
void Logger::addEndl() { if( endlineOnInfo == true ) log->addNote( "\n" ); }
void Logger::numerationOn( bool on ) { if( on == true ) { log->numerationOn = true; numerationOnInfo = true; } else if( on == false ) { log->numerationOn = false; numerationOnInfo = false; } else add( "Error: błąd w ustawieniu w metody numeracji [OnTheCode]" ); }
void Logger::prefixOn( bool on ) { if( on == true ) prefixOnInfo = true; else if( on == false ) prefixOnInfo = false; else add( "Error: błąd w ustawieniu metody prefix'u [OnTheCode]" ); }
void Logger::suffixOn( bool on ) { if( on == true ) suffixOnInfo = true; else if( on == false ) suffixOnInfo = false; else add( "Error: błąd w ustawieniu metody suffix'u [OnTheCode]" ); }
void Logger::endlOn( bool on ) { if( on == true ) endlineOnInfo = true; else if( on == false ) endlineOnInfo = false; else add( "Error: błąd w ustawieniu metody końca linii (endl) [OnTheCode]" ); }
void Logger::prefix( string prefix ) { prefixUsed = prefix; prefixOnInfo = true; }
void Logger::suffix( string suffix ) { prefixUsed = suffix; suffixOnInfo = true; }
void Logger::logActive( bool yesNo ) { log->activateLogging( yesNo ); }
Właśnie coś patrzę że ta wyszukiwarka nie chce ze mną współpracować :) Błąd moim zdaniem znajduję się w void Logger::logActive( bool yesNo ) { log->activateLogging( yesNo ); }
Dzięki. Kod będę musiał jeszcze dopracować... |
|
pekfos |
» 2015-07-05 22:18:47 Błąd moim zdaniem znajduję się w |
Napisałem, gdzie jest błąd. |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-07-05 22:30:47 Kodu jeszcze nie poprawiłem, ale tak masz rację. Dziękuję :) nawet nie skompilowałeś... wkleić potem tu poprawiony kod? |
|
pekfos |
» 2015-07-05 23:00:15 Wklej rozwiązanie i zamknij temat, jeśli problem został rozwiązany ;) |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-07-06 20:46:06 A oto poprawione pliki :) Loader.h #include "Logger.h" #include <string> #include <fstream>
using namespace std;
namespace ml { const string BUG_NOTFIND = "<[BUG_OF_LOAD_NOTFIND]>"; class Loader { public: Loader(); ~Loader(); bool adres( string ); bool adres( ifstream & ); string strLoad( string ); int intLoad( string ); long lngLoad( string ); double dubLoad( string ); void setBreaker( char ); void debugMode( string ); void debugMode( Log & ); protected: ifstream * file; string * bufor; char breaker; private: Log * logKernel; Logger log; string fileAdres; }; }
Loader.cpp #include "Loader.h"
using namespace ml;
Loader::Loader() { fileAdres.clear(); file = NULL; file = new ifstream; }
Loader::~Loader() { }
bool Loader::adres( string adres ) { file->open( adres ); if( file->is_open() ) { fileAdres = adres; return true; } else return false; }
bool Loader::adres( ifstream & file ) { if( file.is_open() ) { this->file = & file; return true; } else return false; }
string Loader::strLoad( string findThis ) { log.add( "\n\n\nRozpoczynam poszukiwanie: " + findThis ); log.add( "Wczytuję plik..." ); string * buf; buf = new string; findThis += breaker; if( file->is_open() ) { file->seekg( 0 ); while( !file->eof() ) { log.add( "Pobieram dane..." ); getline( * file, * buf ); if( * buf == "" && file->eof() ) { log.add( BUG_NOTFIND ); return BUG_NOTFIND; } if( !buf->find( findThis ) ) { log.add( "Znalezłem w linii: " + * buf ); break; } else if( file->eof() ) { log.add( BUG_NOTFIND ); return BUG_NOTFIND; } } } string out; log.add( "Rozpoczynam obróbkę..." ); out.insert( 0, * buf, findThis.size(), buf->size() - findThis.size() - 1 ); log.add( "Wyjście [STR]: " + out ); delete buf; return out; }
int Loader::intLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [INT]: ", atoi( tmp->c_str() ) ); return atoi( tmp->c_str() ); } }
double Loader::dubLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [DOUBLE]: ", atof( tmp->c_str() ) ); return atof( tmp->c_str() ); } }
long Loader::lngLoad( string findThis ) { string * tmp = new string; * tmp = strLoad( findThis ); log.add( "Kończenie..." ); if( * tmp == BUG_NOTFIND ) { delete tmp; return NULL; } else { log.add( "Wyjście [LONG]: ", atol( tmp->c_str() ) ); return atol( tmp->c_str() ); } }
void Loader::setBreaker( char breaker ) { this->breaker = breaker; }
void Loader::debugMode( string path ) { logKernel = new Log; log.openKernel( logKernel ); log.prefix( "[_MicroLib::LoaderDebugger_]" ); if( log.addPath( path ) ) log.logActive( true ); }
void Loader::debugMode( Log & logKernel ) { this->logKernel = & logKernel; log.openKernel( this->logKernel ); log.logActive( true ); }
A rozwiązaniem tak jak wyżej napisał pekfos jest: void Loader::debugMode( string path ) { logKernel = new Log; log.openKernel( logKernel ); log.prefix( "[_MicroLib::LoaderDebugger_]" ); if( log.addPath( path ) ) log.logActive( true ); }
A w pliku Loader.h musiałem dodać wskaźnik na obiekt Log: Dzięki jeszcze raz :) jeśli ktoś chce używać (tego co tu jest nie radzę...) to niedługo umieszczę wersję z obsługą błędów i bardziej rozbudowaną na tym forum (a tak dla ludzi leniwych ;) ) |
|
« 1 » |