C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
char FAR * FAR *
joynter
Отправлено: 07.10.2004, 17:26


Станционный диспетчер

Группа: Участник
Сообщений: 137



есть такая структура
CODE

struct hostent {
   char FAR *       h_name;
   char FAR * FAR * h_aliases;
   short            h_addrtype;
   short            h_length;
   char FAR * FAR * h_addr_list;
}

меня интересует, что это за тип данных char FAR * FAR * и как его привести к AnsiString?
Pirs
Отправлено: 07.10.2004, 19:15


Дежурный стрелочник

Группа: Участник
Сообщений: 39



указатель на указатель, то есть двумерный массив.
Привести к String можно не этот указатель, а один из РЕАЛЬНО существующих индексов. Понятно, что сам указатель и все входящие в него строки должны быть сперва созданы через new.

Srting str = h_aliases [ any_real_index ] ;
joynter
Отправлено: 08.10.2004, 10:07


Станционный диспетчер

Группа: Участник
Сообщений: 137



извините, я выразился не очень корректно.
я имел в вмду следующее:
CODE

struct hostent* any_host;
WSADATA wsaData;
String ip,s="http://www.yandex.ru";
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
       {
       Memo1->Lines->Add ("Winsock not be started");
       WSACleanup();
       }
else
       Memo1->Lines->Add("Winsock started");
any_host = gethostbyname(s.c_str());

Memo1->Lines->Add(any_host->h_addr[0]);
Memo1->Lines->Add(any_host->h_addr[1]);
Memo1->Lines->Add(any_host->h_addr[2]);
Memo1->Lines->Add(any_host->h_addr[3]);
WSACleanup();

так вот в Memo1 выводится белиберда вместо IP.
т.е. вопрос звучит так — как из network byte order сделать AnsiString?
Konstantine
Отправлено: 08.10.2004, 10:30


Мастер участка

Группа: Модератор
Сообщений: 545



если Я правильно понял то попробуй так:
CODE
Memo1->Lines->Add(IntToStr(any_host->h_addr[0]));
joynter
Отправлено: 08.10.2004, 10:48


Станционный диспетчер

Группа: Участник
Сообщений: 137



это первое, что я сделал  — не помогло
AVC
Отправлено: 08.10.2004, 10:50


Ветеран

Группа: Модератор
Сообщений: 1583



Кусок из рабочей программы. Авось сгодится.
CODE

char *buf;
int  i;

struct hostent *hret = gethostbyname(str.c_str());
...
for (i=0, buf=hret->h_addr_list[i]; buf; i++, buf=hret->h_addr_list[i])
{ str += "\r\n  " + AnsiString(i) + ". <" +
     AnsiString(int((buf[0]) & 0xFF)) + "." +
     AnsiString(int((buf[1]) & 0xFF)) + "." +
     AnsiString(int((buf[2]) & 0xFF)) + "." +
     AnsiString(int((buf[3]) & 0xFF)) + ">"
 ;
}

joynter
Отправлено: 08.10.2004, 11:28


Станционный диспетчер

Группа: Участник
Сообщений: 137



2AVC: спасибо
я бы не одну пару мозгов издумал, чтобы выдать "AnsiString(int((buf[0]) & 0xFF))"

интересен ход программистской мысли — поделитесь, если не напряжно.
конкретнее: интересует (buf[0]) & 0xFF

Отредактировано joynter — 08/10/2004, 12:33
Konstantine
Отправлено: 08.10.2004, 11:50


Мастер участка

Группа: Модератор
Сообщений: 545



это преобразование к [B]unsigned char[\B] должно получиться и без него если в начале объявить так:
CODE
unsigned char *Buf
или
CODE
UCHAR *Buf
AVC
Отправлено: 08.10.2004, 11:53


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
интересует (buf[0]) & 0xFF

в char старший разряд — знаковый и при преобразовании в int заполняет собой все левые биты, а 0xFF обрезает int опять до младшего байта. (Кстати, обычная практика на чистом C. Оттуда и привычка)
Можно обойти, поставив другие типы.
joynter
Отправлено: 08.10.2004, 12:05


Станционный диспетчер

Группа: Участник
Сообщений: 137



спасибо — все очень доходчиво объяснили

Отредактировано joynter — 08/10/2004, 13:09

Вернуться в Вопросы программирования в C++Builder