Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

CStdioFile - bad ptr (Visual C++)

612  1 2 3 4 5 6 7 8 9 все
JacksonB прохожий11.05.06 15:35
JacksonB
11.05.06 15:35 
Есть два файла. один читается (modeRead), в другой (modeCreate|modeWrite) пишется информация. Вс╦ функционирует одновременно в одном цикле.
После завершения цикла. вызывается метод Close для обоих файлов. Тот файл, который читался, закрывается без ошибок.
Файл в который вс╦ писалось не закрывается.
CXX0030: Error: expression cannot be evaluated char
и -
_tmpfname 0x00000000 <Bad Ptr> char *
для чтения и записи использую функции ReadString() и WriteString()
Как можно решить эту проблему?
#1 
Simple Nothing is f*cked11.05.06 15:55
Simple
NEW 11.05.06 15:55 
в ответ JacksonB 11.05.06 15:35
Странно. Сто раз пользовался, но такого не было.
#2 
voxel3d коренной житель11.05.06 15:59
voxel3d
NEW 11.05.06 15:59 
в ответ Simple 11.05.06 15:55
Я не пользовался ни разу, но выглядит как разименовывание нулевого указателя. 2автор: покажи код.
Dropbox - средство синхронизации и бэкапа файлов.
#3 
Simple Nothing is f*cked11.05.06 16:02
Simple
NEW 11.05.06 16:02 
в ответ voxel3d 11.05.06 15:59
Что такое разыменовывание? Dereference?
#4 
voxel3d коренной житель11.05.06 16:08
voxel3d
NEW 11.05.06 16:08 
в ответ Simple 11.05.06 16:02
ну дa
Dropbox - средство синхронизации и бэкапа файлов.
#5 
Russman старожил11.05.06 16:09
Russman
NEW 11.05.06 16:09 
в ответ voxel3d 11.05.06 15:59
Угу. Похоже поинтер не тот.
---
Хорошее владение компьютером, а также его последующий ремонт...
#6 
Simple Nothing is f*cked11.05.06 16:11
Simple
NEW 11.05.06 16:11 
в ответ voxel3d 11.05.06 16:08, Последний раз изменено 11.05.06 16:12 (Simple)
Я ни разу не пользовался указателями при работе с этим классом. Но черт его знает, что у автора там в коде :) Посмотреть надо.
зы Но обычно, если указатель нулевой, ошибка другая...
#7 
JacksonB прохожий11.05.06 16:40
JacksonB
NEW 11.05.06 16:40 
в ответ voxel3d 11.05.06 15:59
ULONGLONG ulPosition,i;
int n;
CString csStr,csStr1,csHelp,csLineNumber;
CStdioFile ifile(csFileName,CFile::modeRead);
csOutfile = pGlobals->m_ggsTargetDir+"\\"+PathFindFileName(csFileName);
if (!PathFileExists(pGlobals->m_ggsTargetDir))
{
csOutfile = pGlobals->m_ggsProjectPath;
if(!csOutfile.IsEmpty())
{
// csOutfile can contain
// - a directory-path
// - a file-path
// -> check it
if(GetFileAttributes(csOutfile) & FILE_ATTRIBUTE_DIRECTORY)
csOutfile += "\\" + csFileName;
else
{
char szPath[_MAX_PATH],
szDrive[_MAX_DRIVE],
szDir[_MAX_DIR],
szFName[_MAX_FNAME],
szExt[_MAX_EXT];
_splitpath(csOutfile, szDrive, szDir, szFName, szExt);
_makepath(szPath, szDrive, szDir, "", "");
csOutfile = szPath;
}
// (2) Set/create default output directory (...\OUTPUT\SRC)
csOutfile += "OUTPUT\\INSTRPRO";
if(!::CreateDirectory(csOutfile, NULL))
{
// directory already exists
}
csOutfile += "\\" + csFileName;
}
else
{
//error message
//pGlobals->Error
return 0;
}
}
CStdioFile ofile(csOutfile,CFile::modeCreate|CFile::modeWrite);
i=n=0;
ulPosition=ifile.Seek(0,ifile.end);
ifile.SeekToBegin();
ifile.ReadString(csStr);
csStr.Trim();
while (i<ulPosition)
{
if (csStr.Left(1)!="#" || csStr.Left(1)=="")
{
do
{
ofile.WriteString(csStr+"\n");
ifile.ReadString(csStr);
csStr.Trim();
i++;
}while (csStr.Left(1)!="#" && i<ulPosition);
}
if (csStr.Left(1)=="#")
{
csHelp="";
n=0;
csHelp=UntilCharacterStr(csStr,' ',n); //check directive "if...",...,"endif"
if (csHelp=="#if" ||
csHelp=="#ifdef" ||
csHelp=="#ifndef" ||
csHelp=="#endif" ||
csHelp=="#error" ||
csHelp=="#elif" ||
csHelp=="#else")
{
char temp=0;
csLineNumber=LineNumber(CString(ltoa(i,&temp,10)),2);
ofile.WriteString(csLineNumber+csStr+"\n");
ifile.ReadString(csStr);
csStr.Trim();
i++;
} //end of check directive "if...",...,"endif"
do
{
ifile.ReadString(csStr1);
csStr1.Trim();
if (csStr1.Right(1)!="\\") break;
i++;
}while (csStr.Left(1)!="#" && (csStr.Left(1)!="/" || csStr.Left(1)!="*" ));
char temp=0;csLineNumber=LineNumber(CString(ltoa(i,&temp,10)),2);
csStr1=CheckStr(csStr);
if (m_bError!=TRUE)ofile.WriteString(csLineNumber+(LPCTSTR)csStr1);
}
ifile.ReadString(csStr);
csStr.Trim();
i++;
}
ifile.Close();
ofile.Close();
if (m_bError==TRUE) ofile.Remove(csOutfile);
#8 
Russman старожил11.05.06 17:23
Russman
NEW 11.05.06 17:23 
в ответ JacksonB 11.05.06 16:40
Меня слегка заколдобило от кода, но может оно так и надо, не програмер я. Это известное МФЦ?
Так вот. Судя по всему проблема не закрытии файла. Где-то что-то не того типа стоит. Скорее всего, даже при открытии файла.
---
Лицо фиpмы - это жопа секpетаpши
#9 
  scorpi_ скептик11.05.06 23:48
NEW 11.05.06 23:48 
в ответ JacksonB 11.05.06 16:40
Ужас. Уволил бы за такой код. Сразу и навсегда.
#10 
Murr коренной житель12.05.06 02:40
Murr
NEW 12.05.06 02:40 
в ответ JacksonB 11.05.06 16:40
Первая ошибка - в 6-й строке. Дальше - не осилил... :(
#11 
JacksonB прохожий12.05.06 09:44
JacksonB
NEW 12.05.06 09:44 
в ответ scorpi_ 11.05.06 23:48
Знаете, вы меня поражаете. Я пишу на с++ только 2 месяца. И вот эти восклицания
>Ужас. Уволил бы за такой код. Сразу и навсегда.
меня обижают. Нельзя так сходу говорить. Если вы такой опытный в программировании, то почему бы не сказать как лучше писать. Вроде бы для этого существует форум, задавать вопросы и получать ответы по возможности, а не простите за выражение "обсирать" тех у кого что-то не получается или кто "ужасно пишет".
#12 
  scorpi_ скептик12.05.06 09:47
NEW 12.05.06 09:47 
в ответ JacksonB 12.05.06 09:44
Извините, а какое отношение имеет Ваш код к С++?
Вы вообще по каким источникам С++ изучаете?
#13 
Simple Nothing is f*cked12.05.06 09:57
Simple
NEW 12.05.06 09:57 
в ответ Russman 11.05.06 17:23
К MFC это имеет весьма отдаленное отношение.
#14 
Simple Nothing is f*cked12.05.06 09:58
Simple
NEW 12.05.06 09:58 
в ответ JacksonB 12.05.06 09:44
Ты не обижайся. Это крик души :) Мне тоже стало нехорошо от такого.
#15 
Russman старожил12.05.06 09:59
Russman
NEW 12.05.06 09:59 
в ответ Simple 12.05.06 09:57
Ну я подумал мало ли, может так принято под МФЦ код писать.
---
Device "Штангенциркyль" not found. (2:5020/481.8)
#16 
Simple Nothing is f*cked12.05.06 10:01
Simple
NEW 12.05.06 10:01 
в ответ Russman 12.05.06 09:59
MFC - это библиотека.
#17 
Simple Nothing is f*cked12.05.06 10:02
Simple
NEW 12.05.06 10:02 
в ответ scorpi_ 12.05.06 09:47
А в С строчки "+=" нельзя склеивать :-D
#18 
  scorpi_ скептик12.05.06 10:11
NEW 12.05.06 10:11 
в ответ Simple 12.05.06 10:02
Не придираяйся к мелочам. :p И вообще где я что-то сказал про С?
Кстати я в данный момент пишу на ANSI C, но код выглядит вполне прилично.
#19 
Russman старожил12.05.06 10:12
Russman
NEW 12.05.06 10:12 
в ответ Simple 12.05.06 10:01
Ну об этом я догадывался. Я просто хотел узнать не написано ли это в соответствии с MS/MFC coding guidelines. Сказал бы чего едкое по поводу МС ;-)
---
Чем меньше жизненного опыта, тем охотнее им делятся (2:4614/1.25)
#20 
JacksonB гость12.05.06 10:14
JacksonB
NEW 12.05.06 10:14 
в ответ Murr 12.05.06 02:40
у меня была одна похожая ошибка с <bat ptr>. я присваивал в структурной переменной значение и параллельно присваивал значение массиву.
example:
struct.b=csValue; array[i-1]=TRUE;
получалось что i была равна 0 минус 1 получалось -1 //моя ошибка не досмотрел :)
и переменная struct.b получала другой адрес и в дальнейшем <bat pointer>.
Может где-то скрылась подобная ошибка?
#21 
Murr коренной житель12.05.06 10:14
Murr
NEW 12.05.06 10:14 
в ответ Russman 12.05.06 09:59
Эээ... как-нибудь я наберусь желания открыть Бооольшой Флейм и запосчу что-нибудь "под MFC"... Если возьму что-то случайно-произвольное - будет весьма похоже на этот кусок... ну чуток позапутанеее...
#22 
Simple Nothing is f*cked12.05.06 10:16
Simple
NEW 12.05.06 10:16 
в ответ scorpi_ 12.05.06 10:11
Нашел, чем хвастаться :)
На самом деле, ты прав, конечно. Дикая смесь WinAPI и MFC :) Даже у Миранды код был лучше :-D
#23 
Simple Nothing is f*cked12.05.06 10:16
Simple
NEW 12.05.06 10:16 
в ответ Russman 12.05.06 10:12
Боюсь, что нет ;)
#24 
Simple Nothing is f*cked12.05.06 10:17
Simple
NEW 12.05.06 10:17 
в ответ Murr 12.05.06 10:14
Давай. Я буду участвовать (с)
#25 
Murr коренной житель12.05.06 10:18
Murr
NEW 12.05.06 10:18 
в ответ scorpi_ 12.05.06 10:11
Кстати я в данный момент пишу на ANSI C, но код выглядит вполне прилично.
------
Так ведь без разницы на чем писать. В pure С чуток больше - на один массив указателей - для эмуляции полиморфизма... Знаком с одним из американских продуктов, написанных целиком на pure C и не имеющим больших проблем - ребята там даже эмуляцию интерфейсов имеют...
#26 
Simple Nothing is f*cked12.05.06 10:18
Simple
NEW 12.05.06 10:18 
в ответ JacksonB 12.05.06 10:14
Какое отношение имеет одно к другому? Это две разные команды.
#27 
Simple Nothing is f*cked12.05.06 10:19
Simple
NEW 12.05.06 10:19 
в ответ Murr 12.05.06 10:18
Если охота повые..., можно еще и не то придумать.
#28 
Murr коренной житель12.05.06 10:20
Murr
NEW 12.05.06 10:20 
в ответ Simple 12.05.06 10:17
Я еще не готов к большому флейму - мне бы объектик из POST выковырять... желательно - стандартным методом...
#29 
Murr коренной житель12.05.06 10:21
Murr
NEW 12.05.06 10:21 
в ответ Simple 12.05.06 10:19
Они просто _делают_ продукт. Довольно объемный, кстати... и сопровождаемый более 20-ти лет...
#30 
  scorpi_ скептик12.05.06 10:22
NEW 12.05.06 10:22 
в ответ Murr 12.05.06 10:18
Меня больше всего error handling раздражает - приходится проверять каждый раз возвращаемые значения, лепить ифы... Особенно если это связано с аллокацией/деаалокацией ресурсов...
#31 
Simple Nothing is f*cked12.05.06 10:26
Simple
NEW 12.05.06 10:26 
в ответ JacksonB 11.05.06 16:40
Я не буду комментировать весь кусок, только то, что мне ударило в глаза с первого взгляда, так сказать.
1. Метод ReadString возвращает FALSE, если конец файла. Читать строку из файла нужно только ОДИН раз - в while. Я думаю, все твои неприятности идут оттуда.
2. ulPosition - это не число строк, как ты думаешь, а число байтов - длина файла.
#32 
Simple Nothing is f*cked12.05.06 10:27
Simple
NEW 12.05.06 10:27 
в ответ scorpi_ 12.05.06 10:22
Это тебе не джава, тут все ручками нужно :)
Небо и земля по сравнению с С++.
#33 
Simple Nothing is f*cked12.05.06 10:29
Simple
NEW 12.05.06 10:29 
в ответ Murr 12.05.06 10:21
Да понятно, что не в бирюльки играются. Исхожу из того, что там сидят не лохи, и варианты портирования уже рассматривались :)
#34 
Murr коренной житель12.05.06 11:06
Murr
NEW 12.05.06 11:06 
в ответ scorpi_ 12.05.06 10:22
Как раз эмуляция полиморфизма и позволяет обрабатывать подобные неприятности - при ошибке дергается обработчик со стандартным смещением и подменяет следующий вызов на процедуру обработки ошибки. За смещениями, разумеется, надо следить, но это легче, чем писать иффы...
#35 
Murr коренной житель12.05.06 11:09
Murr
NEW 12.05.06 11:09 
в ответ Simple 12.05.06 10:26
2. ulPosition - это не число строк, как ты думаешь, а число байтов - длина файла.
------
Добавь сразу, что она считается по-разному для "текстовых" и "бинарных" файлов... Спасибки дяде биллу...
#36 
Simple Nothing is f*cked12.05.06 11:11
Simple
NEW 12.05.06 11:11 
в ответ Murr 12.05.06 11:09
В данном случае это возле птицы. Он же использует это как символ конца :-D
#37 
Murr коренной житель12.05.06 11:15
Murr
NEW 12.05.06 11:15 
в ответ Simple 12.05.06 10:29
варианты портирования
------
Об этом не в курсе - там трудится один из моих студентов. В свое время он весьма обрадовался, когда сумел поменять профиль работы - перешел от программирования на администрирование...
#38 
  scorpi_ скептик12.05.06 11:16
NEW 12.05.06 11:16 
в ответ Murr 12.05.06 11:06
В ответ на:
Как раз эмуляция полиморфизма и позволяет обрабатывать подобные неприятности - при ошибке дергается обработчик со стандартным смещением и подменяет следующий вызов на процедуру обработки ошибки.

Ссылка есть?
#39 
Simple Nothing is f*cked12.05.06 11:18
Simple
NEW 12.05.06 11:18 
в ответ scorpi_ 12.05.06 11:16
У тебя настолько большой проект, что охота заморачиваться? Наверняка это какой-то геморрой с таблицами указателей на функции.
#40 
  scorpi_ скептик12.05.06 11:25
NEW 12.05.06 11:25 
в ответ Simple 12.05.06 11:18
Чисто общеобразовательный интерес ;)
#41 
JacksonB гость12.05.06 11:48
JacksonB
NEW 12.05.06 11:48 
в ответ Simple 12.05.06 10:26
Спасиб, просмотрю. про ulPosition я знаю.
только я не наш╦л другой возможности считать строки в файле.
Может подскажите как можно?
#42 
JacksonB гость12.05.06 11:48
JacksonB
NEW 12.05.06 11:48 
в ответ Simple 12.05.06 10:18
просто пример прив╦л. может как-то легче будет для понимания.
#43 
Simple Nothing is f*cked12.05.06 11:50
Simple
NEW 12.05.06 11:50 
в ответ JacksonB 12.05.06 11:48
А зачем тебе знать, сколько строк? В крайнем случае, тем же ReadString.
#44 
Murr коренной житель12.05.06 11:51
Murr
NEW 12.05.06 11:51 
в ответ Simple 12.05.06 11:11
Он же использует это как...
-----
Читай выше - я осилил только первые 6 строк.
#45 
Simple Nothing is f*cked12.05.06 11:52
Simple
NEW 12.05.06 11:52 
в ответ Murr 12.05.06 11:51
Ты слишком ленив :-D
#46 
Murr коренной житель12.05.06 11:56
Murr
NEW 12.05.06 11:56 
в ответ scorpi_ 12.05.06 11:16
Нет конечно. Это же не стандартная методика. Делал когда-то для себя - вроде работало. Там ничего сложно - по потребностям - делаешь массив - одна строка - одна эмулируемая функция. По желанию делаешь два-четыре+ укзателя - (пролог), функция, эпилог, (ошибка) - по ситуации - вызываешь что надо косвенно...
#47 
Murr коренной житель12.05.06 11:57
Murr
NEW 12.05.06 11:57 
в ответ Simple 12.05.06 11:18
Наверняка это какой-то геморрой с таблицами указателей на функции.
------
Именно. Только вот как геморой оно будет _один_ раз... это тебе не вложенные иффы непонятной глубины...
#48 
Simple Nothing is f*cked12.05.06 12:01
Simple
NEW 12.05.06 12:01 
в ответ Murr 12.05.06 11:57
Не знаю, не знаю. Если паче чаяния где-то глюк, то хрен докопаешься.
#49 
JacksonB гость12.05.06 12:01
JacksonB
NEW 12.05.06 12:01 
в ответ scorpi_ 12.05.06 09:47
Мне трудно понять в данный момент разницу между C++ и Visual С++.
С++ это стандарт.
как я в данный момент понимаю. я использую MFС и Api functions.
Правильно я рассуждаю?
#50 
Murr коренной житель12.05.06 12:01
Murr
NEW 12.05.06 12:01 
в ответ JacksonB 12.05.06 11:48
только я не нашёл другой возможности считать строки в файле.
------
Забудь, и лучше всего - навсегда, что файл может состоять из строк. В любом случае автомат анализатора получит всего два дополнительных состояния... в большинстве случаев они будут еще и неразличимы...
P.S. Не тушуйся - тут _пальцы_...
#51 
  scorpi_ скептик12.05.06 12:03
NEW 12.05.06 12:03 
в ответ JacksonB 12.05.06 09:44
В ответ на:
меня обижают. Нельзя так сходу говорить.

Ну ладно, объясняю по буквам...
0. Чтобы получить помощь на форуме программистов необходимо как минимум подать проблему в удобоваримом виде.
0.1 Описать решаемую проблему. Вполне возможно, что ты подошёл к решению проблемы неправильно (и здесь как раз тот самый случай).
0.2 Сведи проблему к минимальной компилируемой программе.
0.3 Представь данную программу в удобно читаемом, отформатированном виде.
Я не зря задал вопрос о источнике обучения. Ибо так писать не стоит.
1. Используй стандартные классы std::string, std::ifstream, std::ofstream.
2. Структурируй программу. Функция должна в идеале содержать не более 7 логических элементов, иначе она неудобоварима.
3. И наконец о самой проблеме. Если тебе нужен scanner - возьми Lex. Так как пытаешься это сделать ты их не пишут, их пишут как конечные автоматы, иначе ты очень быстро запутаешься в дебрях разветвлений.
ЗЫ Какие у тебя Vorkenntnisse? Знания языков (английский, немецкий)? Могу посоветовать, бросить книжку...
#52 
Simple Nothing is f*cked12.05.06 12:06
Simple
NEW 12.05.06 12:06 
в ответ scorpi_ 12.05.06 12:03
0.3 Тут хрен представишь. Тега code же нет :/
1. Необязательно, на мой взгляд.
#53 
JacksonB гость12.05.06 12:08
JacksonB
NEW 12.05.06 12:08 
в ответ Simple 12.05.06 11:50
в выходной файл надо писать номер строки с которой я считал вс╦.
Спасиб за совет с ReadString!
#54 
Murr коренной житель12.05.06 12:08
Murr
NEW 12.05.06 12:08 
в ответ Simple 12.05.06 11:52
Нее - я слишком занят... :) Решал проблему с получением объекта из POST'a... не решил, но обошел...
#55 
  scorpi_ скептик12.05.06 12:09
NEW 12.05.06 12:09 
в ответ Simple 12.05.06 12:06
0.3 Есть тег pre. На худой конец пойдёт, чего-либо лучшего здесь не дождаться...
1. Обязательно. Не учи новичков дурным привычкам.
#56 
Simple Nothing is f*cked12.05.06 12:10
Simple
NEW 12.05.06 12:10 
в ответ JacksonB 12.05.06 12:08
Не за что. Но индекс увеличивается по ходу тела, зачем изначально знать в данном случае, сколько их всего может быть? Вылезти за границу ты не сможешь все равно.
#57 
Simple Nothing is f*cked12.05.06 12:11
Simple
NEW 12.05.06 12:11 
в ответ scorpi_ 12.05.06 12:09, Последний раз изменено 12.05.06 12:14 (Simple)
Ах да, тут же хтмл работает.
Не буду спорить насчет stl, плохо знаком.
#58 
Russman старожил12.05.06 12:11
Russman
NEW 12.05.06 12:11 
в ответ Simple 12.05.06 12:06
Может, если бы STL использовали вместо МФЦ и винды лучшее работали бы?
;-)
---
... все равно его не брошу потому что жаба давит...
#59 
Simple Nothing is f*cked12.05.06 12:11
Simple
NEW 12.05.06 12:11 
в ответ Murr 12.05.06 12:08
Ты не только ленивый, но и хитрый :-D
#60 
Simple Nothing is f*cked12.05.06 12:12
Simple
NEW 12.05.06 12:12 
в ответ Russman 12.05.06 12:11, Последний раз изменено 12.05.06 12:17 (Simple)
По-моему, МФЦ - чисто прикладная приблуда, хотя могу ошибаться :)
ps К тому же, не забывай, что у МС своя имплементация STL, так что... ;)
#61 
Russman старожил12.05.06 12:16
Russman
NEW 12.05.06 12:16 
в ответ Simple 12.05.06 12:12
Ну так и STL более чем прикладная.
---
Шаблон - не сикель, Макрофлексом не порвёшь
#62 
Murr коренной житель12.05.06 12:17
Murr
NEW 12.05.06 12:17 
в ответ Simple 12.05.06 12:01
Не знаю, не знаю. Если паче чаяния где-то глюк, то хрен докопаешься.
------
В пяти строках диспетчера ты его найдешь скорее, чем в 50-ти вложенных иффах, раскиданных по коду... Если бы это было не так - умер бы С++...
#63 
Simple Nothing is f*cked12.05.06 12:20
Simple
NEW 12.05.06 12:20 
в ответ Murr 12.05.06 12:17
Смотря как они раскиданы :-D
#64 
Murr коренной житель12.05.06 12:21
Murr
NEW 12.05.06 12:21 
в ответ Simple 12.05.06 12:06
0.3 Тут хрен представишь. Тега code же нет :/
------
таки - можно. кваченный код вроде не форматируется.
Но суть не в этом, а в выделении проблемного момента. Обычно в процессе выделения ошибка находится самостоятельно...
#65 
Murr коренной житель12.05.06 12:24
Murr
NEW 12.05.06 12:24 
в ответ Simple 12.05.06 12:11
Ты не только ленивый, но и хитрый :-D
------
Ну так мне за это деньги платят...
#66 
Murr коренной житель12.05.06 12:29
Murr
NEW 12.05.06 12:29 
в ответ Simple 12.05.06 12:20
Возьми исходники RatC и посмотри как и что там раскидано. Если исходники не найдешь - там синтасический анализатор реализован в виде рекурсивного спуска - когда что-то в нем дохнет - найти концы просто не реально - около 20К if-while-do... В свое время он меня настолько утомил, что пришлось его заменить... таблицей и полустраницей кода...
#67 
JacksonB гость12.05.06 12:31
JacksonB
NEW 12.05.06 12:31 
в ответ scorpi_ 12.05.06 12:03
Спасибо за совет. А такого правила нет случайно где-нибудь?
Немецкий лучше чем английский. если есть на русском то вообще прекрасно :)
#68 
Russman старожил12.05.06 12:35
Russman
NEW 12.05.06 12:35 
в ответ JacksonB 12.05.06 12:31
http://anatolix.naumen.ru/Books/cplusplus
С чего начать пусть скорпи советует.
Может с Kernigan & Ritchie? :-)
---
--> Большому коpаблю - большая тоpпеда <-- (2:5070/50.9)
#69 
Murr коренной житель12.05.06 12:52
Murr
NEW 12.05.06 12:52 
в ответ Russman 12.05.06 12:35
Может с Kernigan & Ritchie? :-)
------
На начальном уровне и с точки зрения языка - более чем хорошо.
#70 
  scorpi_ скептик12.05.06 12:57
NEW 12.05.06 12:57 
в ответ Russman 12.05.06 12:35
В ответ на:
Может с Kernigan & Ritchie? :-)

Боже упаси! Я как раз советую начинать с "Accelerated C++" Кёнига, потому что он с самого начала приучает использовать std::string вместо char* и std::vector вместо масивов...
На английском могу её кинуть. У Анатоликса наверно лучше начать с Липпмана.
#71 
  scorpi_ скептик12.05.06 13:08
NEW 12.05.06 13:08 
в ответ Murr 12.05.06 12:52
Может не будем разные языки путать?
#72 
voxel3d коренной житель12.05.06 13:15
voxel3d
NEW 12.05.06 13:15 
в ответ JacksonB 12.05.06 12:01, Последний раз изменено 12.05.06 14:34 (voxel3d)
> Мне трудно понять в данный момент разницу между C++ и Visual С++.
> меня обижают. Нельзя так сходу говорить. Если вы такой опытный в программировании, то почему бы не сказать как лучше писать.
Он тебе сказал не к тому, что Visual C++ это не C++. Ты пишешь код "в духе" C и вдобавок у тебя каша полная, тебе при желании нельзя помочь.
Давай попробую основу показать для копирования контента с возможностью его преобразования, может быть, оно тебе полезно будет.
В ответ на:
using namespace std;
class line : public string {};
istream& operator>>(istream& i, line& s)
{
s.clear();
getline(i, s);
s.push_back('\n');
return i;
}
struct funct : unary_function<const line&, line>
{
line operator()(const line& l) const
{
return l;
}
};
void foo()
{
ifstream is("source.txt");
istream_iterator<line> ii(is), eof;
ofstream os("dest.txt");
ostream_iterator<line> oo(os);
transform(ii, eof, oo, funct());
}


Проверку файла назначения соответственно делай до, нефиг всё в одну кучу лепить, а парсинг строк в funct::operator() дёргай, возвращаемое значение будет записываться в результирующий файл.
2аll: критика приветствуется...
Dropbox - средство синхронизации и бэкапа файлов.
#73 
voxel3d коренной житель12.05.06 13:22
voxel3d
NEW 12.05.06 13:22 
в ответ Simple 11.05.06 16:11, Последний раз изменено 12.05.06 13:23 (voxel3d)
> зы Но обычно, если указатель нулевой, ошибка другая...
Угу, я пургу прогнал. У него где-то "портится" хэндл на файл в ofile, где - убей, понять не могу. Потенциальных мест дофига, где именно, хрен поймёшь в таком коде.
Dropbox - средство синхронизации и бэкапа файлов.
#74 
  scorpi_ скептик12.05.06 14:37
NEW 12.05.06 14:37 
в ответ voxel3d 12.05.06 13:15, Последний раз изменено 12.05.06 15:04 (scorpi_)
Просто скопировать файл можно и так:
#include <string>
#include <fstream>
#include <iterator>
#include <algorithm>
using namespace std;
int main()
{
copy( istream_iterator<string>( ifstream("source.txt") ),
istream_iterator<string>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n") );
}


а вот это ближе к проблеме ОП:
смотри update ниже - ошибка с tok_end

#75 
Simple Nothing is f*cked12.05.06 14:46
Simple
NEW 12.05.06 14:46 
в ответ scorpi_ 12.05.06 14:37
Боюсь, что парень теперь загружен по самое некуда :)
#76 
  scorpi_ скептик12.05.06 14:50
NEW 12.05.06 14:50 
в ответ Simple 12.05.06 14:46
Пусть учится :) Нефиг спагетти лепить
#77 
Simple Nothing is f*cked12.05.06 14:55
Simple
NEW 12.05.06 14:55 
в ответ scorpi_ 12.05.06 14:50
Признаться, мне, как ни разу доселе не работавшему с STL, тоже было слегка дико в начале. Начинаю учиться :о Книги, сцуко, дорогие :[
#78 
  scorpi_ скептик12.05.06 14:58
NEW 12.05.06 14:58 
в ответ Simple 12.05.06 14:55
В ответ на:
Книги, сцуко, дорогие :[

Ты их покупаешь?
#79 
Simple Nothing is f*cked12.05.06 14:59
Simple
NEW 12.05.06 14:59 
в ответ scorpi_ 12.05.06 14:58
Пока только смотрю. После выигрыша на тотализаторе хочется потрясти мошной :-D Но обламываюсь потихоньку.
#80 
Murr коренной житель12.05.06 15:00
Murr
NEW 12.05.06 15:00 
в ответ scorpi_ 12.05.06 14:37
int main()
{
transform( istream_iterator<line>( ifstream("source.txt") ),
istream_iterator<line>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
funct() );
}
-----
Надо было довести до совершенства:
int main()
{
TMyTransformer.Transform( istream_iterator<line>( ifstream("source.txt") ),
istream_iterator<line>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
funct() );
}
где Transform - статический метод TMyTransformer...
А то опять недоученным останется...
#81 
Simple Nothing is f*cked12.05.06 15:04
Simple
NEW 12.05.06 15:04 
в ответ Murr 12.05.06 15:00
Че-то я не понял смысла. Это если закрыть глаза на TMyTransformerточкаTransform :-D
#82 
voxel3d коренной житель12.05.06 15:05
voxel3d
NEW 12.05.06 15:05 
в ответ scorpi_ 12.05.06 14:37
Сорри, проверить не могу, посему, возможно, глупые вопросы.
В ответ на:
istream& operator>>( istream& i, line& s )
{
s.clear();
getline( i, s );
return i;
}


перед выходом, надо добавить '\n' к строке?
В ответ на:
struct funct : unary_function< string, line >
...
string operator()( line l )


первый аргумет, это аргумент, последний -- возвращаемое значение. Аргументу -- констанстность и ссылочность. У тебя ниже operator() объявлен. Вероятно, в объявлении структуры ты местами перепутал string с line -ом?
Dropbox - средство синхронизации и бэкапа файлов.
#83 
Murr коренной житель12.05.06 15:10
Murr
NEW 12.05.06 15:10 
в ответ Simple 12.05.06 15:04
Смысл в том, что функции, как таковой и за исключением main(), существовать не должно. Только методы...
#84 
  scorpi_ скептик12.05.06 15:10
NEW 12.05.06 15:10 
в ответ scorpi_ 12.05.06 14:37
В ответ на:
#include <string>
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <sstream>
#include <set>
using namespace std;
const char* ar_tokens[] = { "#if", "#ifdef", "#ifndef", "#endif", "#error", "#elif", "#else", "#include" };
string to_string( int i )
{
stringstream ss;
ss << i;
return ss.str();
}
class line : public string {};
istream& operator>>( istream& i, line& s )
{
s.clear();
getline( i, s );
return i;
}
struct funct : unary_function< const line&, string >
{
set< string > tokens_;
int line_number_;
string token_;
bool is_preprocessor_token( const string& l )
{
string::size_type tok_begin = l.find_first_not_of( " \t" );
if ( string::npos != tok_begin && l[tok_begin] == '#' )
{
string::size_type tok_end = l.find_first_of( " \t" );
token_ = ( string::npos == tok_end ) ?
l.substr( tok_begin ) : l.substr( tok_begin, tok_end - tok_begin );
if ( tokens_.find( token_ ) != tokens_.end() )
return true;
}
return false;
}
public:
funct() : line_number_(0)
{
for( int i = 0; i < sizeof( ar_tokens ) / sizeof( char* ); ++i )
tokens_.insert( ar_tokens[ i ] );
}
string operator()( const line& l )
{
++line_number_;
return is_preprocessor_token( l ) ? to_string( line_number_ ) : l;
}
};
int main()
{
transform( istream_iterator<line>( ifstream("source.txt") ),
istream_iterator<line>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
funct() );
}


#85 
  scorpi_ скептик12.05.06 15:12
NEW 12.05.06 15:12 
в ответ voxel3d 12.05.06 15:05
В ответ на:
перед выходом, надо добавить '\n' к строке?

А у меня вот эта строчка это делает: ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
В ответ на:
перепутал string с line -ом?

Ага. Исправил.
#86 
Simple Nothing is f*cked12.05.06 15:13
Simple
NEW 12.05.06 15:13 
в ответ Murr 12.05.06 15:10
Так это ж ф-я из STL.
#87 
  scorpi_ скептик12.05.06 15:13
NEW 12.05.06 15:13 
в ответ Murr 12.05.06 15:00
В ответ на:
где Transform - статический метод TMyTransformer...

Чушь здесь всякую не неси...
#88 
Simple Nothing is f*cked12.05.06 15:13
Simple
NEW 12.05.06 15:13 
в ответ scorpi_ 12.05.06 15:10
Во тебя заколбасило :-D
#89 
  scorpi_ скептик12.05.06 15:16
NEW 12.05.06 15:16 
в ответ Simple 12.05.06 15:13
Endlich mal ein C++-Thema ;)
#90 
Murr коренной житель12.05.06 15:19
Murr
NEW 12.05.06 15:19 
в ответ scorpi_ 12.05.06 15:13
Ок, буду нести _пятничную_ ахинею...
#91 
Simple Nothing is f*cked12.05.06 15:22
Simple
NEW 12.05.06 15:22 
в ответ scorpi_ 12.05.06 15:16
LOL
А теперь напиши то же без использования STL :-D
#92 
Russman старожил12.05.06 15:24
Russman
NEW 12.05.06 15:24 
в ответ Simple 12.05.06 15:22
> А теперь напиши то же без использования STL
Еретика на костер!
---
До пенсии далеко, а pазвлекаться надо
#93 
  scorpi_ скептик12.05.06 15:24
NEW 12.05.06 15:24 
в ответ Simple 12.05.06 15:22
С использованием сишных функций? Лень...
#94 
Simple Nothing is f*cked12.05.06 15:35
Simple
NEW 12.05.06 15:35 
в ответ scorpi_ 12.05.06 15:24
Зачем? MFC :))
#95 
voxel3d коренной житель12.05.06 15:35
voxel3d
NEW 12.05.06 15:35 
в ответ scorpi_ 12.05.06 15:24
Опять же посмотерть не могу. Ещ╦ вопрос. Функтор созда╦тся на каждую итерацию? Если да, то funct::set<string> tokens_; сделать статическим.
Dropbox - средство синхронизации и бэкапа файлов.
#96 
Simple Nothing is f*cked12.05.06 15:36
Simple
NEW 12.05.06 15:36 
в ответ Russman 12.05.06 15:24
Че сразу еретик? Я в другую дверь вошел.
#97 
Simple Nothing is f*cked12.05.06 15:39
Simple
NEW 12.05.06 15:39 
в ответ voxel3d 12.05.06 15:35
Нет, один раз, судя по коду.
#98 
  scorpi_ скептик12.05.06 15:43
NEW 12.05.06 15:43 
в ответ Simple 12.05.06 14:59
В ответ на:
Пока только смотрю. После выигрыша на тотализаторе хочется потрясти мошной :-D Но обламываюсь потихоньку.

А я купил Tablet-PC, загрузил в него 3 гига книг, лежу и читаю
#99 
Simple Nothing is f*cked12.05.06 15:44
Simple
NEW 12.05.06 15:44 
в ответ scorpi_ 12.05.06 15:43
Красиво жить не запретишь :))
А я - лазер. Только неохота все равно такую кучу бумаги изводить.
voxel3d коренной житель12.05.06 15:45
voxel3d
NEW 12.05.06 15:45 
в ответ Simple 12.05.06 15:39
Вряд ли. Для каждого элемента последовательности вызывается string operator( const line& l ) из функтора, компилятор должен создавать временный объект-функтор при этом.
Dropbox - средство синхронизации и бэкапа файлов.
  scorpi_ скептик12.05.06 15:47
NEW 12.05.06 15:47 
в ответ voxel3d 12.05.06 15:35
Не, один раз. Иначе и строки бы не считались. Его можно впрочем и явно создать, я так делаю, когда мне данные из него позже нужны:
В ответ на:
	funct f( someargs );
transform( istream_iterator<line>( ifstream("source.txt") ),
istream_iterator<line>(),
ostream_iterator<string>( ofstream("dest.txt"), "\n" ),
f );
// use f


  scorpi_ скептик12.05.06 15:49
NEW 12.05.06 15:49 
в ответ voxel3d 12.05.06 15:45
временный объект-функтор создаётся ещё до вызова transform, там же sequence point.
voxel3d коренной житель12.05.06 15:51
voxel3d
NEW 12.05.06 15:51 
в ответ scorpi_ 12.05.06 15:47
Ммм, а почему он один раз созда╦тся? Это результат оптимизации компилятором или в стандарте есть что-то по-поводу?
Dropbox - средство синхронизации и бэкапа файлов.
Simple Nothing is f*cked12.05.06 15:53
Simple
NEW 12.05.06 15:53 
в ответ voxel3d 12.05.06 15:51
Так transform же вызывается только один раз :-О
  scorpi_ скептик12.05.06 15:54
NEW 12.05.06 15:54 
в ответ Simple 12.05.06 15:35
Я даже когда MFC использую пишу почти всё на стандартном С++. Даже такую вот фигню писал, чтобы держать члены диалога в стрингах:
В ответ на:
void AFXAPI DDX_String( CDataExchange* pDX, int nIDC, std::string& value )
{
HWND hWndCtrl = pDX->PrepareEditCtrl( nIDC );
if ( pDX->m_bSaveAndValidate )
{
std::vector< char > v( ::GetWindowTextLength( hWndCtrl ) + 1, 0 );
::GetWindowText( hWndCtrl, &v[0], v.size() );
value = std::string( &v[0], v.size() - 1 );
}
else
SetWindowText( hWndCtrl, value.c_str() );
}


Simple Nothing is f*cked12.05.06 15:57
Simple
NEW 12.05.06 15:57 
в ответ scorpi_ 12.05.06 15:54
Судя по тому, что я сегодня узнал, стандартные классы гораздо мощнее MFC-подобных, так что это логично, если хорошо знаешь STL.
voxel3d коренной житель12.05.06 16:02
voxel3d
NEW 12.05.06 16:02 
в ответ Simple 12.05.06 15:53
transform тут не прич╦м. transform это движение source, dest итераторов, запись в объект, на который указывает dest итератор разультата вызова operator() функтора, которому переда╦тся объект, на который указывает source итератор.
Dropbox - средство синхронизации и бэкапа файлов.
Simple Nothing is f*cked12.05.06 16:08
Simple
NEW 12.05.06 16:08 
в ответ voxel3d 12.05.06 16:02, Последний раз изменено 12.05.06 16:12 (Simple)
Че-то я плохо понимаю, о чем ты. Мне представляется, что transform - это обычная функция, а раз так, то и объект создается только один раз.
voxel3d коренной житель12.05.06 16:19
voxel3d
NEW 12.05.06 16:19 
в ответ Simple 12.05.06 16:08
Какой именно объект?
Я сказал о том, как работает функция transform. Там никакие объекты не создаются. Вернее, созда╦тся объект, как оказалось один, но компилятором, неявно. Короче, мой вопрос сводится к тому, что, каково время жизни объекта, при следующем вызове: SomeClass(); где SomeClass -- имя класса.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:24
Murr
NEW 12.05.06 16:24 
в ответ voxel3d 12.05.06 16:19
При хорошем компайлере - ноль - вызов конструктора будет исключен(?) при оптимизации.
При среднем - быдет вызван конструктор и следом - деструктор.
При плохом, а большинство делает именно так - деструктор будет вызван при выходе из области определения.
Если надо точнее - надо рыть стандарт и доки на реализацию...
Simple Nothing is f*cked12.05.06 16:26
Simple
NEW 12.05.06 16:26 
в ответ voxel3d 12.05.06 16:19
Временный объект-функтор :) Он создается перед тем, как вызывается transform, как ты и сказал. Время жизни - 0.1 :) Копия передается transform'у и отмирает после ее окончания.
  scorpi_ скептик12.05.06 16:28
NEW 12.05.06 16:28 
в ответ voxel3d 12.05.06 15:51
В ответ на:

1.9 (8)
Once the execution of a function begins, no expressions from the calling function are evaluated until execution of the called function has completed.
1.9 (17)
When calling a function (whether or not the function is inline), there is a sequence point after the evaluation of all function arguments (if any) which takes place before execution of any expressions or statements in the function body.
5.2.2 (4)
When a function is called, each parameter (8.3.5) shall be initialized (8.5, 12.8, 12.1) with its corresponding argument. ... The lifetime of a parameter ends when the function in which it is defined returns.
5.2.2 (8)
The order of evaluation of arguments is unspecified. All side effects of argument expression evaluations take effect before the function is entered. The order of evaluation of the postfix expression and the argument expression list is unspecified.

То бишь funct() создаётся до исполнения transform, и живёт до её конца.
Simple Nothing is f*cked12.05.06 16:28
Simple
NEW 12.05.06 16:28 
в ответ Murr 12.05.06 16:24
Зачем так глубоко копать? Тут все просто: функция получает копию объекта, сам объект пьот йад, не отходя от кассы :-D Какие к-ры/д-ры вызываются - возле птицы.
Murr коренной житель12.05.06 16:30
Murr
NEW 12.05.06 16:30 
в ответ JacksonB 11.05.06 15:35
Разумеется. Он ведь не дает _сторонних_ эффектов?
Murr коренной житель12.05.06 16:31
Murr
NEW 12.05.06 16:31 
в ответ voxel3d 12.05.06 16:19
Интересно - это я глючу? Или???
P.S. Второй раз на этой ветке...
  scorpi_ скептик12.05.06 16:31
NEW 12.05.06 16:31 
в ответ Murr 12.05.06 16:24
При любом компайлере будут созданы временные объекты классов istream_iterator, ifstream, ostream_iterator, ofstream и funct.
voxel3d коренной житель12.05.06 16:34
voxel3d
NEW 12.05.06 16:34 
в ответ scorpi_ 12.05.06 16:28
Вс╦, понял, с количеством вызовов вопрос закрыт - пятница, туплю.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:35
Murr
NEW 12.05.06 16:35 
в ответ Simple 12.05.06 16:28
Тут все просто: функция получает копию объекта
------
Это тебе так хочется. Тем не мение - построение объекта и передача объекта в качестве параметра есть несколько разные операции и между ними вполне может произойти куча всякой всячины.. ну и такая малость, как вызов деструктора объекта...
voxel3d коренной житель12.05.06 16:35
voxel3d
NEW 12.05.06 16:35 
в ответ Murr 12.05.06 16:31
Да, не, я удалил сообщение, до меня дошли ответы.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:37
Murr
NEW 12.05.06 16:37 
в ответ scorpi_ 12.05.06 16:31, Последний раз изменено 12.05.06 16:43 (Murr)
Уговорил - напишу компайлер который не будет создавть эти объекты...
P.S. Разумеется придется изучить стандарт на предмет обязательности создания объектов (т.е. вызовов невиртуальных конструкторов) при отсутствии в теле операций со статическими объектами...
Simple Nothing is f*cked12.05.06 16:37
Simple
NEW 12.05.06 16:37 
в ответ Murr 12.05.06 16:35
Почему мне? Я у Майерса это прочитал.
Murr коренной житель12.05.06 16:38
Murr
NEW 12.05.06 16:38 
в ответ voxel3d 12.05.06 16:35
Уффф... значит не я свихнулся...
Simple Nothing is f*cked12.05.06 16:38
Simple
NEW 12.05.06 16:38 
в ответ voxel3d 12.05.06 16:35
Кстати, хотел спросить: тебе так не хочется, чтобы под заголовком стояло "изменено тогда-то тем-то"? ;)
voxel3d коренной житель12.05.06 16:44
voxel3d
NEW 12.05.06 16:44 
в ответ Simple 12.05.06 16:38, Последний раз изменено 12.05.06 16:53 (voxel3d)
В данном случае я спрашивал о времени жизни временного объекта при вызове SomeClass(); Мурр дал ответ, что хороший компайлер не станет вызывать конструктор SomeClass::SomeClass(), после чего я спросил: "даже если там будет код в конструкторе"? Спросив я сразу понял глупость вопроса -- если будет код, то компайлер его вырезать не станет, посколько никаких ответов не было ещё, я просто удалил вопрос, чтобы не было лишнего мусора.
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 16:45
Murr
NEW 12.05.06 16:45 
в ответ Simple 12.05.06 16:37
Эээ... воросик - помимо получения знаний путем прочтения всякого-разного. есть еще путь постижения путем осмысления (самостоятельно) полученного опыта... не пользуеетесь?
JacksonB гость12.05.06 16:46
JacksonB
NEW 12.05.06 16:46 
в ответ Simple 12.05.06 11:50
Я разобрался с bad ptr
CString(ltoa(k,&temp,10)) проблема была тут. как только я ltoa требует к переменной k тип long там раньше стояла переменная i типа ULONGLONG
видать что-то в памяти происходило, но как только я изменил это заработало.
Вопрос. Как я могут узнать конец файла или нет в классе CFile
пример:
CStdio ifile ;
while (!iflie.eof)
{
}
так было бы прекрасно. но я там не наш╦л такого метода (eof).
Simple Nothing is f*cked12.05.06 16:48
Simple
NEW 12.05.06 16:48 
в ответ JacksonB 12.05.06 16:46, Последний раз изменено 12.05.06 16:51 (Simple)
В ответ на:
CStdioFile iFile(bla bla);
CString str;
while (iFile.ReadString(str))
{
bla bla
}


Simple Nothing is f*cked12.05.06 16:50
Simple
NEW 12.05.06 16:50 
в ответ Murr 12.05.06 16:45
Почему ж? Вот, например, прочитал я книжонку некоего гуру Джорджа Фелса, а там написано: когда подбиваешь, не х...рь. Попробовал - и правда ОН (с). Целесообразность и неизобретение колеса. Использование опыта, накопленного другими.
Murr коренной житель12.05.06 16:56
Murr
NEW 12.05.06 16:56 
в ответ voxel3d 12.05.06 16:44
если будет код, то компайлер его вырезать не станет
------
Компайлер не может удалить вызов если есть побочный эффект от вызова или он не в состоянии определить наличие такого эффект - изменяется статический член, конструктор виртуальный, информация по базовому классу недоступна...
Реально же отследить эти условия не слишком просто, особенно если есть крутая иерархия и потому _большинство_ компайлеров будет строить вызов конструктора и вызов деструктора. Когда именно будет вызван последний - сразу или при выходе из области определения - не важно, кроме ситуаций с ошибками.
Murr коренной житель12.05.06 16:59
Murr
NEW 12.05.06 16:59 
в ответ Simple 12.05.06 16:50
Целесообразность и неизобретение колеса.
-----
Увы, я изобретаю колесо регулярно... что интересно - почти всегда - целесообразно.
  scorpi_ скептик12.05.06 17:00
NEW 12.05.06 17:00 
в ответ Murr 12.05.06 16:56
В ответ на:
Когда именно будет вызван последний - сразу или при выходе из области определения - не важно, кроме ситуаций с ошибками.

Об этом поподробнее пожалуйста.
voxel3d коренной житель12.05.06 17:02
voxel3d
NEW 12.05.06 17:02 
в ответ JacksonB 12.05.06 16:46
> CString(ltoa(k,&temp,10)) проблема была тут. как только я ltoa требует к переменной k тип long там раньше стояла переменная i типа ULONGLONG
2all: что-то я чисто теоретически даже не могу понять, как из-за этого могли проблемы данные быть. У кого-нибудь есть идеи?
Dropbox - средство синхронизации и бэкапа файлов.
  scorpi_ скептик12.05.06 17:05
NEW 12.05.06 17:05 
в ответ voxel3d 12.05.06 17:02
А ты сюда посмотри:
В ответ на:
char temp=0;
csLineNumber=LineNumber(CString(ltoa(i,&temp,10)),2);


ЗЫ Мне только непонятно, почему он тему не читает, и продолжает возиться с этим дерьмом...
Russman старожил12.05.06 17:14
Russman
NEW 12.05.06 17:14 
в ответ scorpi_ 12.05.06 17:05
Дык может код принадлежит начальству, он только правит :-)
---
Без момеда нет почты к обеду
  scorpi_ скептик12.05.06 17:16
NEW 12.05.06 17:16 
в ответ Russman 12.05.06 17:14
Такое начальство убивать надо. Вместе с кодом.
voxel3d коренной житель12.05.06 17:19
voxel3d
NEW 12.05.06 17:19 
в ответ scorpi_ 12.05.06 17:05
Может быть, потому, что stl и шаблоны сложны для двух месяцев?
Dropbox - средство синхронизации и бэкапа файлов.
Russman старожил12.05.06 17:21
Russman
NEW 12.05.06 17:21 
в ответ scorpi_ 12.05.06 17:16
Я тоже удивился, но решил что человеку воспитаному на РАПИРА и вынесшему основные знания по информатике из школы, лучше не выступать. Мало ли как там людей на факультетах информатики и кибернетики учат.
---
Сделать из мухи слона нетрудно, труднее его прокормить. (2:5030/67)
JacksonB гость12.05.06 17:21
JacksonB
NEW 12.05.06 17:21 
в ответ scorpi_ 12.05.06 17:05
код не мой. дали чей-то старый. надо чтобы работал и с новыми требованиями.
я сделал немного по другому эту строчку.
k=(long)i;
tmp.Format("%d", k);
csLineNumber=LineNumber(tmp,2);
думаю так лучше.
Работать-то надо. вот и вожусь!
voxel3d коренной житель12.05.06 17:22
voxel3d
NEW 12.05.06 17:22 
в ответ scorpi_ 12.05.06 17:05
Для стековых объектов порядок размещения не гарантирован?
Dropbox - средство синхронизации и бэкапа файлов.
Russman старожил12.05.06 17:25
Russman
NEW 12.05.06 17:25 
в ответ JacksonB 12.05.06 17:21
Лучше переделай сразу, как выше сказали.
---
Hе стpойте глaзки моему оpижину (2:463/244.30)
  scorpi_ скептик12.05.06 17:27
NEW 12.05.06 17:27 
в ответ voxel3d 12.05.06 17:22
В ответ на:
char *  ltoa ( long value, char * buffer, int radix );

Convert long integer value to string.
Converts a long integer value to a null-terminated string using the specified radix and stores the result in the given buffer. If radix is 10 and value is negative the string is preceded by the minus sign (-). With any other radix, value is always considered unsigned. buffer should be large enough to contain any possible value: (sizeof(long)*8+1) for radix=2.


  scorpi_ скептик12.05.06 17:29
NEW 12.05.06 17:29 
в ответ JacksonB 12.05.06 17:21
Ты бы объяснил русским языком, что программа должна делать.
  scorpi_ скептик12.05.06 17:31
NEW 12.05.06 17:31 
в ответ voxel3d 12.05.06 17:19
Может быть, потому, что stl и шаблоны сложны для двух месяцев?
Ему ж не самому их писать. Со стрингом работать проще чем с char*. Да и со стримами не сложнее чем с этим CStdioFile
Murr коренной житель12.05.06 17:33
Murr
NEW 12.05.06 17:33 
в ответ scorpi_ 12.05.06 17:00
Стандартно - при ексепшене, неотфиналеном, деструктор не будет вызван...
voxel3d коренной житель12.05.06 17:35
voxel3d
NEW 12.05.06 17:35 
в ответ scorpi_ 12.05.06 17:27
Это понятно было, я просто забыл порядок размещения объектов на стеке в виндовсе:
var_n, ..., var_1, EBP, return_adr, arg1, ..., arg_n.
Dropbox - средство синхронизации и бэкапа файлов.
  scorpi_ скептик12.05.06 17:36
NEW 12.05.06 17:36 
в ответ Murr 12.05.06 17:33
Не увиливай, вот этот бред сразу или при выходе из области определения - что значит?
  scorpi_ скептик12.05.06 17:38
NEW 12.05.06 17:38 
в ответ voxel3d 12.05.06 17:35
Локальные переменные в порядке декларации, порядок аргументов не определён. Только при чём тут это?
voxel3d коренной житель12.05.06 17:42
voxel3d
NEW 12.05.06 17:42 
в ответ scorpi_ 12.05.06 17:38, Последний раз изменено 12.05.06 17:43 (voxel3d)
При том, что если не знать в какую сторону растёт стек и как размещаются переменные, можно представить, например, такую картину:
var_1, var_2, ..., var_n
где var_1 это ofile (где хэндл портился), а var_2 это тот самый char, в который буфер пытались записать; при росте стека вверх и таком размещении, испортить ofile не удастся.
p.s. (слева меньшие адреса, справа большие)
Dropbox - средство синхронизации и бэкапа файлов.
Murr коренной житель12.05.06 17:48
Murr
NEW 12.05.06 17:48 
в ответ scorpi_ 12.05.06 17:36
Я и не увиливаю - если объект не используется он может быть разрушен сразу после вызова конструктора, равно как разрушение объекта может быть отложено до выполнения последнего оператора в текущем блоке. Второе - проще в реализации.
  scorpi_ скептик12.05.06 17:51
NEW 12.05.06 17:51 
в ответ voxel3d 12.05.06 17:42
Ясно. Стек растёт вниз, так что всё правильно, ltoa будет писать по ofile. Мне собственно было всё равно где он будет писать, ясно, что там где не положено...
Murr коренной житель12.05.06 17:53
Murr
NEW 12.05.06 17:53 
в ответ scorpi_ 12.05.06 17:38
Локальные переменные в порядке декларации, порядок аргументов не определён.
------
Да, внесли в стандарт порядок создания переменных... По моему - зря. Для скалярных можно выделять непрерывный блок, а не скалярные - определять в конструкторе...
Порядков - два. слева направо, справо налево. Какой именно используется надо смотреть в доках на компайлер... в стандарте вроде не было ограничений.
  scorpi_ скептик12.05.06 18:05
NEW 12.05.06 18:05 
в ответ Murr 12.05.06 17:48
В стандарте чётко определено когда вызывается деструктор. Так что объект либо будет разрушен после function return, либо вообще не будет создан.
Murr коренной житель12.05.06 18:31
Murr
NEW 12.05.06 18:31 
в ответ scorpi_ 12.05.06 18:05
Сути необходимых действий это не меняет, но еще раз доказывает, что мне надо найти время и перечитать стандарт. Хотя... писать приходится на всем, кроме С++...
JacksonB гость15.05.06 14:58
JacksonB
NEW 15.05.06 14:58 
в ответ scorpi_ 12.05.06 17:29
Программа читает файл по строчно, делает грамматический разбор каждой строчки. строка должна начинаться с объявления #define #ifdef ... и тому подобное, только тогда происходит разбор строки.
Со String действительно удобно работать, только возникают проблемы с е╦ конвертацией в char или long или int.
есть функция strtol(char *c, char **endptr,int i)
мне нужно преобразовать HEX число в Decimal. вот и проблема конвертации CString в Char.
не подскажите как можно сконвертировать или есть ли другие функции?
с iostream тоже много неопредел╦нности. как читает она строчку с файла, откуда я могу знать размер строчки заранее и т.д.
Simple Nothing is f*cked15.05.06 15:05
Simple
NEW 15.05.06 15:05 
в ответ JacksonB 15.05.06 14:58
У CString есть операторы для этого.
Остальное - читай книжки по STL, для форума это слишком объемный материал.
JacksonB гость15.05.06 15:12
JacksonB
NEW 15.05.06 15:12 
в ответ Simple 15.05.06 15:05
Прошу прощения за глупые вопросы.
Simple Nothing is f*cked15.05.06 15:13
Simple
NEW 15.05.06 15:13 
в ответ JacksonB 15.05.06 15:12
Глупых вопросов не бывает.
voxel3d коренной житель15.05.06 15:16
voxel3d
NEW 15.05.06 15:16 
в ответ JacksonB 15.05.06 14:58
> с iostream тоже много неопредел╦нности. как читает она строчку с файла
Ты имеешь в виду istream. Показали же: наследуешь класс от std::string и перегружаешь глобальный оператор >>. Про размер строки мысль не понял. Зачем его надо знать заранее?
Dropbox - средство синхронизации и бэкапа файлов.
Russman старожил15.05.06 15:19
Russman
NEW 15.05.06 15:19 
в ответ JacksonB 15.05.06 14:58
http://www.cppreference.com/
> Со String действительно удобно работать, только возникают проблемы с еe конвертацией в char или long или int.
есть функция strtol(char *c, char **endptr,int i)
c_str, atol, atoi
> не нужно преобразовать HEX число в Decimal. вот и проблема конвертации CString в Char.
Нет проблем, ставь в atoi сразу чар с хекс значением.
> как читает она строчку с файла, откуда я могу знать размер строчки заранее и т.д.
В этом-то и прелесть. Он просто читает строчку, неважно какой она длины.
---
Ничто так не согревает душу, как холодное пиво
  scorpi_ скептик15.05.06 15:34
NEW 15.05.06 15:34 
в ответ JacksonB 15.05.06 14:58
В ответ на:
Программа читает файл по строчно, делает грамматический разбор каждой строчки. строка должна начинаться с объявления #define #ifdef ... и тому подобное, только тогда происходит разбор строки.

Это мы и сами видим. Вопрос в другом: препроцессор-директивы - это всё что нужно анализировать, или ещё что-то? Каким образом происходит анализ строки?
В ответ на:
Со String действительно удобно работать, только возникают проблемы с её конвертацией в char или long или int. есть функция strtol(char *c, char **endptr,int i) мне нужно преобразовать HEX число в Decimal. вот и проблема конвертации CString в Char.

Забудь про CString, работай с std::string. Конвертирование ты мог видеть в моей программе:
В ответ на:
template< class T >
std::string to_string( T t)
{
stringstream ss;
ss << t;
return ss.str();
}


А есои писать в стрим, то вообще ничего не нужно конвертировать.
В ответ на:
с iostream тоже много неопределённости. как читает она строчку с файла, откуда я могу знать размер строчки заранее и т.д.

getline( stream, string ) читает строку в string, и тебе совершенно не нужно при этом заморачиваться длинной строки.
JacksonB гость15.05.06 16:01
JacksonB
NEW 15.05.06 16:01 
в ответ scorpi_ 15.05.06 15:34
после директив ид╦т имя объекта и далее ид╦т название аттрибута объекта затем значение аттрибута объекта и т.д. взависимости сколько аттрибутов у объекта.
CString CheckStr(cstr) делает этот разбор,проверка существует ли объект в системе, и возвращает назад строку, которую нужно писать в выходной файл.
  scorpi_ скептик15.05.06 16:13
NEW 15.05.06 16:13 
в ответ JacksonB 15.05.06 16:01
В ответ на:
после директив идёт имя объекта и далее идёт название аттрибута объекта затем значение аттрибута объекта и т.д. взависимости сколько аттрибутов у объекта.

Я собственно почему спрашиваю? Я пытаюсь понять, насколько сложен анализ строки. Дело в том, что начиная с определённой сложности нет смысла делать это в лоб - лучше применить известные алгоритмы и программы из Compilerbau (Lex, Yacc и тому подобные). В противном же случае можно просто взять мою программу, заменить тело функции string funct::operator()( const line& l ) на CheckStr и готово. Ты можешь запостить здесь CheckStr, или это коммерческая тайна?
JacksonB гость15.05.06 16:21
JacksonB
NEW 15.05.06 16:21 
в ответ scorpi_ 15.05.06 16:13
нет не тайна. Надеюсь я потом не увижу "Ужас."..... и так далее.
ULONGLONG ulLength;
int i,iPosAttr,n;
bool b;
CString csHelp,csHelp2,csHelp3,vs;
ulLength=csString.GetLength();
iPosAttr=i=0;
EmptyAttr();
while (i<=ulLength)
{
csHelp="";
b=FALSE;
while (!(csString.Mid(i,1)==" " || csString.Mid(i,1)=="\t")) //until first blank
{
csHelp+=csString.Mid(i,1);
i++;
if (i>ulLength) break;
if (CheckDefine(csHelp) && iPosAttr==0) {iPosAttr++;b=TRUE;}
if (csString.Mid(i-1,1)=="#")
while ((csString.Mid(i,1)==" " || csString.Mid(i,1)=="\t") && iPosAttr==0)
{
i=UntilSymbol(csString,i);
b=TRUE;
}
while ((csString.Mid(i,1)==" " || csString.Mid(i,1)=="\t") && iPosAttr>=2)
{
if (i>ulLength) break;
i=UntilSymbol(csString,i);
if (csString.Mid(i+1,1)=="=") {csHelp+=csString.Mid(i+1,1);i+=2;}
csHelp2=csString.Mid(i,3);
if ((CheckAttributen(csString.Mid(i,3),"",1)!="ERROR" || CheckAttributen(csString.Mid(i,2),"",1)!="ERROR") && csString.Mid(3,1)!="=")
{
iPosAttr++;i--;break;
}else csHelp+=" ";
b=TRUE;
}
}
if (!b)iPosAttr++;
if (CheckDefine(csHelp) && iPosAttr==1)
m_Attr.csDeclaration=csHelp;
if (iPosAttr==2)
{
m_Attr.csName=csHelp;
}
if (iPosAttr>=3)
{ csHelp2=csHelp3="";
n=0;
while (csHelp.Mid(n,1)!="=" && n<=csHelp.GetLength()) //get name of attribute
{
csHelp2+=csHelp.Mid(n,1);
n++;
}
n++;
while (n<=csHelp.GetLength()) //get value of attribute
{
csHelp3+=csHelp.Mid(n,1);
n++;
}
CheckAttributen(csHelp2.Trim(),csHelp3.Trim(),1);
}
i=UntilSymbol(csString,i);
}

return CheckObjects();
JacksonB гость15.05.06 16:39
JacksonB
NEW 15.05.06 16:39 
в ответ scorpi_ 15.05.06 16:13
пример из файла
#defnie Name type=int xdm=3 ydm=2 model=KMO_2
#ifdef
#defnie Name2 type=uint
#endif
приблизительно так.
Murr коренной житель15.05.06 16:51
Murr
NEW 15.05.06 16:51 
в ответ JacksonB 15.05.06 16:21
А куда ты денешься - "Ужас, нах...", разумеется. Есть такая штучка как регехп - как раз для этого думана - режет текст на заданные части, если это возможно. Вместо этого коде будет одна (или несколько) строка шаблона парсинга и одна строка вызова...
P.S. Переставая работать с глобальными переменными.
Simple Nothing is f*cked15.05.06 16:57
Simple
NEW 15.05.06 16:57 
в ответ JacksonB 15.05.06 16:21
Пользуйся тегом pre, иначе хрен что поймешь.
Murr коренной житель15.05.06 17:17
Murr
NEW 15.05.06 17:17 
в ответ JacksonB 15.05.06 16:39, Последний раз изменено 15.05.06 17:35 (Murr)
Заменяй на нормальный XML -проще жить будет. У меня в текущем проекте такая же подсистема - собираются куски с разных мест с заменой атрибутов на переопределенные. По объему - не на много больше приведенного кода, но много понятнее...
Simple Nothing is f*cked15.05.06 17:20
Simple
NEW 15.05.06 17:20 
в ответ Murr 15.05.06 17:17
Он просит помочь решить задачу, а не изменить условие :-D
Murr коренной житель15.05.06 17:21
Murr
NEW 15.05.06 17:21 
в ответ JacksonB 15.05.06 16:39
Если у тебя парсинг строк только такого вида, без пробелов вокруг знака "="
то наверняка есть стандартная процедура, нарезающая строку на куски с разделителем ПРОБЕЛ и после этого - еще раз каждый из кусков по знаку "="... смотри в сторону split(?)
Murr коренной житель15.05.06 17:29
Murr
NEW 15.05.06 17:29 
в ответ Simple 15.05.06 17:20
VC++ 6.0 последний раз я работал году этак в 98-м... С тех пор - зарекся что-либо на нем делать и/или править... Ну если только ооочень-ооочень хоршо (материально) просят...
JacksonB гость15.05.06 17:44
JacksonB
NEW 15.05.06 17:44 
в ответ Murr 15.05.06 17:21
в том то весь и прикол. вс╦ было бы проще, если бы не было zwischenraumов между всем.
в задании и стоит что между равно могут быть пробелы. ещ╦ может быть такая фишка, что type=unsignet int
между unsigned и int тоже пробел.
я раньше в дельфи писал.
там мне не приходилось заботить о том, что что-то на что-то в стеке писаться будет.
тут надо прям за всем смотреть.
Murr коренной житель15.05.06 20:17
Murr
NEW 15.05.06 20:17 
в ответ JacksonB 15.05.06 17:44
У меня босс обычно спрашивает - сколько времени займет вариант с пробелами и сколько - без. Меньше без - пишем в доку, что пробелов там не должно быть, и все должно быть отквочено... В любом случае нет смысла разбирать строку посимвольно...
И подумай серьезно об XML - для этих вещей он проще...
  scorpi_ скептик16.05.06 00:46
NEW 16.05.06 00:46 
в ответ JacksonB 15.05.06 16:39
Есть ещё такая прикольная штучка как Spirit http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/index.html
Вот примерчик для затравки:
В ответ на:
#include <boost/spirit/core.hpp>
#include <iostream>
#include <string>
#include <map>
using namespace std;
using namespace boost::spirit;
void set_object_name( char const* first, char const* last )
{
cout << "Object name: " << string(first, last) << endl;
}
void set_object_attr_name( char const* first, char const* last )
{
cout << "Object attribute name: " << string(first, last) << endl;
}
void set_object_attr_value( char const* first, char const* last )
{
cout << "Object attribute value: " << string(first, last) << endl;
}
struct object_parser : public grammar< object_parser >
{
template <typename ScannerT>
struct definition
{
definition( object_parser const& /*self*/ )
{
expression = str_p( "#define" )
>> word [ &set_object_name ]
>> *attr
;
attr = word [ &set_object_attr_name ]
>> '='
>> word [ &set_object_attr_value ]
;
word = lexeme_d[ +(alnum_p | '_') ];
}
rule<ScannerT> expression, attr, attr_value, word;
rule<ScannerT> const& start() const { return expression; }
};
};
int main()
{
object_parser parser;
parse_info<> info = parse( "#define Name type=int xdm=3 ydm=2 model=KMO_2", parser, space_p );
if ( ! info.full )
cout << "Parsing failed at: " << info.stop << endl;

info = parse( "#define Name2 type=uint", parser, space_p );
if ( ! info.full )
cout << "Parsing failed at: " << info.stop << endl;
}


Ausgabe:
Object name: Name
Object attribute name: type
Object attribute value: int
Object attribute name: xdm
Object attribute value: 3
Object attribute name: ydm
Object attribute value: 2
Object attribute name: model
Object attribute value: KMO_2
Object name: Name2
Object attribute name: type
Object attribute value: uint
  scorpi_ скептик16.05.06 00:48
NEW 16.05.06 00:48 
в ответ JacksonB 15.05.06 17:44
Пардон, про пробелы не прочитал, но переделывать мне сейчас некогда, да и лень...
Simple Nothing is f*cked16.05.06 10:11
Simple
NEW 16.05.06 10:11 
в ответ JacksonB 15.05.06 17:44
Тебе Вадим выше писал про метод конечных элементов. Поищи в сети, там есть даже готовый код.
1 2 3 4 5 6 7 8 9 все