Обсуждение Программирование на C/C++

elle

Ословед
может кто-нибудь "перевести" небольшую программку с Java на C++?
Если кто-нибудь сможет помочь, я код выложу
заранее спасибо:shuffle:
 

gureedo

Самец :)
может кто-нибудь "перевести" небольшую программку с Java на C++?
Если кто-нибудь сможет помочь, я код выложу
заранее спасибо:shuffle:

бъякуган должен видеть истинную сущность кода!

ну исходники в студию, а то не посмотрев исходники никто не решица.
 

elle

Ословед
вообщем вот постановка задачи, если кто-нибудь возьмется,буду очень благодарна:)
ЗЫ немного не по теме,но очень надо: если у кого-нибудь есть тесты по С++ выложите пожалуйста
 

    Fabregas

    очки: 4
    зелёной репушки красивой девушке
в программе имеют объекты класса string
string str1;

но многие нужные мне функции используют в качестве аргументов char * и возвращают его же. как быть? можно ли привести string к типа char*? или только использовать аналоги с арг. string?

и еще:
int a=5; string s="abc", b;
b = a + s;

что значит сложить int и string?
 
в программе имеют объекты класса string
string str1;

но многие нужные мне функции используют в качестве аргументов char * и возвращают его же. как быть? можно ли привести string к типа char*? или только использовать аналоги с арг. string?
string str;
char *chr;
chr = new char [10];
sprintf(chr,"%s",str.data());
или
sprintf(chr,"%s",str.c_str());
return chr;

PS и кого же имеют объекты класса? :shuffle:
 
потому что не принципиально. Значение имеет str.c_str() и str.data()
 

    agent

    очки: 14
    rep++; :)
Дайти плиз пример простейшего клиент-серверного приложения с использованием ClientSocket и ServerSocket, мне главное понять их принцип работы:shuffle:
 
Дайти плиз пример простейшего клиент-серверного приложения с использованием ClientSocket и ServerSocket, мне главное понять их принцип работы:shuffle:
Для начала создадим новый проект(file->new->application), поместим на форму компоненты:

tclientsocket и tserversocket , чтобы наша программа могла быть и клиентом и сервером (не одновременно конечно ;) ).

Далее разместим компонент tmemo (закладка standart) - в нем как вы догадались будет отображаться текст чата.

Следующим на форму нужно кинуть компонент tedit (standart) - в него мы будем писать текcт, который нужно отправить собеседнику.

Ну и конечно тяжело обойтись без кнопки отправить - кидаем на форму tbutton . Кроме того что уже есть на форме, нам еще понадобится три кнопки и два эдита (tedit) (их назначение описывается по ходу обращения к ним) .

Итак, на форме :

clientsocket1 и serversocket1
memo1
edit1,edit2,edit3
button1,button2,button3,button4
Теперь изменяем свойства:

button1->caption на "Отправить"
button2->caption на "Создать"
button3->caption на "Соединиться" и
button4->caption на "Отключить" .
Убираем текст во всех Эдитах . Свойство memo1->readonly = true ,

clientsocket1->host - нужно написать ip-адрес сервера к которому вы будете присоеденяться

(ip-адресс устанавливается в настройках соединения windows), если прописать 127.0.0.1 , то вы будете конектиться к себе на компьютер (так удобно делать, когда проверяешь на работоспособность свою программу. Запустив ее дважды, одна клиент с 127.0.0.1 , а другая сервер !) если же вы коннектитесь к другу, то заранее договоритесь какой будет Ай-Пи-адрес (143.0.0.5 - например). Но для того чтобы Ай-Пи -адресс можно было легко сменить, мы и положили на форму один из Эдитов, его текст при коннекте и будет отвечать свойству clientsocket1->host и clientsocket1->address .

В свойстве clientsocket1->port и servertsocket1->port - должны стоять одинаковые значения, чтобы Сервер и Клиент прослушивали и работали на один порт . Число можно выбрать любое (1024 например).

Кнопку "Отключиться" изначально нужно сделать недоступной(enabled = false)так как вначале отсоеденяться нам нет от кого .

Дальше опишем обработчики событий для кнопок "Создать", "Соединиться", "Отключить" .

Кнопка "Создать" - активизирует сервер. Он начинает прослушивать порт на коннект со стороны клиента .

void __fastcall tform1::button2click(tobject *sender)
{
serversocket1->active = true ;
// Делаем недоступную "Соединиться" (так как мы уже сервер)
button3->enabled = false
// Делаем доступную "Отключиться" (понятно зачем)
button4->enabled = true
memo1->lines->add("Сервер создан") ;
}
Так наша программа стала сервером !

Давайте опишем клиента!(Кнопка "Соединиться")

В edit3->text впишите 127.0.0.1 - предполагается что тестироваться будет на одном компьютере (что б других не заморачивать:)

void __fastcall tform1::button3click(tobject *sender)
{
edit3->text = clientsocket1->host // Присваиваем Клиенту Ай-Пи из Эдита
edit3->text = clientsocket1->address
serversocket1->active = true ;
// Делаем недоступную "Создать" (так как мы коннектимся)
button2->enabled = false
// Делаем доступную "Отключиться" (понятно зачем)
button4->enabled = true
}
Вот Вы и написали тот минимум который надо для освоения компонентов !

Но кто хочет останавливаться ? А чат доделать ! Правильно пишем дальше:

Дальше будем описывать свойства компонентов Клиента и Сервера onconnect (когда присоединился) .

void __fastcall tform1::serversocket1clientconnect(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add("Клиент присоединился");
}
Это когда вы сервер и к Вам присоединились, на Мемо появится надпись !

Для клиента почти так само :

void __fastcall tform1::clientsocket1connect(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add("Вы присоединены");
}
Понятно, да ? Отлично , дальше остается только рассказать Вам зачем edit2 на форме и описать кнопку "Отправить" .

Итак, Эдит2 нам нужен для Вашего ника ! Ведь какой чат без ника !

Теперь самое главное - описание кнопки "Отправить :

if(edit2->text == "")
showmessage("Введите Ваш ник !");
return ;
}
if(edit1->text == "")
{
showmessage("Введите текст который надо отправить");
return ;
}
//Это была обработка исключительных ситуаций , типа пустых строк ввода ;
memo1->lines->add(edit2->text+":: "+ edit1->text) ;
if (serversocket1->active == true) {
serversocket1->socket->connections[0]->
sendtext(edit2->text+"::"+edit1->text); }
else
{ clientsocket1->socket->sendtext(edit2->text+"::"+edit1->text);}
edit1->text = "" ;
}
Теперь разберемся с этой кучей кода :

//добавляем свое сообщение себе в Мемо
memo1->lines->add(edit2->text+":: "+ edit1->text) ;
if (serversocket1->active == true){serversocket1->socket->
connections[0]->sendtext(edit2->text+"::"+edit1->text)};
Если мы сервер, то посылаем нашу строку первому в списке клиенту ( чат розщитан на двоих ) , иначе :

else {
clientsocket1->socket->sendtext(edit2->text+"::"+edit1->text);
}
Посылаем строку серверу !

Независимо от того кто мы (клиент-сервер)

Очищаем Эдит1 :

edit1->text = "" ;
Также надо описать прием информации и занесение ее в Мемо1. Делается это обработчиком события onread у tclientsocket и tserversocket :

void __fastcall tform1::clientsocket1read(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add(socket->receivetext()) ;
}
void __fastcall tform1::serversocket1clientread(tobject *sender,
tcustomwinsocket *socket)
{
memo1->lines->add(socket->receivetext()) ;
}
Вот вроди бы и все. С tclientsocket и tserversocket разобрались , а кого заинтересовала тема чата, заходите в раздел "Мои программы" И качайте доделанную мной, с большим количеством настроек программу вместе с исходниками

Автор: Макагон Сергей
http://devoid.com.ua
.....
 

    Wim

    очки: 4
    Нет комментариев

    blazer

    очки: 10
    клево :)
я конечно не пробовал все это компилировать, но здесь по-моему ошибка
edit3->text = clientsocket1->host // Присваиваем Клиенту Ай-Пи из Эдита
edit3->text = clientsocket1->address

надо бы наобоорт -
clientsocket1->host = edit3->text ;
и вторую строку аналогично
(мб есть и другие ошибки)
 

ShaDer

Ословед
Пишу в Borland Developer Studio 2006.
На форме расположены stringgrid и statusbar.
При изменении количества строк и столбцов в stringgrid форма должна изменять свой размер.
Имеем: если на форме только stringgrid, то autosize работает корректно, если добавляем statusbar - ресайз корректно работает только в бОльшую сторону, в меньшую - нет. Statusbar с свойствами по умолчанию.
Прописываю размер руками при выключенном autosize - всё работает нормально.
Хелп и мануалы этот вопрос не освещают.
 
Кажись у string был такой конструктор.

FILE *log;
string str;
char buf [400];
fgets(buf, 400, log); //В спеке написано, n-1 - надеюсь переполнения нет.
str = buf;
 
когда то хотел ... но так и не доделал... Класс должен был быть аналогичный билдеровскому
Код:
#ifndef _INCLUDED_INI_H
#define _INCLUDED_INI_H
#include <string>
using namespace std;
class CIniFile
{
private:
  string Path;
public:
  CIniFile(string Pth);
  string  ReadString(string Section, string Key, string Default);
};
#endif 
 
#include "ini.h"
CIniFile::CIniFile(string Pth)
{
Path = Pth;
} 
 
string  CIniFile::ReadString(string Section, string Key, string Default)
{
 string  ReadStr, str, cmp;
 char  *ReadFile;
 FILE *fp;
 int i;
 size_t found;
 fp = fopen(Path.c_str(),"r");
 cmp = "["+Section+"]";
 ReadFile  = new char [255];
 while(!feof(fp)){
   fgets(ReadFile,255,fp);
   str = ReadFile;
   if(str.compare(0,cmp.size(),cmp)==0)
    break;
  }
 
 if(feof(fp))
  return ReadStr=Default;
 while(!feof(fp)){
   fgets(ReadFile,255,fp);
   str = ReadFile;
   if(str.compare(0,1,"[")==0)
    return ReadStr=Default;
   if(str.compare(0,Key.size(),Key)==0)
    break;
  }
 ReadStr = str;
 found = ReadStr.find("=");
 i=1;
 if(found!=string::npos)
  while(ReadStr[int(found)+i]==' ')
   i++;
 i = i+int(found);
 ReadStr.replace(0,i,"");
 ReadStr.replace(ReadStr.size()-1,ReadStr.size(),"\0");
 return  ReadStr;
}
 

elle

Ословед
подскажите по такому вопросу:как перевести double в строку(по стандарту С++,без использования Сишных функций и библиотек сторонних производителей)?
мне нужно примерно в таком контексте
double t;
string s;
...// вычисляется t
s = "результат "+перевод_в_строку(t);
 

JC Denton

Ословед
Код:
#include <iostream>
#include <string>
#include <sstream>
int main()
{
    double t=0.5;
    std::string s;
    std::basic_stringstream<char> sout;
    sout<<t;
    s = "result: "+sout.str();
    std::cout<<s;
    return 0;
}
 

    elle

    очки: 14
    спасибо огромное!
подскажите по такому вопросу:как перевести double в строку(по стандарту С++,без использования Сишных функций и библиотек сторонних производителей)?
мне нужно примерно в таком контексте
double t;
string s;
...// вычисляется t
s = "результат "+перевод_в_строку(t);

Посмотри в MSDNе, как double представляется. По асму могу сказать (врядли на сях сильно другой формат): старший бит - знак (+/-), потом - "характеристика" (показывает, где находится запятая). Потом идёт само число, из характеристики узнаёшь положение запятой, и втыкаешь её в число в нужном месте. Всё.
 

JC Denton

Ословед
Посмотри в MSDNе, как double представляется. По асму могу сказать (врядли на сях сильно другой формат): старший бит - знак (+/-), потом - "характеристика" (показывает, где находится запятая). Потом идёт само число, из характеристики узнаёшь положение запятой, и втыкаешь её в число в нужном месте. Всё.
Что за бред? Зачем так изгаляться? В крайнем случае, можно реализовать алгоритм перевода в десятичное представление из double с помощью деления. А смотреть на конкретную реализацию double - так в разных архитектурах по-разному может быть, и если вдруг захочется сменить тип, переписывать заново все? Мое решение лучше.
 

Shell

Ословед
подскажите по такому вопросу:как перевести double в строку(по стандарту С++,без использования Сишных функций и библиотек сторонних производителей)?
мне нужно примерно в таком контексте
double t;
string s;
...// вычисляется t
s = "результат "+перевод_в_строку(t);

Код:
#include <sstream>
...
std::string s;
double t=1.5;
std::ostringstream z;

   z.str("");
   z<<t; // или z<<setw(10)<<fixed<<setprecision(2)<<x;
   s="результат "+z.str();
 
Сверху