Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cout <<"a" спасает.. почему..(неясный exeption) 
:(
    Опции темы
LuckLess
Дата 8.5.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



есть прога...

пишу чтото вроде маленькой базы данных..
в ней есть метод LoadDB и SaveDB ..
LoadDB еще пока никак не тестировался... поэтому на него не смотрите..
а вот с SaveDB() проблема такая...

файл создаеться ...
и тут 2 варианта..
1) в коде нету cout << "a";
файл создаеться .. а затем exeption...
2)в коде есть cout <<"a"
файл создается , в него пишеться все праллно .. кроме первой записи login/hash которая почемуто неправельная..

выкладываю код.. порезанный в местах которые я щитаю неважными..
в аттаче весь код...
Код


using namespace std;


class Pair{
char *name;
short hash;

Pair(char* a, short hs){
name=new char[strlen(a)+1];
strcmp(name,a);
hash=hs;
}

public:

short CalcHash(char *str){
short ret=0;
for (int i=0;i<strlen(str);i++) ret+=str[i]*(i+1);
return ret;
}

Pair(char *a,char *b="") {
name=new char[strlen(a)+1];
strcpy(name,a);
hash=CalcHash(b);
}

Pair(const Pair& p){
name = new char[strlen(p.name)+1];
strcpy(name,p.name);
hash=p.hash;
}

Pair& operator=(const Pair& p){
name = new char[strlen(p.name)+1];
strcpy(name,p.name);
hash=p.hash;
return *this;
}

~Pair(){
delete[] name;
}

friend class MyDb;
};



class MyDb :public vector<Pair>{
    const char* GetLogin(int i) {return (*this)[i].name;}
    int GetPasswd(int i) {return (*this)[i].hash;}
    void AddEl(char *a,short hs){
    push_back(Pair(a,hs));
    }

public:


    BOOL AddNew(char *a,char *b=""){
        BOOL unic=TRUE;
        for(iterator bg=begin(), nd=end(); bg!=nd;bg++){
            if (!strcmp(bg->name,a)){
                unic=FALSE;
                break;
            }
        }
        if (unic)push_back(Pair(a,b));
    return unic;
    }

    
// zapisivaem bazu dannih!!
    BOOL SaveDB(char *FileName){
        HANDLE hFile=CreateFile(FileName,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        if (hFile==INVALID_HANDLE_VALUE){
        return FALSE;
        }
        int iFilesz=1024*1024;
        HANDLE hFileMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,iFilesz,NULL);
        if (hFileMap==NULL){
        return FALSE;
        }

        char *text=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
        if (text==NULL){
        return FALSE;
        }

        memset((void*)text,0,iFilesz);

        int sm=0;

        for(int i=0;i<size();i++){
            char *nlog=text;
            nlog+=sm;
            sm+=(int)strlen(GetLogin(i))+1;
            
            char *cpass;
            cpass=_itoa((int)GetPasswd(i),cpass,10);
            char *npas=text;
            npas+=sm;
            sm+=(int)strlen(cpass)+1;
            cout <<"a";  // ВОД ЭТО МАГИЧЕСКИЙ cout !!!
            if(sm<iFilesz){
                strcpy(nlog,GetLogin(i));
                strcpy(npas,cpass);
            }else break;

        }
    UnmapViewOfFile(text);
    CloseHandle(hFileMap);
    CloseHandle(hFile);
    return TRUE;

    }
//!zapisivaem bazu dannih!

};





void main(void){
MyDb db;
db.AddNew("Vasya","123z");
db.AddNew("Dima","ponchik");
db.AddNew("Kolya","qweasd");

db.SaveDB("db.txt");
_getch();
}



Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  DBmain.cpp
PM MAIL   Вверх
chipset
Дата 9.5.2005, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(LuckLess @ 8.5.2005, 11:54)
1) в коде нету cout << "a";
файл создаеться .. а затем exeption...

А что за exception?
Цитата(LuckLess @ 8.5.2005, 11:54)
            char *npas=text;

Довольно странная операция, после
Цитата(LuckLess @ 8.5.2005, 11:54)
            char *nlog=text;

Таким образом, вроде бы, у тебя получается три одинаковых указателя nlog,npas, и text.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
LuckLess
Дата 9.5.2005, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



Код

char *npas=text;
npas+=sm;  //sm -- смещение от text

sm+=(int)strlen(GetLogin(i))+1; // меняем смещение

char *nlog=text;
nlog+=sm;  

sm+=(int)strlen(cpass)+1;




exeption -- ктото пишет в область памяти .. куда писать нельзя..
PM MAIL   Вверх
LuckLess
Дата 9.5.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



ошибка тут
try{
strcpy(nlog,GetLogin(i));
strcpy(npas,cpass);}
catch(...){
cout <<"error";
break;
}
Добавлено @ 13:29
хотя если в main()
раскоментировать
cout << db;
то exeption вылазит где еще...

сойду с ума...))
PM MAIL   Вверх
LuckLess
Дата 10.5.2005, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 15.9.2004

Репутация: 1
Всего: 1



нашол ошибку...
забыл выделить память под cpass.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.