русский
Germany.ruForen → Архив Досок→ Programmierung

CStdioFile - bad ptr (Visual C++)

612  1 2 3 4 5 6 7 8 9 alle
  scorpi_ скептик15.05.06 15:34
NEW 15.05.06 15:34 
in Antwort 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 
in Antwort scorpi_ 15.05.06 15:34
после директив ид╦т имя объекта и далее ид╦т название аттрибута объекта затем значение аттрибута объекта и т.д. взависимости сколько аттрибутов у объекта.
CString CheckStr(cstr) делает этот разбор,проверка существует ли объект в системе, и возвращает назад строку, которую нужно писать в выходной файл.
  scorpi_ скептик15.05.06 16:13
NEW 15.05.06 16:13 
in Antwort JacksonB 15.05.06 16:01
В ответ на:
после директив идёт имя объекта и далее идёт название аттрибута объекта затем значение аттрибута объекта и т.д. взависимости сколько аттрибутов у объекта.

Я собственно почему спрашиваю? Я пытаюсь понять, насколько сложен анализ строки. Дело в том, что начиная с определённой сложности нет смысла делать это в лоб - лучше применить известные алгоритмы и программы из Compilerbau (Lex, Yacc и тому подобные). В противном же случае можно просто взять мою программу, заменить тело функции string funct::operator()( const line& l ) на CheckStr и готово. Ты можешь запостить здесь CheckStr, или это коммерческая тайна?
JacksonB гость15.05.06 16:21
JacksonB
15.05.06 16:21 
in Antwort 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 
in Antwort 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 
in Antwort JacksonB 15.05.06 16:21
А куда ты денешься - "Ужас, нах...", разумеется. Есть такая штучка как регехп - как раз для этого думана - режет текст на заданные части, если это возможно. Вместо этого коде будет одна (или несколько) строка шаблона парсинга и одна строка вызова...
P.S. Переставая работать с глобальными переменными.
Simple Nothing is f*cked15.05.06 16:57
Simple
NEW 15.05.06 16:57 
in Antwort JacksonB 15.05.06 16:21
Пользуйся тегом pre, иначе хрен что поймешь.
Murr коренной житель15.05.06 17:17
Murr
NEW 15.05.06 17:17 
in Antwort JacksonB 15.05.06 16:39, Zuletzt geändert 15.05.06 17:35 (Murr)
Заменяй на нормальный XML -проще жить будет. У меня в текущем проекте такая же подсистема - собираются куски с разных мест с заменой атрибутов на переопределенные. По объему - не на много больше приведенного кода, но много понятнее...
Simple Nothing is f*cked15.05.06 17:20
Simple
NEW 15.05.06 17:20 
in Antwort Murr 15.05.06 17:17
Он просит помочь решить задачу, а не изменить условие :-D
Murr коренной житель15.05.06 17:21
Murr
NEW 15.05.06 17:21 
in Antwort JacksonB 15.05.06 16:39
Если у тебя парсинг строк только такого вида, без пробелов вокруг знака "="
то наверняка есть стандартная процедура, нарезающая строку на куски с разделителем ПРОБЕЛ и после этого - еще раз каждый из кусков по знаку "="... смотри в сторону split(?)
Murr коренной житель15.05.06 17:29
Murr
NEW 15.05.06 17:29 
in Antwort Simple 15.05.06 17:20
VC++ 6.0 последний раз я работал году этак в 98-м... С тех пор - зарекся что-либо на нем делать и/или править... Ну если только ооочень-ооочень хоршо (материально) просят...
JacksonB гость15.05.06 17:44
JacksonB
NEW 15.05.06 17:44 
in Antwort 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 
in Antwort JacksonB 15.05.06 17:44
У меня босс обычно спрашивает - сколько времени займет вариант с пробелами и сколько - без. Меньше без - пишем в доку, что пробелов там не должно быть, и все должно быть отквочено... В любом случае нет смысла разбирать строку посимвольно...
И подумай серьезно об XML - для этих вещей он проще...
  scorpi_ скептик16.05.06 00:46
NEW 16.05.06 00:46 
in Antwort 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 
in Antwort JacksonB 15.05.06 17:44
Пардон, про пробелы не прочитал, но переделывать мне сейчас некогда, да и лень...
Simple Nothing is f*cked16.05.06 10:11
Simple
NEW 16.05.06 10:11 
in Antwort JacksonB 15.05.06 17:44
Тебе Вадим выше писал про метод конечных элементов. Поищи в сети, там есть даже готовый код.
1 2 3 4 5 6 7 8 9 alle