Есть структура
typedef struct Tmess
{
String nick[16];
String adr[4];
String data[10];
} mess;
процедура logg()
void __fastcall logg(String s)
{
Form1->mLog->Lines->Add(s);
}
b кусочек кода.
s=ClientSocket->ReceiveBuf(buf,sizeof(mess));
mess *msg = static_cast<mess *>(buf);
msg=(mess*)buf;
logg(msg->data);
все бы хорошо, но происходит завал на
logg(msg->data);
с ошибкой E2034 Cannot convert 'UnicodeString *' to 'UnicodeString'
что тут можно сделать?
11 июля 2009 в 0:04
2 Денис "Марсианин" Лисов
Мне нужен именно бинарный. Ибо в итоге придется передавать именно бинарные данные.
7 июля 2009 в 20:00
Ну, конец строки тоже хорошо…
Я сначала хотел его написать, но потом подумал, что могут возникнуть некие трудности, о которых сейчас даже не могу написать, потому что забыл, поэтому и написал \001
7 июля 2009 в 18:03
Зачем \001, если есть конец строки \0?
Вы уверены, что хотите делать свой бинарный формат? Возможно, оптимально было бы сделать текстовый формат?
From: guest
To: andrew
The message starts after a blank line and ends with a dot on a line on its own
.. In the case a dot is the first symbol of a message line, it is doubled. That's virtually all.
.
7 июля 2009 в 8:04
Например:
string toSend = edNick->Text + "\001" + "All" + "\001" + edSend->Text + "\001";
void *buf = (void*)(toSend.c_str());
Sock->SendBuf(buf,toSend.size());
Так отправляем строку…
На серверной части по символу \001 разбиваем.
Ну, это, наверное, глупое решение. Не знаю даже.
7 июля 2009 в 3:04
Эмм… А как мне передать данные? Мне важно, чтобы через sendbuf можно было передать класс например. Хорошо бы раскурить пару мануалов, но ничего толкового нагуглить я не смог.
7 июля 2009 в 0:05
дай угадаю….. mess содержит поля типа String. Эта структура содержит УКАЗАТЕЛИ на область памяти, где срока хранится. Адреса этих строк также не постоянны и могут перемещаться. Передавая данные о структуре мы просто копируем указатели, но не данные. Соответственно, получив указатели, мы обнаруживаем, что по этим адресамнаходится мусор или вообще получаем Accеss violation. Надо реализовать раздельную передачу элементов структуры, в частности данных типа String или, наиболее толково будет создание в структуре TMess функции для сохранения всей структуры.
6 июля 2009 в 22:05
при отправке нормально все. Sock суть TcpServer и TcpClient соответственно
6 июля 2009 в 19:02
При дебаге отправки нормальные поля?
И что за реализация Sock? MFC? O_o
6 июля 2009 в 18:02
В продолжение темы о чате.
Отсылаю данные с клиента
void __fastcall TForm1::edSendKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
mess *msg;
if (Key==char(13))
{
msg->nick=edNick->Text;
msg->adr="All";
msg->data=edSend->Text;
void *buf = static_cast<void *>(msg);
Sock->SendBuf(buf,sizeof(mess));
}
}
Принимаю на сервере
void __fastcall TForm1::SockAccept(TObject *Sender, TCustomIpClient *ClientSocket)
{
int s;
void *buf;
logg("Client from " + ClientSocket->RemoteHost + " added no stream");
do {
s=ClientSocket->ReceiveBuf(buf,sizeof(mess));
mess *msg = static_cast<mess *>(buf);
logg(msg->data);
if (msg->adr=="exit") {s=1;}
} while (s==1);
logg("Client from " + ClientSocket->RemoteHost + " passed no stream");
}
Но в mess билиберда полнейшая… Я где-то туплю?
класс mess идентичен.
6 июля 2009 в 15:00
Собственно, в stl строка ограничивается очень большим числом. Зачем тебе об этом беспокоиться?
Просто проверяй входные данные.
6 июля 2009 в 13:05
Да, я вернулся к STL. За доп. инфу спасибо.
А как мне задать длинну для строки?
6 июля 2009 в 6:00
Видимо, автор не совсем понимает, что он хочет.
В структуре поля определены как
String nick[16];
String adr[4];
String data[10];
Но что ты подразумеваешь под цифрами в скобках? Длину строк?
Это неверно, так ты создаешь каждому полю по массиву, с количеством элементов в скобках.
Используй, действительно, обычный STL'евский string
string nick;
string adr;
string data;
Либо же тебе нужно переделать logg, если ты считаешь, что все правильно:
void __fastcall logg(String *s) {…}
5 июля 2009 в 17:01
Спасибо ^_^
5 июля 2009 в 14:00
Если String STL'евский то у данного класса есть метод возвращющий массив типа char, c_str() называется.
5 июля 2009 в 13:02
Чего делать – исправить =)
5 июля 2009 в 13:01
void __fastcall logg(String s)
это функция которая принимает в качестве параметра переменную типа String.
а mess->data определено как String data[10];
т.е. массив из 10 элементов типа String
Этот массив воспринимается как String*, т.к. в Си имя массива одновременно является указателем на его первый элемент.
соответственно logg(mess->data) не работает
5 июля 2009 в 13:00
если "Cannot convert 'что-то *' to 'что-то'", то при обращении к данным надо использовать "*", т.е. logg(*msg->data);