Проверьте, что не так! (Прога для WM2003)

Средства разработки, технические вопросы, отвечает (по мере сил) Отдел Разработок
Закрыто
WhiteWind
Студент (1 lvl)
Сообщения: 35
Зарегистрирован: Вт янв 31, 2006 20:46

Проверьте, что не так! (Прога для WM2003)

Сообщение WhiteWind » Чт фев 23, 2006 17:29

Итак, во время работы следующий код безо всяких криков об фатальной ошибке перестает выполняться!
Задача прочитать строчку из файла в 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;[/b]
:p
i-mate PDA2, 512mb

Ginger
Кандидат (3 lvl)
Сообщения: 151
Зарегистрирован: Вс июл 20, 2003 11:03

Re: Проверьте, что не так! (Прога для WM2003)

Сообщение Ginger » Пт фев 24, 2006 15:30

Да у тебя тут ошибка на ошибке!
Конечно, ты не правильно написал и то что вылетаешь на этом месте совершенно спроведливо - нарушение доступа к памяти!
Но тебе еще повезло, что ты не одну строчку записывал и заметил эту ошибку. Так как у тебя здесь более серьзные ошибки есть, которые могли потом привести либо к падению программы, либо к тому, что ты ооочень долго бы удивлялся, что твоя строчка в процессе выполнения программы сама по себе менялась бы! =)))
Вообщем, тебе надо разобраться с переменными, которые выделяются в стеке и в куче - это очень важно. При чем даже если ты писал раньше на дельфи, то так же обязан был бы это знать!
Вот так надо:

Код: Выделить всё

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
Студент (1 lvl)
Сообщения: 35
Зарегистрирован: Вт янв 31, 2006 20:46

Сообщение WhiteWind » Вс фев 26, 2006 16:00

Спасибо! Действительно я видимо ещё недоучив язык уже хочу много... Дело в том, что в делфях объекты требующие создания просто не заработают и всё. К ним нельзя обратиться пока не вызовешь конструктор. А строки там вообще наряду со стандартными переменными, конструктор им не требуется. Вот я и пытался по старинке....
Мда... Тут всё посложнее, хотя и намного мощнее. Теперь я понимаю тех, кто делфи не считает за серьёзную среду. Они конечно не правы, но доля истины в их словах есть. :D
Ещё раз спасибо...
:p
i-mate PDA2, 512mb

Ginger
Кандидат (3 lvl)
Сообщения: 151
Зарегистрирован: Вс июл 20, 2003 11:03

Сообщение Ginger » Пн фев 27, 2006 17:07

Да нет, в дельфи все точно также: то же стек, та же куча, просто он делает все, что я написал, за тебя и скрывает это от тебя - потому что библиотека великолепно продумана - вот и создается впечатление, что там все само происходит! =)

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

А на счет последней твоей фразы:" Теперь я понимаю тех, кто делфи не считает за серьёзную среду. Они конечно не правы, но доля истины в их словах есть."
Ни хрена истины в их словах нет! В их словах зучит роспись либо в своей программистской без грамотности, либо лень матушка учиться чемуто новому (уж больно задолбался им MFC в голову, вот и думаю, что все библиотеки такие же кривые как эта).

WhiteWind
Студент (1 lvl)
Сообщения: 35
Зарегистрирован: Вт янв 31, 2006 20:46

Сообщение WhiteWind » Ср мар 01, 2006 18:29

Вот в этом-то и проблема... Пишу я на Делфи, пишу много, продаю и зарабатываю этим. А таких вещей не знаю - ибо избалован автоматизмом. Да, делфя всё за меня делает. Я это всегда понмал, собственно подозревая, что я смогу больше контролировать свои программы и уменьшить размер итогового файла решил учить С++. Ну согласен, согласен, я с последним заявлением. Я же не говорю что делфи отстой! Я наоборот всегда уважал и буду уважать эту среду. Вот только для своих целей где-то лучше VC++. А где-то (хоть те же БД) делфям нет равных. А MFC мнея и правда несколько разочаровал. Я в общем-то считал, что это мне с непривычки кажется... Неужели всё так плохо?
Ещё раз спасибо за ответ... :)
:p
i-mate PDA2, 512mb

WhiteWind
Студент (1 lvl)
Сообщения: 35
Зарегистрирован: Вт янв 31, 2006 20:46

Сообщение WhiteWind » Ср мар 01, 2006 19:03

Ну я чего тупой вообще чтоль? :shock:
Ну почему он всё время ругается на очевидные вещи?
.\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, динамеческий массив указателей с удобной оберткой... Непривычно пока всё... :?
:p
i-mate PDA2, 512mb

LuceferAB
Студент (1 lvl)
Сообщения: 25
Зарегистрирован: Ср янв 04, 2006 21:13

Ха

Сообщение LuceferAB » Вс мар 05, 2006 23:43

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

Закрыто

Вернуться в «Программирование для КПК»