Тема: Вопрос по C++ Builder 6

Ответить в теме
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 20 из 60
  1. Вверх #1
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320

    Exclamation Вопрос по C++ Builder 6

    Вот такой вот вопрос:
    Какой обработчик событий надо написать, чтобы он из поля для текста Edit1 получал значение и помещал его квадратный корень в поле Edit2? Функция корня мне известна, только при компиляции следующего кода:
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <math.h>

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if (!(Edit1->Text == ""))
    {
    Edit2->Text = sqrt(Edit1->Text);
    Edit1->Text = "" ;
    }
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Close();
    }
    //---------------------------------------------------------------------------
    выдается ошибка на строке 24: Cannot convert 'AnsiString' to 'double'. В общем, Edit1->Text считается за текстовый тип, а надо, чтоб был тип double (численный с плавающей точкой). Вот такой вот проблем.
    In TRANCE I trust...


  2. Вверх #2
    Посетитель Аватар для Bewza
    Пол
    Мужской
    Адрес
    Город, которого нет...
    Возраст
    38
    Сообщений
    355
    Репутация
    32
    Естесственно...
    Edit2->Text типа string, а ты что ему присваиваешь?
    sqrt(Edit1->Text) корень из строки - это строка под корнем?
    Используй ф-ии перевода string <-> double
    Что случилось однажды, может никогда больше не случиться. Но то, что случилось два раза, непременно случится и в третий.

  3. Вверх #3
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    37
    Сообщений
    2,915
    Репутация
    168
    Например,
    double atof(const char *nptr);
    из <сstdlib> (надо будет из AnsiString вытащить char*)
    или наверняка какие-то процедуры из билдеровой библиотеки существуют...
    ~ Motivation is what gets you started. Habit is what keeps you going.

  4. Вверх #4
    Новичок
    Пол
    Мужской
    Возраст
    39
    Сообщений
    38
    Репутация
    15
    Из билдеровских есть StrToFloat

  5. Вверх #5
    Постоялец форума Аватар для andriyBog
    Пол
    Мужской
    Адрес
    Одеса, Україна
    Возраст
    43
    Сообщений
    1,522
    Репутация
    1388
    помоему ты этот обработчик уже написал, вернее билдер за тебя сгенерил.
    а так ламерски пытаться вычислить квадратный корень строки,
    ты что незнаешь что такое типы данных?

  6. Вверх #6
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Цитата Сообщение от andriyBog
    помоему ты этот обработчик уже написал, вернее билдер за тебя сгенерил.
    а так ламерски пытаться вычислить квадратный корень строки,
    ты что незнаешь что такое типы данных?
    билдер не генерит ОБРАБОТЧИКОВ, он только создает соответствующие функции.
    А вот такое компилится и работает как надо (всего лишь 2 символа добавил):
    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop
    #include <math.h>

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if (!(Edit1->Text == ""))
    {
    Edit2->Text = sqrt(Edit1->Text*1);
    Edit1->Text = "" ;
    }
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Close();
    }
    //---------------------------------------------------------------------------
    In TRANCE I trust...

  7. Вверх #7
    Посетитель Аватар для Bewza
    Пол
    Мужской
    Адрес
    Город, которого нет...
    Возраст
    38
    Сообщений
    355
    Репутация
    32
    Да, билдер отличается абсолютной тупостью...
    Что случилось однажды, может никогда больше не случиться. Но то, что случилось два раза, непременно случится и в третий.

  8. Вверх #8
    Тигровна Аватар для Tigra
    Пол
    Женский
    Адрес
    /dev/null
    Сообщений
    1,528
    Репутация
    267
    Edit2->Text = sqrt(Edit1->Text*1);
    Искренне советую - если будешь когда-нибудь устраиваться на работу программистом - никому не показывай такой код
    То, что билдер позволяет делать такие вещи отнюдь не значит, что так надо делать))) Существует не один человеческий способ преобразования типов.. Лучше сразу привыкать писать по-хорошему - потом будет трудно отучаться
    Не будите во мне Зверя, он и так не высыпается

  9. Вверх #9
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Спасибо за совет. Примем к сведению.
    А как по-грамотному можно преобразовать градусы в радианы (для функций sin, cos, tan и т. д.)? При вызове функции DegToRad выдается "Call to undefined function DegToRad..."
    In TRANCE I trust...

  10. Вверх #10
    Посетитель
    Пол
    Мужской
    Сообщений
    110
    Репутация
    16
    Если название функции ты написал правильно, то возможно, нужно просто подключить библиотеку типа
    #include <math>

  11. Вверх #11
    Новичок
    Пол
    Мужской
    Возраст
    39
    Сообщений
    38
    Репутация
    15
    Преобразовать градусы в радианы можно по формуле
    Radians = Degrees * PI / 180

  12. Вверх #12
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Цитата Сообщение от Konstantin.od
    Если название функции ты написал правильно, то возможно, нужно просто подключить библиотеку типа
    #include <math>
    В том то и дело, что подключал... а все без толку.
    In TRANCE I trust...

  13. Вверх #13
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    спасибо за ответ! помогло.
    А для использования DegToRad, RadToDeg, StrToFloat потребовалось включить спецбиблиотеки <vcl\math.hpp>, <vcl\sysutils.hpp> и все заработало как надо. Кому интересен результат - смотрим прогу во вложении.

    P.S. Прога будет работать только при установленном CBuilder 6 (там какие-то особые файлы нужны для нее).
    Вложения
    • Тип файла: zip calc.zip (12.5 Кб, Просмотров: 37)
    In TRANCE I trust...

  14. Вверх #14
    Постоялец форума Аватар для andriyBog
    Пол
    Мужской
    Адрес
    Одеса, Україна
    Возраст
    43
    Сообщений
    1,522
    Репутация
    1388
    Цитата Сообщение от NoXX
    P.S. Прога будет работать только при установленном CBuilder 6 (там какие-то особые файлы нужны для нее).

    По умолчанию собираются проги которые запускаются при наличии установленного CBuilder 6, там нужно гдето галочку в настройках компиляции поставить или убрать (плохо знаком с С++ и CBuilder 6)

  15. Вверх #15
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Цитата Сообщение от andriyBog
    По умолчанию собираются проги которые запускаются при наличии установленного CBuilder 6, там нужно гдето галочку в настройках компиляции поставить или убрать (плохо знаком с С++ и CBuilder 6)
    да, я как раз хотел спросить, как собирать приложения так, чтобы они работали и без установленного CBuilder?
    In TRANCE I trust...

  16. Вверх #16
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    37
    Сообщений
    2,915
    Репутация
    168
    Цитата Сообщение от NoXX
    да, я как раз хотел спросить, как собирать приложения так, чтобы они работали и без установленного CBuilder?
    не использовать VCL
    ~ Motivation is what gets you started. Habit is what keeps you going.

  17. Вверх #17
    Новичок
    Пол
    Мужской
    Возраст
    41
    Сообщений
    68
    Репутация
    12
    Цитата Сообщение от Яр
    не использовать VCL
    Загнул. Зачем так жёстко.
    Всё просто. Надо перво наперво снять галочку "Build with Runtime Packages". Находиться она в "Project" - "Options" вкладка "Packages"
    Для старших (тоесть новых 2005 и 2006) версий нужно ещё одну галочку снять.
    Находиться она в этом же окошке, но нужно перейти в дереве на linker (ilink32.exe) -> Linking и снять галочку "Use dynamic RTL"

    А вы тут расфлудились

  18. Вверх #18
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Цитата Сообщение от Яр
    не использовать VCL
    в натуре загнул... куда ж в билдере без него?
    In TRANCE I trust...

  19. Вверх #19
    pHp-ProGRaMMeR Аватар для NoXX
    Пол
    Мужской
    Возраст
    33
    Сообщений
    1,690
    Репутация
    320
    Цитата Сообщение от KoVadim
    Загнул. Зачем так жёстко.
    Всё просто. Надо перво наперво снять галочку "Build with Runtime Packages". Находиться она в "Project" - "Options" вкладка "Packages"
    Для старших (тоесть новых 2005 и 2006) версий нужно ещё одну галочку снять.
    Находиться она в этом же окошке, но нужно перейти в дереве на linker (ilink32.exe) -> Linking и снять галочку "Use dynamic RTL"

    А вы тут расфлудились
    большое спасибо за ответ!
    еще такой вопрос по C++:
    при выполнении следующего скомпилированного кода:
    #include <iostream>
    #include <math.h>

    using namespace std;

    bool Continue (const char *theThingWeAreDoing)
    {
    char DoneCharacter;
    cout << endl << theThingWeAreDoing << " - Nazhmite \"n\" i \"Enter\" dlya vihoda ili druguyu klavishu dlya povtora: ";
    cin >> DoneCharacter;

    return (DoneCharacter != 'n');
    }
    int NumError(void)
    {
    cerr << "Vozmozhno vi vveli ne chislo!" << endl;
    cin.clear();
    char BadInput[5];
    cin >> BadInput;
    return 1;
    }
    int main(int argc, char* argv[])
    {
    do
    {
    try
    {
    cout << "Vvedite argumenty a, b, c uravneniya vida \"ax2 + bx + c = 0\" v sootvetstvii s ih znakami. a ne dolzhno byt' ravno 0." << endl;

    double a = 1;
    cout << "a: ";
    cin >> a;
    if(a == 0)
    {
    cout << "a ne dolzhno byt' ravno 0!" << endl;
    }
    else
    {
    double b = 0;
    cout << "b: ";
    cin >> b;

    double c = 0;
    cout << "c: ";
    cin >> c;

    double D = (b*b)-(4*a*c);
    if(D < 0)
    {
    cout << "Diskriminant menshe 0!" << endl;
    }
    else
    {
    double x1 = (-(b)-sqrt(D))/(a*2);
    double x2 = (-(b)+sqrt(D))/(a*2);
    if(D == 0)
    {
    cout << "x = ";
    cout << x1;
    cout << "." << endl;
    }
    if(D > 0)
    {
    cout << "x1 = ";
    cout << x1;
    cout << ";" << endl;
    cout << "x2 = ";
    cout << x2;
    cout << "." << endl;
    }
    }
    }
    }
    catch(...)
    {
    NumError(void);
    };
    }
    while (Continue("Escho raz? "));
    return 0;
    }
    при вводе вместо цифры буквы вылазит что-то наподобии матрицы, то есть управление не передается на блок catch(...).
    Кому интересно - прога в приложенном архиве.

    P.S. При вводе цифр блок повтора работает отлично.
    Вложения
    • Тип файла: zip sqrt.zip (52.1 Кб, Просмотров: 33)
    In TRANCE I trust...

  20. Вверх #20
    Новичок
    Пол
    Мужской
    Возраст
    41
    Сообщений
    68
    Репутация
    12
    Оно у тебя компилируется?
    пока не поправил строку NumError(void); на NumError(); нехотел

    Дальше.
    строка if(D == 0)
    такое условие не будет выполнятся. Нельзя вещественные числа сравнивать на равенство
    нужно приблизительно так
    if(fabs(D) < 0.001)
    А теперь по поводу глюка. Я не насколько силен в С++, но поведение std::cin мне сильно напомнило TurboPascal. там, когда ввод произошёл с ошибкой, то пока не провериш переменную IOResult, которая хранит код ошибки, все операторы ввода/вывода игнорировались. Здесь наблюдается подобное. Почему не срабатывает catch - не знаю. Наверное неверный ввод это не ошибка (по мнению компилятора, а может и стандарта. Я проверял на VS2005 и BDS2006 - результат один)
    Едиственное, что могу пока предложить - это вводить число как строку, а потом с помощью atof преобразовывать


Ответить в теме
Страница 1 из 3 1 2 3 ПоследняяПоследняя

Похожие темы

  1. Как в С++ Builder создать екзешник...
    от man_odessa в разделе Программирование
    Ответов: 3
    Последнее сообщение: 29.11.2007, 08:52
  2. C++ Builder 6 Вопросы
    от Badboyskiller в разделе Программирование
    Ответов: 4
    Последнее сообщение: 25.10.2007, 23:43
  3. C++ Builder
    от Serega_mexanik в разделе Программирование
    Ответов: 16
    Последнее сообщение: 14.03.2007, 06:20
  4. mysql и C++ Builder
    от Jeno в разделе Программирование
    Ответов: 1
    Последнее сообщение: 23.11.2004, 16:44
  5. Есть компилятор С++ типа builder шобы проги компилить на КПК
    от shidox в разделе Программное обеспечение
    Ответов: 7
    Последнее сообщение: 21.09.2004, 13:48

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения