HPC.ru lite - Все форумы
Форум: Программирование для КПК
Тема: Проверьте, что не так! (Прога для WM2003)

[Ответить]
WhiteWind [23.02.2006 17:29] Проверьте, что не так! (Прога для WM2003):
Итак, во время работы следующий код безо всяких криков об фатальной ошибке перестает выполняться!
Задача прочитать строчку из файла в ANSI и отобразить её. Ну хотябы где-нибудь для начала...

void FReadFile(CString strFileName, CStrings& lines)
{
LPCTSTR fName;
fName =(LPCTSTR)strFileName;
ifstream file(fName);
LPWSTR temp_str;
while (!file.eof())
{
string line;
getline(file, line);
int size=MultiByteToWideChar(1251, 0,line.c_str(),
line.length(),temp_str,0);
temp_str=_T(" ");
MultiByteToWideChar(1251, 0,line.c_str(), line.length(),
temp_str,size);//Тут собственно и вылетает
CString res(temp_str);
lines.push_back(res);
}
}

Если строчку temp_str=_T(" "); убрать - всё работает, однако новая строка записывается поверх старой. Получается такая дребедень...Читаем:
123456789
Текст
Получаем при втором чтении:
Текст6789
Как быть?

З.Ы.
typedef vector<CString> CStrings;
Ginger [24.02.2006 15:30] Re: Проверьте, что не так! (Прога для WM2003):
Да у тебя тут ошибка на ошибке!
Конечно, ты не правильно написал и то что вылетаешь на этом месте совершенно спроведливо - нарушение доступа к памяти!
Но тебе еще повезло, что ты не одну строчку записывал и заметил эту ошибку. Так как у тебя здесь более серьзные ошибки есть, которые могли потом привести либо к падению программы, либо к тому, что ты ооочень долго бы удивлялся, что твоя строчка в процессе выполнения программы сама по себе менялась бы! =)))
Вообщем, тебе надо разобраться с переменными, которые выделяются в стеке и в куче - это очень важно. При чем даже если ты писал раньше на дельфи, то так же обязан был бы это знать!
Вот так надо:

class CStrings: public vector<CString*>;

void FReadFile(CString strFileName, CStrings& lines)
{
LPCTSTR fName;
fName =(LPCTSTR)strFileName;
ifstream file(fName);
LPWSTR temp_str;
while (!file.eof())
{
string line;
getline(file, line);
CString* pres = new CString();
int len = line.length();
MultiByteToWideChar(1251, 0, line.c_str(), len, pstr->GetBuffer (len+1), len);
lines.push_back(pres);
}
}

// А где-нибудь конце работы программы,
// на пример в деструкторе твоего CStrings
CStrings::~CStrings()
{
for (iterator i = begin(); i != end(); i++)
delete *i;
clear();
}

WhiteWind [26.02.2006 16:00] :
Спасибо! Действительно я видимо ещё недоучив язык уже хочу много... Дело в том, что в делфях объекты требующие создания просто не заработают и всё. К ним нельзя обратиться пока не вызовешь конструктор. А строки там вообще наряду со стандартными переменными, конструктор им не требуется. Вот я и пытался по старинке....
Мда... Тут всё посложнее, хотя и намного мощнее. Теперь я понимаю тех, кто делфи не считает за серьёзную среду. Они конечно не правы, но доля истины в их словах есть.
Ещё раз спасибо...
Ginger [27.02.2006 17:07] :
Да нет, в дельфи все точно также: то же стек, та же куча, просто он делает все, что я написал, за тебя и скрывает это от тебя - потому что библиотека великолепно продумана - вот и создается впечатление, что там все само происходит! =)

То что ты назвал "в делфях объекты требующие создания просто не заработают" на языке программирования звучит следующим образом "объекты библиотеки VCL создавать в стеке нельзя, они должны быть созданы только в куче". Правда?

А на счет последней твоей фразы:" Теперь я понимаю тех, кто делфи не считает за серьёзную среду. Они конечно не правы, но доля истины в их словах есть."
Ни хрена истины в их словах нет! В их словах зучит роспись либо в своей программистской без грамотности, либо лень матушка учиться чемуто новому (уж больно задолбался им MFC в голову, вот и думаю, что все библиотеки такие же кривые как эта).
WhiteWind [01.03.2006 18:29] :
Вот в этом-то и проблема... Пишу я на Делфи, пишу много, продаю и зарабатываю этим. А таких вещей не знаю - ибо избалован автоматизмом. Да, делфя всё за меня делает. Я это всегда понмал, собственно подозревая, что я смогу больше контролировать свои программы и уменьшить размер итогового файла решил учить С++. Ну согласен, согласен, я с последним заявлением. Я же не говорю что делфи отстой! Я наоборот всегда уважал и буду уважать эту среду. Вот только для своих целей где-то лучше VC++. А где-то (хоть те же БД) делфям нет равных. А MFC мнея и правда несколько разочаровал. Я в общем-то считал, что это мне с непривычки кажется... Неужели всё так плохо?
Ещё раз спасибо за ответ...
WhiteWind [01.03.2006 19:03] :
Ну я чего тупой вообще чтоль?
Ну почему он всё время ругается на очевидные вещи?
.\FunctionTesterDlg.cpp(116) : error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'CString *' to 'const CString &'
Ругается на строку lines.push_back(c_line);
(в данном случае это уже указатель...).

И это не единственный пример! Я вынужден указывать преобразовакния типов которые во всех примерах и всех книгах проходят!

Или дело в глюках 2005 версии?

Просто для меня пока неясно, какого фига столько родственных типов которые не имеют простых методов преобразвания друг в друга...

З.Ы.
Ginger, спасибо большое, я понял как работает этот вектор и в чём ошибка была. Он как делфевый TList, динамеческий массив указателей с удобной оберткой... Непривычно пока всё...
LuceferAB [05.03.2006 23:43] Ха:
Тоже пишу на Дельфи, и скажу там прибамбасов на всех хватит.
Чего стоит только извращение вывода обычной строки в поток (например в TFileStream). Это ж надо было додуматься - для этого написать:
varTFileStream(Pointer(varString)^, Length(varString));
И ООП в дельфях конечно сильно искажено. Начиная с отсутствия множественного наследования и заканчивая ручным вызовом деструкторов... Хотя надо отдать должное качеству IDE и проработанности справочной системы. После этого в VS так и хочется то с контролом на вызов функции кликнуть, то Ctrl+Shift со стрелками вверх/вниз нажимаешь
[Ответить]