Цитата(Gunslinger @ 12.11.2008, 11:01) | Буйство в смысле опять код косячный? |
В смысле не надо пытаться изобретать велосипеды, а надо пользоваться стандартными библиотеками, на то они и сделаны.
Цитата | Твой код слишком крут для моей неокрепшей психики - кроме ключевых слов ничего не понял Объяни смысл своего алгоритма, я напишу.
|
Это уже готовый кусок программы (с небольшими ошибками )
Код | int eat_syms(const char* &str) { int rv=0; for(;isalpha(*str);++str) rv=rv*26+toupper(*str)-'A'; return rv; }
|
Функция сканирует поданную строку (str), все найденные в начале буквы трактует как число в позиционной системе счисления по оснаванию 26 (A - 0, B-1 и т.д.) Возвращает что получилось, строку продвигает на первую не букву
Код | int cvt_syms(const char* &str) { const char* s=str; int rv=eat_syms(str); switch(str-s) { case 2: rv+=26; break; case 3: rv+=26*26+26; break; } return rv+1; }
|
Функция берет число, возвращенное предыдущей функцией, вычисляет длинну букв в начале и прибавляет сдвиг, т.к. 2х и 3х буквенные имена столбцов соотвествуют разным начальным столбцам (2х буквенные начинаются с 26го столбца, после последнего одно буквенного, 3х буквенные - после последнего 2х буквенного)
Код | void cvt_addr(const char* &str, int& x, int& y) { y=cvt_syms(str); x=strtoul(str,(char**)&str,10); }
|
Функция отгрызает от строки буквенный префикс и записывает его в y, потом отгрызает цисло, записывает его в x, str передвигается за число
Код | cvt_addr(str,x1,y1); if (*str==':') cvt_addr(++str,x2,y2);
|
Вычисляется x1 & y1, затем проверяется, если первый необработанный символ ':', то он пропускается и все, что за ним записывается в x2 & y2
|