Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странные строки... 
:(
    Опции темы
Coocky
Дата 26.9.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
Второй раз говорю-пользуйся МФС методами--т.е. CString классом.
Что тебе конкретно надо (извини, но немного не понял, распиши плиз, что ты ХОЧЕШЬ сделать со строкой?)
Все сделаем через МФС smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 26.9.2005, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Coocky
Освободить от нее память.
CString... Да мне он и не нужен, все и так работает прекрасно, мне придется много переписывать.

Проблема одна: как освободить правильно память от массива char **arrSzCode ?

Цитата
Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить?
Достаточно delete [] arrSzCode; ?
Потому что вылетаю на :
for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];

Это конечно в раздел С++, но все же...



--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 26.9.2005, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



kometa_triatlon
А я в третий раз smile говорю-будем делать без выделения памяти( вообще-что отладчик показывает на точке вылетания?), т.е. стрингом! smile
Что нуна? smile
Добавлено @ 15:43
И кажется, надо не delete [] arrSzCode[j]; delete arrSzCode[j];eckb d wbrkt
Уже и сам забыл... smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 26.9.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(kometa_triatlon @ 26.9.2005, 15:30)
Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить?
Достаточно delete [] arrSzCode; ?
Потому что вылетаю на :
for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];

Не достаточно, нужно в цикле, как ты и делаешь, но можно просто delete вместо delete[], в обоих случаях.

Вылетаешь ты, 100%, потому что где-то одна строка залазит на место другой и портит информацию, которую ожидает найти при освобождении отладочная версия delete. Точнее, смотри, на освобождении какой строки вылетел - предыдущая и испортила память. Это если они выделяются подряд, что не факт. Но если все блоки одинаковой длины, то так. Ищи блох, короче. Или последуй совету Coocky и перепиши все на строки - это, скорее всего, быстрее будет.


--------------------
...
PM   Вверх
kometa_triatlon
Дата 26.9.2005, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Coocky
Ну дай ребенку поиграться с памятью! smile
Хотя наверное придется переписать...
Справлюсь и сам, но все равно буду делать динамически, все-таки я в массив файл считываю.

Earnest
Поковырялся немного, интересная ситуация...
Вылетаю на последней строке или где-то в районе. Открывает мне файл dllheap.c и тычет мордой в функцию CheckBytes(). Диагноз понятен ))
Попробовал уменьшить кол-во строк в цикле,
Код

for(int j=0; j<nLineCount-2; j++)

но если открыть файл побольше, то не канает, а с десятью строками и так справляется.
Такие пироги... Ну все, иду переписывать.

Это сообщение отредактировал(а) kometa_triatlon - 26.9.2005, 18:26


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
The Thing
Дата 27.9.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 286
Регистрация: 6.9.2004

Репутация: 1
Всего: 3



Что не понятно спрашивай...
Код

void CMyDlg::OnToolsRun()
{
    int nLineCount = m_editCode.GetLineCount();
    
    char **arrSzCode = new char* [nLineCount];
    char *pText, *pCurrentText;

    long lLengthText = m_editCode.GetTextLength() + 1; //bag - returned on one small

    pText = new char [lLengthText + 1];
    pText[lLengthText] = NULL;
    
    m_editCode.GetWindowText(pText, lLengthText);

    pCurrentText = pText;

    int length;
    int iCount = 0;
    while(iCount < nLineCount && pText){ //count sting & test on end text
        
        //********************* strtok(...) ******************************
        //length current line
        length = 0;
        while(*(pCurrentText + length) != '\r' &&
            *(pCurrentText + length) != '\n' && //vryadli popadetsya
            *(pCurrentText + length) )
            length++;
        
        bool bEndNewStr = true; //flag - testing on end text for out '\r\n'
        if( !(*(pCurrentText + length)) )
            bEndNewStr = false; //end text

        arrSzCode[iCount] = new char [ bEndNewStr? (length + 1 + 2) :(length + 1) ];
        
        if(bEndNewStr){ //not end text
            arrSzCode[iCount][length] = 13; //takse mozno ne stavit esli skopirovat is buffera (pText)
            arrSzCode[iCount][length + 1] = 10;
        }
        
        arrSzCode[iCount][ bEndNewStr? (length + 2) :length ] = NULL;

        int i=0;
        for(; i < length; i++) // strcpy(...)
            arrSzCode[iCount][i] = *(pCurrentText + i);
        //********************* END ******************************
        
        
        /*
        CString str;
        m_editOutput.GetWindowText(str);
        str += arrSzCode[iCount];
        m_editOutput.SetWindowText(str);
        */
        

        pCurrentText += length; //seek current text
        
        if(bEndNewStr) //proyti '\r'&'\n'
            pCurrentText += 2;

        iCount++;
    }
        MessageBox("Write is The Thing :))");        

    for(int j=0; j<nLineCount; j++)
        delete [] arrSzCode[j];
    delete [] arrSzCode;

    delete [] pText;
}




--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.