![]() |
|
|
![]()
|
|
| denisminb |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
Добрый день,народ!Извините,может вопрос пустяк,но не могу решить
Возникли проблемы с кодом на с++, хочу перевести с delphi есть такой код:
делаю так:
не правильно составлен условный оператор ошибка [BCC32 Error] server.cpp(53): E2294 Structure required on left side of . or .* как мне побороть данную проблему? |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Во первых - почему std::string Exception, когда должно быть AnsiString Exception
Во вторых - в отличие от Pascal'я оператор 'не равно' записывается не как '<>', а как '!=' (строка 15) Добавлено через 1 минуту и 30 секунд Ну и вместо .Nick должно быть ->Nick (там же) Добавлено через 2 минуты и 40 секунд И еще в строке 2 - опять std::string. Их вообще нигде быть не должно |
|||
|
||||
| denisminb |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
спасибо,огроменное. действительно знак перепутал, ансистринг тоже...про ->Nick не знал. буду знать. есть ещё такой вопрос, чтение сокета подключившегося клиента,код делфи
сразу возник у меня вопрос, объявления переменных 1) Могу ли заменить на char данном случае? типа такого:
вопрос как скопировать первые 4 символа строки?знаю есть strncpy(r,r1,n) если написать так:
то ошибки Cannot convert 'AnsiString' to 'const char *' Type mismatch in parameter '__src' (wanted 'const char *', got 'AnsiString') Добавлено через 1 минуту и 54 секунды хотя наверно так
компилится Добавлено через 3 минуты и 29 секунд только скопирует действительно первые 4 символа строки? или нет? |
||||||||||
|
|||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
| denisminb |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
если можно,то хочу ещё поинтересоваться: 1) а если не Builder ?т.е интересует именно С++ компонент. думал так,что и если писал в делфи
в с++
2) в делфи описывал команды перед implementation
в коде использую так: Text := Copy(Msg,Length(cmd_Nick) + 1,Length(Msg) - Length(cmd_Nick)) итд а) описываю в с++ с помощью (макросов) #define б) по идее strncpy уже не подходит? в) вычисление длины строки strlen как можно переписать? |
||||||
|
|||||||
| denisminb |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
2 ой пункт,сам прочитал и не совсем понял,что сам хочу.
т.е. пункт а)использую с помощью #define, корректно ли или нет? б) исходя из делфёвой строки
на с++ strncpy не прокатит?можно ли другой использовать?или как лучше описать? в) в делфи/паскаль определяем размер строки с помощью length(),в с++ strlen()?правильно же? или как Вы бы посоветовали реализовать? |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
В С++ (именно на уровне языка) нет аналога строки из Delphi. Но зато есть реализация этих аналогов из разных библиотек, в частности из stl и vcl. Вторая из них предоставляет полный функциональный аналог строки Delphi (что и не удивительно, т.к. vcl это библиотека из Delphi) Отсюда следует, что т.к. встроенной сущности строки нет, то на уровне языка это будет представляться чем то другим, точнее каким то классом. Однако, в С есть встроенный тип строки (char* в виде литеральной константы в кавычках). Но операции, которые поддерживает язык для этой разновидности строки, сильно отличаются от того, что есть в Delphi. Точнее язык не поддерживает для них практически никаких операций. Собственно этим и плох - это строка в понимании чистого С, для нее никаких Delphi like операций не предусмотрено. И все, что делали с ней в Delphi, придется переписать в С на низком уровне. Опять же, это будут чистые С строки, всю работу с ними придется написать заново. Если хотите аналог Delphi, пишите так -
Вполне подойдет и strncpy. Просто сместите указатель на начало строки.
Зависит от типа строки - для чистых С строк используйте strlen, для AnsiString или std::string - length() (или size()) |
||||||
|
|||||||
| denisminb |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
если честно не понялс указателем,можете показать?если не затруднить на моём примере? т.е. это
|
||||||
|
|||||||
| denisminb |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
и не совсем понял,как Вы привели в соответствие 145=101 и 146=102?
|
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Тогда для обычных С строк это будет так:
145 (это в восьмеричной системе счисления) равно 101 (а это в десятичной). В С конструкция "\???" обозначает код символа именно в восьмеричной системе счисления |
||||||||
|
|||||||||
| denisminb |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
про восьмиричную систему понял,спасибо.Буду знать. в Msq хранится принятое от подключившегося клиента сообщение, сообщение это ник. по идее тогда мне не нужно вычислять длины ?или писать тогда так:
Добавлено через 1 минуту и 46 секунд вопрос тогда остается, признак конца строки(завершаюший ноль) нужно учитывать или нет? |
||||||||||||
|
|||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Не нужно
strncpy очень опасная функция. Ей 3м параметром дают не сколько надо скопировать, а длину (в байтах) массива из 1го параметра. Функция работает так же, как strcpy. Но если буфер из 1го параметра переполняется, то функция немедленно прекращает копирование, даже не записав туда завершающий 0. В результате получается невалидная С строка (т.к. она не завершена нулем) |
|||
|
||||
| denisminb |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
ага,я понял,кажется. Тогда лучше не баловаться с этой функцией,просто в делфи делал так, с помощью функции copy, в принципе понятно,то что из строки копирую с n-го по M символ. я думаю может лучше на клиенте тогда делать проверку на длину строки (ника), чтобы пользователь не мог ввести свой ник более 4 символов. в делфе выделял память под клиента следующим образом
в С++ вот думаю,как лучше сделать? сделал так:
но здесь же выделяю под структуру,а не под клиента или я ошибаюсь? |
||||||||
|
|||||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
У вас PPacket уже указатель. Так что тут вы заказываете массив из 4х указателей на структуру Packet. Сами структуры не создаются. Если вам нужна 1 структура, то надо делать так
|
||||
|
|||||
| denisminb |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 9.6.2012 Репутация: нет Всего: нет |
спасибо Вам,огроменное!) |
||||||
|
|||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |