AnsiString

Тема в разделе "WASM.BEGINNERS", создана пользователем Nok, 19 фев 2008.

  1. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    Решил освоить формы..раньше юзал только смд! Ситуация такова, на форме расположенны пять элементов Edit1, Label1, Label2, Label3, Button1:
    Edit1 //ввод слов
    Label1 //вывод количества встречаемых букв
    Label2 //вывод всей суммы букв
    Label3 //частота букв
    В Button1 лежит следующий код:
    Код (Text):
    1. double search(char *str, double size, char ch){
    2. for(int i=0;i<size;i++)
    3. if(str[i] == ch) return i;
    4. return -1;
    5. }
    6.  
    7. void __fastcall TForm1::Button1Click(TObject *Sender)
    8. {
    9. char alpha[] = "абвгджзийклмнопрстуфхцчшщъыьэюя";
    10. double*counters = new double [strlen(alpha)];
    11.  
    12. for(int i=0;i<strlen(alpha);i++)
    13. counters[i] = 0;
    14.  
    15. int i,k,pos,ch;
    16. double sum;
    17. float f;
    18.  
    19. AnsiString cha=ch;
    20. cha= Edit1->Text;
    21.  
    22. pos = search(alpha,strlen(alpha),ch);
    23. if(pos>=0) counters[pos]++;
    24.  
    25. for(i=0;i<strlen(alpha);i++){
    26. Label1->Caption=String(alpha[i])+"="+ String(counters[i]);
    27. }
    28. for(k=0,sum=0;k<strlen(alpha);k++){
    29. sum+=counters[k];
    30. }
    31. Label2->Caption=String (sum);
    32. Label3->Caption="a="+String (counters[0]/sum)+"; б="+(counters[1]/sum);
    33. }
    встретил проблему с ансистрингом, тут и стала программа..
    кто знает пути обхода ансистринга?..
    ЗЫ: Билдер 6.0..
     
  2. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    прибавляешь double к AnsiString?
     
  3. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    http://sources.ru/builder/faq/004.html посмотрел тут!..

    если сделать по аналогии
    Код (Text):
    1. counters= double_as_AnsiString*ToDouble();
    малопомогает..


    ..можно ли вообще избежать использования ансистринга?..
     
  4. shurik

    shurik Александр

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    52
    Адрес:
    Украина
    Nok
    Я бы написал вот так:
    Код (Text):
    1. Label3->Caption="a="+FloatToStr(counters[0]/sum)+"; б="+FloatToStr(counters[1]/sum);
    Никаких проблем не должно быть с такой записью :)
     
  5. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    спасибо, ничего не стал исправлять..проблема в ансистринге!!!!..я не понимаю чего он не хочет читать char-овские букафки?..а требует ансистринг!..
     
  6. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    бросаем мпредложение в Edit1, считаем сколько их в предложении и выводим в Label1..

    Код (Text):
    1. double search(char *str, double size, AnsiString ch){
    2. for(int i=0;i<size;i++)
    3. if(str[i] == ch) return i;
    4. return -1;
    5. }
    6.  
    7. void __fastcall TForm1::Button1Click(TObject *Sender)
    8. {
    9. AnsiString ch,alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя";
    10.  char * alpha2 = alpha.c_str();
    11. double*counters = new double [alpha.Length()];
    12.  
    13. for(int i=0;i<alpha.Length();i++){
    14. counters[i] = 0;  }
    15.  
    16. int i,k,pos;
    17. double sum;
    18. ch =Edit1->Text.c_str();
    19. pos = search (alpha,alpha.Length(),ch);
    20. if(pos>=0) counters[pos]++;
    21.  
    22. for(i=0;i<alpha.Length();i++){
    23. Label1->Caption = Label1->Caption + AnsiString(alpha[i])+"="+ AnsiString(counters[i]);
    24.  }
    25.  }
    пишет => 'Could not convert variant of type (String) into type (Double)'
    ктознает?..
     
  7. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Nok


    ch - AnsiString, str - char. Ты как их сравниваешь? Нет, конечно может и работает, но просто повезло.

    Зачем присваивать alpha2 копию alpha?

    Зачем обычный счетчик типа double?

    AnsiString ch; Идем дальше...
    ch =Edit1->Text.c_str();
    Вообще-то c_str() возвращает копию строки в виде стандартной для C/C++ SZ-строки. И эта строка потом обратно преобразуется - глупость.

    Учти, при выхове опять неявно вызывается c_str().


    Лучше и правда, как предлагали, FloatToStr().

    Вообще, складывается чувство, что ты совершенно не понимаешь, что пишешь - какое-то собрание разрозненных кусков странного кода. Может стоит сначала почитать теорию?
     
  8. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    не скрываю, что ничерта не смысло в с++..тем более в ядре Форточек..но зато есть желание..
    исправил по твоим замечаниям..
    Код (Text):
    1. void __fastcall TForm1::Button1Click(TObject *Sender)
    2. {
    3. AnsiString ch,alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя";
    4. int i,k,p;
    5. ch =Edit1->Text;
    6. double*counters;
    7. for(k=1;k<ch.Length();k++){
    8. p=AnsiPos(alpha,ch);
    9. if(p>=0) counters[p]++;;
    10. }
    11.  
    12.  
    13. for(i=1;i<alpha.Length();i++){
    14. Label1->Caption = Label1->Caption + FloatToStr(alpha[i])+"="+ FloatToStr(counters[i]);
    15. }
    16. }
    чтонитак обьясняй?..
     
  9. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    Nok
    Вообще-то, большинство компиляторов и сред разработки сообщают номер строки, содержащей ошибку. BCB входит в их число. Задумайся об этом. Еще рекомендую задуматься на тему "представление символов в памяти компьютера" и, опционально, "кодировки" - это сделает алгоритм и код значительно красивее.
    Извиняюсь, мне искренне интересно, что это?

    Ах да, еще рекомендую задуматься о приобретении какого-нибудь учебника по С++.
     
  10. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    интересно, отвечу..смд-консоль!..т.е имелось ввиду..юзал Борланд через Console Wizard=)

    спасибо за советы=)..
     
  11. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Nok
    Ты не все исправил :derisive:

    Код (Text):
    1. ch =Edit1->Text;
    Я очень надеюсь, что в Edit1 содержится строка из одного символа. Иначе весь последующий код - полный бред, честно.

    Кроме того
    Код (Text):
    1. p=AnsiPos(alpha,ch);
    AnsiPos, если мне память не изменяет, вызывается так AnsiPos( искомая_подстрока, строка_host ), а не наоборот :)

    Код (Text):
    1. if(p>=0) counters[p]++;;
    Убери второй ";" и объясни, зачем в counters в качестве позиции задавать позицию найденного символа?

    Код (Text):
    1. Label1->Caption = Label1->Caption + FloatToStr(alpha[i])+"="+ FloatToStr(counters[i]);
    alpha это что? double? нет. так зачем тогда FloatToStr(alpha)? Тут вообще ничего не нужно, просто alpha.

    Еще раз прошу, почитай книжки по C/C++ и по BCB (например \CBuilderX\Help\bcbX.hlp, раздел "VCL Reference - AnsiString").
     
  12. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    тут поподробней плз!..
    не ведал, что пишу!..

    всеостальное исправил..но не успокоюсь пока программулина не залинкуеццо!..
    читаю горы мануалов и фак!...
    Код (Text):
    1. double search(char *str, double size, char ch){
    2. for(int i=1;i<size;i++)
    3. if(str[i] == ch) return i;
    4. return -1;
    5. }
    6. void __fastcall TForm1::Button1Click(TObject *Sender)
    7. {
    8. AnsiString cha, alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя";
    9. int i,k,p;
    10. char ch;//попросил инициализировать ch, не стал ругатся с ним=)..
    11. cha =Edit1->Text;//Борланд требовал занос в ансистринг..попросил, сделал!
    12. for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString
    13. char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html
    14.  
    15. p= search(alpha,alpha.Length(),ch);
    16. if(p>=0) counters[p]++;    //заносим в counters[p] если не нуль и не меньше 1;
    17.  
    18. for(i=1;i<alpha.Length();i++){
    19. Label1->Caption = Label1->Caption + alpha[i]+"="+ counters[i];
    20. //вывод содержимого alpha[i] + счетчик букв counters[i]
    21. }
    22. }
     
  13. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    Теперь скажи, что по твоему эта *штука* должна сделать?

    Тут есть несколько серьезных боков.

    1. переменная counters объявляется внутри цикла for.... я точно не помню, но вроде ее область видимости - именно этот цикл.

    2. она объявляется как char, а в дальнейшем (за пределами тела цикла) используется как char*;

    4. Используется неинициализированная переменная int k;

    3. Следовательно, наверное имелось в виду:

    Код (Text):
    1. char* counters = new char[cha.Length()];
    2.  
    3. for (int i =0; i < cha.Length(); ++i) counters [i] = cha[i];
    Дальше по тексту используется неинициализированная переменная ch, которую ты хочешь найти в строке.......... короче, это все бред. Учи C++;
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Nok
    Что-то сложно пишешь.
    Я тут накалякал, сразу говорю, что даже и не проверял, сам проверишь и допишешь.

    Код (Text):
    1. int counters[256];
    2. String word = Edit1->Text;
    3. int Num = 0;
    4. DWORD Sum = 0;
    5.  
    6. memset(counters, 0, 256*sizeof(int));
    7.  
    8. for (int i = 1; i <= word.Length(); i++)
    9. {
    10.   BYTE b = word[i];
    11.   Sum += b;
    12.   if (!counters[b]) Num++;
    13.   counters[b]++;
    14. }
    15.  
    16. Label1->Caption = String(Num);
    17. Label2->Caption = String(Sum);
    18. String str = "";
    19.  
    20. for (int n= 0; n < 256; n++)
    21. {
    22.   if (counters[n]) str += String(n) + ":" + FormatFloat("0.00", (float)counters[n]/Sum);
    23. }
    24.  
    25. Label3->Caption = str;
     
  15. shurik

    shurik Александр

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    52
    Адрес:
    Украина
    Nok
    Код (Text):
    1. for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString
    2. char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html
    В counters на каждом цикле будет переписыватся старое значение новым.

    Код (Text):
    1. if(p>=0) counters[p]++;    //заносим в counters[p] если не нуль и не меньше 1;
    Работать не будет, counters как char описан, а не как массив чаров.

    char ch; - описан, но нигде ему никакое значение не присваивается :dntknw:
    Зато в
    Код (Text):
    1. p= search(alpha,alpha.Length(),ch);
    используется

    Пройдись по программе своей внимательно и посмотри что она делает.
    В отладчике погляди и все станет ясно.
    В данном виде она работать правильно не может.

    Пока писал меня опередили
     
  16. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    чувак, жутко извиняюсь за тупняк..а именно за..
    Код (Text):
    1. for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString
    2. char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html[/quote]
    имел ввиду другое(см. код дальше)

    вникнул на свежую голову и пошел дальше исправлять!..
    Код (Text):
    1. double search(char *str, double size, char ch){
    2. for(int i=1;i<size;i++)
    3. if(str[i] == ch) return i;
    4. return -1;
    5. }
    6. void __fastcall TForm1::Button1Click(TObject *Sender)
    7. {
    8. AnsiString cha;
    9. char alpha[] = "абвгджзийклмнопрстуфхцчшщъыьэюя";//тут протупил, исправил!..
    10. int i,k,p;
    11. char ch;//попросил инициализировать ch, не стал ругатся с ним=)..
    12. char* counters = new char[cha.Length()];
    13.  
    14. cha =Edit1->Text;//Борланд требовал занос в ансистринг..попросил, сделал!
    15.  
    16.  //*********вот эти строчки мне больше всего непонятны, писал наугад*********
    17. for(k=0;k<cha.Length();k++) { // получение char ch  из  cha AnsiString
    18. char ch = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html
    19.                   // м.б. просто записать char ch = cha;???
    20.  
    21. p= search(alpha,strlen(alpha),ch);
    22. if(p>=0) counters[p]++;    //заносим в counters[p] если не нуль и не меньше 1;
    23.  
    24. for(i=0;i<strlen(alpha);i++){
    25. Label1->Caption = Label1->Caption + alpha[i]+"="+ counters[i];
    26. //вывод содержимого alpha[i] + счетчик букв counters[i]
    27. }
    28. }
    даже залинковался..и создал ехе файл..но ругатся меньше не стал!..

    андер констракшн!..
     
  17. Nok

    Nok New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    33
    программулина работает, проверил..написал с первого раза..мне до тебя далеко но буду стремиццо!=)..
    но мне важно чтобы мой код заработал..просто уже самому интересно что пля в ней нитак!...