singlepost

Преобразование типов С++ << На главную или назад  

Есть структура
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'

что тут можно сделать?

21 ответов в теме “Преобразование типов С++”

  1. 17
    Андрей Поповский ответил:

    2 Денис "Марсианин" Лисов
    Мне нужен именно бинарный. Ибо в итоге придется передавать именно бинарные данные.

  2. 16
    Роман Труба ответил:

    Ну, конец строки тоже хорошо… :)
    Я сначала хотел его написать, но потом подумал, что могут возникнуть некие трудности, о которых сейчас даже не могу написать, потому что забыл, поэтому и написал \001

  3. 15
    Денис Лисов ответил:

    Зачем \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.
    .

  4. 14
    Роман Труба ответил:

    Например:
    string toSend = edNick->Text + "\001" + "All" + "\001" + edSend->Text + "\001";
    void *buf = (void*)(toSend.c_str());
    Sock->SendBuf(buf,toSend.size());

    Так отправляем строку…
    На серверной части по символу \001 разбиваем.

    Ну, это, наверное, глупое решение. Не знаю даже.

  5. 13
    Андрей Поповский ответил:

    Эмм… А как мне передать данные? Мне важно, чтобы через sendbuf можно было передать класс например. Хорошо бы раскурить пару мануалов, но ничего толкового нагуглить я не смог.

  6. 12
    Денис Боенсков ответил:

    дай угадаю….. mess содержит поля типа String. Эта структура содержит УКАЗАТЕЛИ на область памяти, где срока хранится. Адреса этих строк также не постоянны и могут перемещаться. Передавая данные о структуре мы просто копируем указатели, но не данные. Соответственно, получив указатели, мы обнаруживаем, что по этим адресамнаходится мусор или вообще получаем Accеss violation. Надо реализовать раздельную передачу элементов структуры, в частности данных типа String или, наиболее толково будет создание в структуре TMess функции для сохранения всей структуры.

  7. 11
    Андрей Поповский ответил:

    при отправке нормально все. Sock суть TcpServer и TcpClient соответственно

  8. 10
    Роман Труба ответил:

    При дебаге отправки нормальные поля?
    И что за реализация Sock? MFC? O_o

  9. 9
    Андрей Поповский ответил:

    В продолжение темы о чате.

    Отсылаю данные с клиента

    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 идентичен.

  10. 8
    Роман Труба ответил:

    Собственно, в stl строка ограничивается очень большим числом. Зачем тебе об этом беспокоиться?
    Просто проверяй входные данные.

  11. 7
    Андрей Поповский ответил:

    Да, я вернулся к STL. За доп. инфу спасибо.
    А как мне задать длинну для строки?

  12. 6
    Роман Труба ответил:

    Видимо, автор не совсем понимает, что он хочет.
    В структуре поля определены как
    String nick[16];
    String adr[4];
    String data[10];
    Но что ты подразумеваешь под цифрами в скобках? Длину строк?
    Это неверно, так ты создаешь каждому полю по массиву, с количеством элементов в скобках.
    Используй, действительно, обычный STL'евский string
    string nick;
    string adr;
    string data;

    Либо же тебе нужно переделать logg, если ты считаешь, что все правильно:
    void __fastcall logg(String *s) {…}

  13. 5
    Андрей Поповский ответил:

    Спасибо ^_^

  14. 4
    Артем Никитин ответил:

    Если String STL'евский то у данного класса есть метод возвращющий массив типа char, c_str() называется.

  15. 3
    Юрий Лисичкин ответил:

    Чего делать – исправить =)

  16. 2
    Юрий Лисичкин ответил:

    void __fastcall logg(String s)

    это функция которая принимает в качестве параметра переменную типа String.

    а mess->data определено как String data[10];

    т.е. массив из 10 элементов типа String
    Этот массив воспринимается как String*, т.к. в Си имя массива одновременно является указателем на его первый элемент.

    соответственно logg(mess->data) не работает

  17. 1
    Денис Боенсков ответил:

    если "Cannot convert 'что-то *' to 'что-то'", то при обращении к данным надо использовать "*", т.е. logg(*msg->data);

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.