Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перевести кусок кода с Delphi на C++ 
:(
    Опции темы
zheka1980
Дата 3.8.2014, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В Дельфи так:
Цитата

procedure TForm1.Timer1Timer(Sender: TObject);
var
  len, i: integer;
  s: string;
  buffer: TJavaArray<byte>;
begin
  len:= istream.available;
  if len = 0 then exit;

  buffer:= TJavaArray<byte>.create(len);
 istream.read(buffer, 0, len);

  s:='';
  for i:= 0 to len-1 do
   s:= s + '0x' + inttohex(buffer[i], 2) + ', ';
  ShowMessage(s);
end;

Жирным я выделил интересующий меня фрагмент.

Вот как он объявлен в файле .hpp (то есть  уже в билдере)
Цитата
typedef TJavaBasicArray* *PJavaBasicArray;

template<typename T> class DELPHICLASS TJavaArray__1;
#pragma pack(push,4)
// Template declaration generated by Delphi parameterized types is
// used only for accessing Delphi variables and fields.
// Don't instantiate with new type parameters in user code.
template<typename T> class PASCALIMPLEMENTATION TJavaArray__1 : public TJavaBasicArray
{
    typedef TJavaBasicArray inherited;
    
public:
    typedef T *PJavaArrayBaseType;



Это сообщение отредактировал(а) zheka1980 - 3.8.2014, 12:22
PM MAIL   Вверх
Romikgy
Дата 3.8.2014, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



наверное 
Код

TJavaArray__1 <byte> buffer;
...
buffer = new TJavaArray__1 <byte> (len);


PS а вообще чушь какая то можно просто организовать массив типа char и реализовать тот же код без этого дельфи класса

Это сообщение отредактировал(а) Romikgy - 3.8.2014, 12:50


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
zheka1980
Дата 3.8.2014, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

 buffer = new TJavaArray__1 <byte> (len);


Ругается на byte: [CLANG Error] Unit1.cpp(141): use of undeclared identifier 'byte'
А со своим самоваром (массивом char) не получится, функция read в него не запишет потому как
Код

    virtual int __cdecl read(Androidapi::Jnibridge::TJavaArray__1<System::Byte> * buffer, int offset, int length) = 0 /* overload */;


Но я ради интереса заменил
Код

  TJavaArray__1<unsigned char> buffer;


и получил [CLANG Error] Unit1.cpp(141): Delphi-style classes must be allocated with 'new'

Это сообщение отредактировал(а) zheka1980 - 3.8.2014, 15:19
PM MAIL   Вверх
xvr
Дата 4.8.2014, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



new  TJavaArray__1<System::Byte> buffer;
PM MAIL   Вверх
borisbn
Дата 4.8.2014, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



В принципе, вариантов ещё много, но ИМХО так будет правильно:
Код
buffer = new TJavaArray__1< System::Byte >( len );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Romikgy
Дата 4.8.2014, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146



Код

{
unsigned char * buffer;
string s;
if (istream.available)
{
    buffer = new unsigned char(istream.available);
    istream.read(buffer, 0, istream.available);
    for (int i=0;i<istream.available;i++)
    {
        s:= s + '0x' + inttohex(buffer[i], 2) + ', ';
    }
    delete buffer;
    ShowMessage(s);
}

}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
xvr
Дата 4.8.2014, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Romikgy @  4.8.2014,  14:28 Найти цитируемый пост)
    buffer = new unsigned char(istream.available);

Тут скобки должны быть квадратные -
Код

buffer = new unsigned char[istream.available];

PM MAIL   Вверх
zheka1980
Дата 4.8.2014, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Romikgy, вопрос к Вам, так упорно настаивающем на "все надо сделать проще".
Вам не приходило в голову, что istream может быть заточен под тот тип, с которым его заставляют работать?
Ваш вариант не прокатывает. istream->read не хочет писать полученные в ходе выполнения данные в buffer.
Как предложили другие товарищи заработало, не так как хотелось бы, но по крайней мере компилится.

Добавлено через 2 минуты и 1 секунду
Цитата

В принципе, вариантов ещё много, но ИМХО так будет правильно:
Код
buffer = new TJavaArray__1< System::Byte >( len );



А у всех
buffer = new TJavaArray__1< System::Byte >( len );
работает без предшествующего
TJavaArray__1<System::Byte> *buffer;

или только у меня не работает?

Добавлено через 13 минут и 57 секунд
Этот Android SDK какой-то шизанутый.
На   ss=IntToStr(len);  выдает [CLANG Error] Unit1.cpp(153): call to 'IntToStr' is ambiguous
  System.SysUtils.hpp(2490): candidate function
  System.SysUtils.hpp(2491): candidate function

Что делать и кто виноват?
PM MAIL   Вверх
zheka1980
Дата 4.8.2014, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну и в догонку
Код

  Memo->Lines->Add(AnsiString(buffer->Items[1]));

выдает ноль.
PM MAIL   Вверх
zheka1980
Дата 5.8.2014, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В итоге получилось вот так:
Код

  unsigned int len, i,j;
  AnsiString aS;

  len = istream->available();
  if (len == 0)
  {
  return;
  }
  else
  {
  Timer1->Enabled=false;
  TJavaArray__1<System::Byte> *buffer;
  buffer = new TJavaArray__1 <System::Byte> (len);
  istream->read(buffer, 0, len);
  for (i=0;i<len;i++) aS=aS+AnsiString().sprintf("%c",buffer->Items[i]);
  Memo1->Text=Memo1->Text+aS;
  delete buffer;
  Timer1->Enabled=true;
  }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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