has triggered a breakpoint как исправить?

 
0
 
C++
ava
Tema1 | 28.03.2013, 18:19
Привожу небольшой код моей программы, в этой программе пользователь вносит цифры по англ., программа отделяет эти слова, сверяет их с данными в файле ( там в разных файлах разные данные, единицы, десятки и т.д) и выводит эти цифры на старо Русском и Римскими цифрами, вопрос в том что когда я очищаю память delete []ch; в конце программы, программа выдает мне такую ошибку "rab_2.exe has triggered a breakpoint." Приведу небольшой код моей программы, работы только с единицами и десятками -

//////////Римские
    CString S_one ("I"); CString S_two ("II"); CString S_three("III"); CString S_four("IV"); CString S_five("V");    
    CString S_six("VI"); CString S_seven("VII"); CString S_eight("VIII"); CString S_nine("IX"); CString S_ten("X");  
    CString S_50("L");

    CString S_100("C"); CString S_500("D"); CString S_1000("M");

    //////////Старо-Русские

    CString SR_100("P"); CString SR_200("C"); CString SR_300("T");CString SR_400("Y"); CString SR_500("Ф"); CString SR_600("X");
    CString SR_700("'ПСИ'"); CString SR_800("W"); CString SR_900("Ц");

    CString SR_10("I"); CString SR_20("K"); CString SR_30("Л");CString SR_40("M"); CString SR_50("H"); CString SR_60("'КСИ'");
    CString SR_70("O"); CString SR_80("П"); CString SR_90("Ч");

    CString SR_1("A"); CString SR_2("B"); CString SR_3("Г");CString SR_4("Д"); CString SR_5("Е"); CString SR_6("S");
    CString SR_7("З"); CString SR_8("И"); CString SR_9("'ФИТА'");
    ///////////
       
CString array[50];
    int flag = 0;                                                 //для проверки на какой строке находится курсор
    int shet = 0;                                                 // тут выдает кол символов
    CEdit * pEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1);
    CEdit * pEdit2 = (CEdit*)GetDlgItem(IDC_EDIT2);  //  вывод Русских цифр
    CEdit * pEdit3 = (CEdit*)GetDlgItem(IDC_EDIT3);  //  вывод Римских цифр
    
    
    char *ch = new char[str.GetLength()+1];                           
    pEdit1->GetWindowText(str);
    //содаем файл для чтения    
     CStdioFile File(_T("c:\\tr\\Units.txt"),CFile::modeRead);          
     CStdioFile File_1(_T("c:\\tr\\dozens.txt"),CFile::modeRead);       
     CStdioFile File_2(_T("c:\\tr\\hundreds.txt"),CFile::modeRead);
     CStdioFile File_3(_T("c:\\tr\\Units_1.txt"),CFile::modeRead);
     CStdioFile File_4(_T("c:\\tr\\and_1.txt"),CFile::modeRead);

    str.TrimLeft(_T(" "));                                        // вырезает все пробелы спереди
    str.TrimRight(_T(" "));                                       // вырезает все пробелы сзади

    while ( str.Replace("  ", " ") > 0 ){                        // вырезает лишнии пробелы в строке
            strcpy(ch,str); 
    }
    while ( str.Replace("   ", " ") > 0 ){
            strcpy(ch,str); 
    }
    while ( str.Replace("    ", " ") > 0 ){
            strcpy(ch,str); 
    }
    while ( str.Replace("     ", " ") > 0 ){
            strcpy(ch,str); 
    }
    while ( str.Replace("      ", " ") > 0 ){
            strcpy(ch,str); 
    }
    strcpy(ch,str); 
    for(int j = 1; j < 6; j++){          //цикл для массивов стринга(максимально должно быть 5 слов)
     for(int i = shet; i < (str.GetLength()+1); i++){
        ///////// 1 var
         if(ch[i] == ' ') {
             ch[i] = '.';                      //заменим точку на пробел после
             
             break;
         }
         array[j] = array[j] + ch[i];        //
            shet = shet + 1;                     // тут выдает кол символов
     }
    }


    int slag_zero = 5;
    for(int j = 1; j < 6; j++){
    if(array[j].IsEmpty())                                            // проверяет пустая ли строка или нет
        slag_zero = slag_zero - 1;                                    
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         ////////////////////////////////////////////////////////////////////////////////////////////////////////
if(slag_zero == 2){
    /////////////////////////////////////////////           десятки              ///////////////////////////////////
        
         for(int i = 1; i < 21; i++){
             int x = 0;
             CString m;                             //для того что бы к слову прибавить апостроф
             m = array[1];
             while ( m.Replace(".", " ") > 0 ){         // место точки ставит пробелы
               }
             m.TrimLeft(_T(" "));                                        // вырезает все пробелы спереди
             m.TrimRight(_T(" "));                                       // вырезает все пробелы сзади
             File_1.Seek( i , CStdioFile::current);
             File_1.ReadString(proverk3);
             //AfxMessageBox(str_2);
             if(proverk3.CompareNoCase (m) == 0){
                 switch (i)
                 {
                 case 2: Buf = Buf + S_ten;  
                         Buf_R = Buf_R + SR_10; 
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1;  break;
                 case 3: Buf = Buf + S_ten + S_one ;   
                         Buf_R = Buf_R + SR_10 + SR_1; 
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 4: Buf = Buf + S_ten + S_two;
                         Buf_R = Buf_R + SR_10 + SR_2;
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 5: Buf = Buf + S_ten + S_three; 
                         Buf_R = Buf_R + SR_10 + SR_3; 
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 6: Buf = Buf + S_ten + S_four;  
                         Buf_R = Buf_R + SR_10 + SR_4; 
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 7: Buf = Buf + S_ten + S_five;  
                         Buf_R = Buf_R + SR_10 + SR_5;
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 8: Buf = Buf + S_ten + S_six;  
                         Buf_R = Buf_R + SR_10 + SR_6;
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 9: Buf = Buf + S_ten + S_seven;  
                         Buf_R = Buf_R + SR_10 + SR_7; 
                         pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 10: Buf = Buf + S_ten + S_eight;  
                          Buf_R = Buf_R + SR_10 + SR_8; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 11: Buf = Buf + S_ten + S_nine;  
                          Buf_R = Buf_R + SR_10 + SR_9; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                //////////
                 case 12: Buf = Buf + S_ten + S_ten;
                          Buf_R = Buf_R + SR_20; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 13: Buf = Buf + S_ten + S_ten + S_ten;
                          Buf_R = Buf_R + SR_30; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 14: Buf = Buf + S_ten + S_50;
                          Buf_R = Buf_R + SR_40; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 15: Buf = Buf + S_50;
                          Buf_R = Buf_R + SR_50; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 16: Buf = Buf + S_50 + S_ten;
                          Buf_R = Buf_R + SR_60; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 17: Buf = Buf + S_50 + S_ten + S_ten;
                          Buf_R = Buf_R + SR_70; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 18: Buf = Buf + S_50+ S_ten + S_ten + S_ten;
                          Buf_R = Buf_R + SR_80; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 case 19: Buf = Buf + S_ten + S_100;
                          Buf_R = Buf_R + SR_90; 
                          pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf); x = x + 1; break;
                 }
             }
         }

         for(int i = 1; i < 11; i++){
         int x = 0;
         CString m,g;                             //для того что бы к слову прибавить апостроф
         m = array[2] - '\0' ;
      g = m  + '\t';
        while ( g.Replace(".", " ") > 0 ){         // место точки ставит пробелы
               }
        g.TrimLeft(_T(" "));                                        // вырезает все пробелы спереди
        g.TrimRight(_T(" "));                                       // вырезает все пробелы сзади
         File_3.Seek(i , CStdioFile::current);       
         File_3.ReadString(proverk4);
         if( (proverk4.CompareNoCase (g) == 0)) {
         switch (i)
            {
           case 2: Buf = Buf + S_one;  
                   Buf_R = Buf_R + SR_1; 
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 3: Buf = Buf + S_two ;   
                   Buf_R = Buf_R + SR_2;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 4: Buf = Buf + S_three ;   
                   Buf_R = Buf_R + SR_3;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 5: Buf = Buf + S_four ;   
                   Buf_R = Buf_R + SR_4;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
        case 6: Buf = Buf + S_five ;   
                   Buf_R = Buf_R + SR_5;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 7: Buf = Buf + S_six ;   
                   Buf_R = Buf_R + SR_6;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 8: Buf = Buf + S_seven ;   
                   Buf_R = Buf_R + SR_7;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 9: Buf = Buf + S_eight ;   
                   Buf_R = Buf_R + SR_8;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
           case 10: Buf = Buf + S_nine ;   
                   Buf_R = Buf_R + SR_9;
                   pEdit2->SetWindowText(Buf_R); pEdit3->SetWindowText(Buf);  x = x + 1; break;
         }
       }
         }
}
delete []ch;                   // когда тут ставлю это - выдает ошибку, без нее нормально
File.Close();
File_1.Close();
File_2.Close();
File_3.Close();
File_4.Close();



вот я тут создаю ch

char *ch = new char[str.GetLength()+1];

и в конце его очищаю

delete []ch; 

Если очистку не делаю все нормально работает с десятками и единицами (но если пишу delete []ch; , выдает ошибку "rab_2.exe has triggered a breakpoint.".), но когда в ch забиваю более 4 слов, тоже выдает ту же ошибку "rab_2.exe has triggered a breakpoint." (и если есть delete []ch; и если ее нет).
В интернете про это не чего дельного не нашел, где что то переполняется не понимаю, объясните и если есть какие то методы покажите как это исправить, ну и лучшие решении этой задачи конечно тоже буду рад слышать))
Заранее спасибо)
Ответы (5)
ava
volatile | 28.03.2013, 18:06 #
Tema1, в дебагере уберите брекпоинт.
брекпоинт - точка останова, для отладки, которую вы (или не вы) поставили.
ava
Albor | 28.03.2013, 18:50 #
Tema1, избавьтесь вообще от массива char и от копирования в него CString. CString имеет достаточно средств, чтобы просмотреть строку посимвольно - есть и оператор [], и GetAt() и SetAt(). Вам ни чего не мешает работать с CString точно так же, как и с массивом.
ava
Tema1 | 29.03.2013, 07:06 #
если убираю брекпоинт когда написан код

delete []ch;


то вылетает такая ошибка
user posted image

А по поводу GetAt() и SetAt() , я сейчас посмотрю что и как, может попробую переделать с ними.
ava
Albor | 29.03.2013, 07:49 #
Tema1, код в первом топике, вы сначала выделяете память, используя размер строки str, а потом получаете саму строку из эдитбокса - так ли задумывали? Или, всё же, строки 28 и 29 нужно поменять местами?
ava
Tema1 | 29.03.2013, 08:42 #
нет это сделано машинально)) и ошибка исчезла, по крайней мере с единицами и десятками точно)) сейчас буду проверять))
ОГРОМНОЕ СПАСИБО))
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Albor   volatile   Tema1
advanced
Отправить