Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2009, 20:15   #1
Satyrn
 
Регистрация: 24.11.2009
Сообщений: 7
По умолчанию Программа из С++ в Builder

Всем привет.
Есть программа, написана на простом С++. Нужно сделать ее в билдере, т.е. чтобы появлялось окно с кнопкой и парой текстовых полей. В поле вводим строку, нажимаем на кнопку и в другом поле получаем результат. Разбирался по учебнику, получилось так, но не работает.

Код:
#include <vcl.h>
#pragma hdrstop
#include <conio.h>
#include <cstring.h>
#include <fstream.h>
#include "Unit2.h"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{     const int size = 20;
        char str[size];
        getline(str,size) = Edit1 -> Text;
          ofstream ptk1("test18.txt");

}
  void__fastcall TForm1::Button1Click  (TObject *Sender)
{
        Edit2 -> Text = "length of string is:";
        Edit2 -> Text = strlen(str);
         ptk1<<"length of string is:"<<strlen(str)<<endl;
        if (strstr(str,"one"))
        {
                Edit3 -> Text = "one in the string";
                ptk1<<"one in the string"<<endl;
        }
        else
        {
            Edit3 -> Text = "ERROR!";
            ptk1<<"ERROR!"<<endl;
        }
         getch ();
        }
вот исходный код, не билдоровский
Код:
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#include <conio.h>
#include <cstring.h>
#include <fstream.h>
void main ( )
{
        const int size = 20;
        char str[size];
        cin.getline(str,size);
          ofstream ptk1("test18.txt");
        cout<<"length of string is:"<<strlen(str)<<endl;
         ptk1<<"length of string is:"<<strlen(str)<<endl;
        if (strstr(str,"one"))
        {
                cout<<"one in the string"<<endl;
                ptk1<<"one in the string"<<endl;
        }
        else
        {
            cout<<"ERROR!"<<endl;
            ptk1<<"ERROR!"<<endl;
        }
         getch ();
        }
подскажите плз в чем ошибки и как исправить.
Satyrn вне форума Ответить с цитированием
Старый 24.11.2009, 21:07   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

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

Итак, во первых, в билдере используются не стандартные строки std::string и не массивы символов, а AnsiString. Соответственно, эдитовские Text имеют именно этот тип. Вместо strlen используем функцию Length
Код:
AnsiString s = Edit1 -> Text;
int i = s.Length();
Для работы с файлом используйте, например, тип TStringList или TStrings, с их LoadFromFile, SaveToFile, и Add(AnsiString) у первого из них.
И объявите строку в функции Button1Click.
Ну и еще, конечно же, выкиньте getch к чертовой бабушке!

И лучше всего где-нибудь хоть что-то прочитать про билдер...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 24.11.2009, 21:15   #3
Satyrn
 
Регистрация: 24.11.2009
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
Ну это вы, конечно, хорошо перенесли из консоли сразу в окошко...
Как я понимаю, тут не то открывается, не то создается файл (с файловыми потоками не работал, точно не знаю), и потом туда пишутся некие строки, одновременно выводятся в поток вывода то же самое.

Итак, во первых, в билдере используются не стандартные строки std::string и не массивы символов, а AnsiString. Соответственно, эдитовские Text имеют именно этот тип. Вместо strlen используем функцию Length
Код:
AnsiString s = Edit1 -> Text;
int i = s.Length();
Для работы с файлом используйте, например, тип TStringList или TStrings, с их LoadFromFile, SaveToFile, и Add(AnsiString) у первого из них.
И объявите строку в функции Button1Click.
Ну и еще, конечно же, выкиньте getch к чертовой бабушке!

И лучше всего где-нибудь хоть что-то прочитать про билдер...
Спасибо, буду дальше разбираться. Про билдер читал, но видимо мало )
Satyrn вне форума Ответить с цитированием
Старый 01.12.2009, 19:09   #4
Satyrn
 
Регистрация: 24.11.2009
Сообщений: 7
По умолчанию

вобщем получилось вот так
Код:
#include <vcl.h>
#pragma hdrstop
#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)
{
 String s[20];
  int i = s.Length();
// const int size = 20;

   s = Edit1 -> Text;
       // str[size] = AnsiString -> Edit1;
     Edit2 -> Text = "length of string is:"+i;
             //   if (strstr(s,"one"))
             if  (s.AnsiPos("one"))
        {
             Edit3 -> Text = "one in the string";
        }
        else
        {
            Edit3 -> Text = "ERROR!";
        }
}
вот только вылазит 3 ошибки:
structure required on left side of . or .* на строчки int i = s.Length(); и if (s.AnsiPos("one"))
AnsiPos - вроде эта же функция для поиска подстроки в строке?
и ошибка Lvalue в строке s = Edit1 -> Text;

можете подсказать как устранить?
Satyrn вне форума Ответить с цитированием
Старый 01.12.2009, 19:51   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А что за тип String такой?
Все эти Text, Caption и прочие в билдере имеют тип AnsiString, вроде бы перетащенный с дельфей. Так что:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 AnsiString s;
  int i = s.Length();
// const int size = 20;

   s = Edit1 -> Text;
       // str[size] = AnsiString -> Edit1;
     Edit2 -> Text = "length of string is:"+i;
             //   if (strstr(s,"one"))
             if  (s.AnsiPos("one"))
        {
             Edit3 -> Text = "one in the string";
        }
        else
        {
            Edit3 -> Text = "ERROR!";
        }
Пока не проверял, но по идее теперь должно работать.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 01.12.2009, 20:20   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Гром
А что за тип String такой?
Для Ansi-версии программы typedef AnsiString String;, для Unicode typedef UnicodeString String;

И у Вас ошибка в коде:
Код:
Edit2->Text = "length of string is:" + i;
Во-первых i вычисляете ещё до момента инициализации s строкой, более того строковые литералы не могут конкатенироваться, тем более с нестроковыми типами. Нужно сначала привести это дело к String:
Код:
Edit2->Text = String("length of string is: ") + i
А вообще:
Код:
	Edit2->Text = String("Length of string is: ") + Edit1->Text.Length();
	if(Edit2->Text.Pos("one"))
		Edit3->Text = "One is in string";
	else
		Edit3->Text = "Error";
Могу впрочем ошибаться, так как билдер не юзаю
netrino вне форума Ответить с цитированием
Старый 01.12.2009, 20:41   #7
Satyrn
 
Регистрация: 24.11.2009
Сообщений: 7
По умолчанию

Спасибо за помощь, 1 ошибка исчезла, но
structure required on left side of . or .* в строке int i = s.Length();
и
Lvalue в строке s = Edit1 -> Text; остались



От structure required on left side of . or .* избавился таким путем - int i =Text.Length(); вроде правильно
А вот что за ошибка Lvalue required вобще не могу понять

Последний раз редактировалось Satyrn; 01.12.2009 в 20:58.
Satyrn вне форума Ответить с цитированием
Старый 01.12.2009, 21:02   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А тут дело в том, что у вас объявлен массив строк, а не одна строка длиной 20 символов. Стало быть, s - это указатель на первую строку массива. Так что просто уберите [20] - и будет вам счастье.

netrino, спасибо за информацию, записал в оперативную память.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 01.12.2009, 21:11   #9
Satyrn
 
Регистрация: 24.11.2009
Сообщений: 7
По умолчанию

У меня как раз дана одна строка, длинной максимум 20 символов. Мне нужно проверить, есть ли в ней слово one (и вывести в окошко) и вывести длину строки.
Кстати у меня теперь программа вообще не компилируется оО, что делать?

Не правильно сперва прочитал ваше первое предложение. Теперь прочитал его правильно и не могу понять =)

С компиляцией разобрался, просто создал новые проект. Исправил s[20] на s. Программа запускается, но только делает не то, что надо. Слово one не находит в строке, всегда Error выводит, но длину выводит правильно.

Последний раз редактировалось Satyrn; 01.12.2009 в 21:26.
Satyrn вне форума Ответить с цитированием
Старый 01.12.2009, 21:28   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

String - это тип строки. Соответственно, String s; - объявление одной строки. String s[20]; - объявление массива из 20 строк.
Использование имени массива эквивалентно использованию указателя на первый элемент этого массива, поэтому в случае
Код:
String s[20];
s = "!!!";
во второй строке мы имеем попытку присвоить указателю на строку строковое значение.
В общем, вам нужно всего лишь превратить массив в единственную строку путем удаления "[20]", не заморачиваясь за длину строки!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
C builder программа Luxian Помощь студентам 2 06.10.2009 21:43
Перенести код из C++ Builder 5 в C++ Builder 2009 Kreadlling C++ Builder 2 13.09.2009 14:00
C++ Builder!!! kykysya C++ Builder 4 08.02.2009 03:33