Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

 

  Вопрос: C++ vs Basic Добавлено: 21.03.05 18:24  

Автор вопроса:  Дмитрий Щапов

Ответить

  Ответы Всего ответов: 127  

Номер ответа: 46
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #46
Добавлено: 25.03.05 22:48
А где там функция получения символа с указанным кодом и строки можно объединять только всякими strcat , а просто"+" нельзя чтоль?
В Си символ char - это число, никаких преобразований не требуется. Если хочешь просто "+", создай свой класс строк и перегрузи для него оператор "+".
В replace я встрял мне надо скопировать n символов не от начала строки, а с какой-то позичии.
Укажи strncpy адрес твоей позиции, т.е. str+pos

Ответить

Номер ответа: 47
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #47 Добавлено: 26.03.05 01:59
Можно сделать примерно так:

//===============================================
int Replace(char* MainString, char* MatchString, char* NewMatch, int bufferLenght){
    LPSTR NewString;
    char* StartAddr;
    char* InAddr;
    int InPosition=0;
    int offset=0;
    int count=0;
    //--если не нашли подстроку - выходим с нулём
    if(NULL == (InAddr=strstr(MainString, MatchString))) return 0;
    //--выделяем кусок памяти размером входной строки+1------
    NewString = (LPSTR)VirtualAlloc(NULL,strlen(MainString)+1,MEM_COMMIT,PAGE_READWRITE );
    StartAddr = MainString; //--адрес, начиная от которого ищем---
    //--цикл пока есть вхождения подстроки
    while(NULL != (InAddr=strstr(StartAddr,MatchString))){
        InPosition=InAddr-StartAddr; //-позиция вхождения от стартовой позиции
        //--копируем от стартовой позиции до вхождения
        memcpy(NewString+offset, StartAddr, InPosition);
        //--цепляем новый фрагмент
        strcat(NewString, NewMatch);
        //--смещаемся по строке---
        StartAddr = StartAddr+InPosition+strlen(MatchString);
        offset= strlen(NewString);
        count++; //--счётчик количества вхождений/замен
        }
    //--когда все вхождения подстроки заменили на новые
    //--цепляем остаток строки
    strcat(NewString, StartAddr); //--теперь по адресу NewString - новая строка
    //--если она вмещается в старый буфер, то копируем
    if (bufferLenght >= strlen(NewString)){
        strcpy(MainString, NewString);
        }
    else {
        count = strlen(MainString)-strlen(NewString);
        }
    //--освобождаем память под временную строку
    VirtualFree(NewString,strlen(MainString)+1,MEM_DECOMMIT);
    //-- возвращаем count:
    //-- если count<0, то вх.буфер был мал, count - сколько не хватило
    //-- если >0, то count - кол-во произведенных замен.
    return count;

}


//===============================================
    char Main[100];
    char Match[10];
    char NewMatch[10];
    int cnt;

    strcpy(Main,"Thiis is the old striing";);
    strcpy(Match,"i";);
    strcpy(NewMatch,"aaaa";);
    if (0 <= (cnt = Replace((char*) Main, (char*) Match, (char*) NewMatch, 100))){
        MessageBox(hWnd, Main, NewMatch,0);
        }
    else {
        wsprintf(buffer,"%ld",cnt);
        MessageBox(hWnd, buffer, "Буфер Main слишком мал", 0);
        }


Ф-ция конечно не самая оптимальная, наверное можно и улучшить, как говорится, карты в руки :)

VirtualAlloc - это конечно "из пушки по воробьям", но в пределах длины строки, кратной 64 кБ проблем не будет. Если в процессе преобразования длина перевалила порог следующего 64 -килобайтного куска, наступит кердык. Кердык можно обрабатывать в обработчике исключений.
Если строка не перевалила порог следующих 64 кБ, проблем нет. Или если она вообще уменьшилась.

Если ф-ция возвращает 0, - искомая строка не найдена в главной строке, > 0 - количество произведенных замен, если < 0 - места во входном буфере мало (возвращает на сколько надо растянуть его, чтобы выходная строка поместилась).

Ответить

Номер ответа: 48
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #48
Добавлено: 26.03.05 10:38
блин, я Вам говорю, юзайте MFC для этого! Вам очень быстро надоесть кодить на таком низком уровне, CString все делает сам. Я тоже когда-то думал, что лучше через char , но думал я неправильно. MFC здорово облегчает жизнь программисту.

Ответить

Номер ответа: 49
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #49
Добавлено: 26.03.05 11:10
DaSharm, прекрати рекламировать каку. Если лень писать свой класс для работы со строками, используйте STL, std::string заметно удобнее и быстрее CString

Ответить

Номер ответа: 50
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #50 Добавлено: 26.03.05 11:29
DaSharm
Пока будешь искать какой-нибудь нужный для работы через mfc .h или ещё чего, можно написать такого рода ф-цию.
Закачал блин пример по работе листвью с базой данных, а там нет двух заголовочных файлов: afxwin.h и afxres.h. Два дня бегал, искал их. Так и не нашёл. За это время можно было сделать свою реализацию :)

Ответить

Номер ответа: 51
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #51
Добавлено: 26.03.05 14:57
Закачал блин пример по работе листвью с базой данных, а там нет двух заголовочных файлов: afxwin.h и afxres.h. Два дня бегал, искал их. Так и не нашёл.
Я за 3 секунды нашел. Может, надо было VS полностью ставить?

Ответить

Номер ответа: 52
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #52 Добавлено: 26.03.05 15:51
Всю VS качать тяжеловато :)
Скачал psdk и toolkit (2003). Но увы, хотя и 70 с лишним мегов, нет большинства файлов, фигурирующих в примерах :(

Ответить

Номер ответа: 53
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #53
Добавлено: 26.03.05 16:47
2cresta: это прикол? afxwin.h и afxres.h стандартные MFC хеадеры.
2Sharp: знаешь, ты напоминаешь мне маленького ребенка, который через свои глупые убеждения делает себе хуже. Но ты не простой блин ребенок, ты и другим хуже хочешь сделать, обзывая MFC говном. MFC - это труд тысяч высококлассных программистов. MFC - это то, что юзают милионы программистов, и радуются этому. Я сам знаю что такое программирование на АПИ и MFC, но я не говорю что одно отстой а другое супер. Всему своё место. Без MFC написание мощной программы с сильным интерфейсом занимает много времени, что нивкакую не нравится заказчикам. Да и вспомни об отладке прог без MFC? Все эти безсонные ночи с отлавливанием утечек памяти...хотя, утечки это только вершина айсберга...

Почему большинство программеров выбирают билдер? Да нет, не потому что тупые, а потому, что они НЕ хотят внось писать написанное. Блин, да перестань ты писать уже свой прогрессбар, таких десятки миллионов уже готовых, что напимали тебе подобные, но успевшие до тебя (ничего личного). Юзай их труд! Без базара, учится нужно (это я про АПИ), но не тогда, когда ты работаешь!

Ответить

Номер ответа: 54
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #54 Добавлено: 26.03.05 18:28
DaSharm
Знаю, что стандартные, только нет их :( Где взять?

Ответить

Номер ответа: 55
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #55 Добавлено: 26.03.05 18:36
Ух ты какое поучение зарядил! Долго в себе копил наверно.

Мда. У меня вышло немного подругому, но полурабочее почемутось.
LPCTSTR replace(const LPCTSTR srcText,const LPCTSTR FindText,const LPCTSTR ReplText){
char *Ret=(char*)srcText;
char *S="";
char *F="";
while (strstr(Ret,(char*)FindText)!=NULL){
F=strstr(Ret,(char*)FindText);
strncat(S,Ret,strlen(Ret)-strlen(F));
strcat(S,ReplText);
strncpy(F,F+2,strlen(F)-strlen(FindText));
strncat(S,F,strlen(F)-strlen(FindText));
Ret=S;
S="";
}
return Ret;
}

Ответить

Номер ответа: 56
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #56 Добавлено: 26.03.05 19:19
Что значит "полурабочее" ?

Ответить

Номер ответа: 57
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #57 Добавлено: 26.03.05 19:46
replace("Error $1","$1","13";)="Error 13" - всё верно
replace("Error 13 in $2","$2",";DXModule";)="Error 13Error 13 in DXModule" - странно...
Короче хоть он вначале ф-ии призваивает S="";F="" но если посмотреть значение(скажем через MessageBox), то во втором случае уже вначале функции S=F="Error 13"; и я никак не могу это изменить.

Ответить

Номер ответа: 58
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #58
Добавлено: 26.03.05 20:08
2Dimm:

сразу тебе скажу, что С++ не так проста, как ты думаешь, и твой код содержит много подводных камней:

char *Ret=(char*)srcText;
char *S="";
char *F="";



Во первых, делают так

char *Ret=srcText;
char *S=NULL;
char *F=NULL;

далее, где выделение памяти под новые строки, на которые будет указывать указатель, где уничтожение указателей? это приведет к утечке памяти и будет твоей головной болью не одну ночь (с отладчиком в руках).

http://programmistu.h12.ru/mfc/detail/21.html

Поищи в любом поисковике тему "утечка памяти"

Ответить

Номер ответа: 59
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #59
Добавлено: 26.03.05 20:11

а не проще юзать CString?

CString a;
a.Replace( ...

Ответить

Номер ответа: 60
Автор ответа:
 Дмитрий Щапов



Вопросов: 71
Ответов: 321
 Профиль | | #60 Добавлено: 26.03.05 20:30
char *Ret=srcText; - непойдёт. Тип разный, нужно преобразовать.

Прикольно. Откуда в CString взялась такая менюшка.

но компилятор говорит 'CString' : undeclared identifier. Чего там подключать надо что-ли.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам