link10650 link10651 link10652 link10653 link10654 link10655 link10656 link10657 link10658 link10659 link10660 link10661 link10662 link10663 link10664 link10665 link10666 link10667 link10668 link10669 link10670 link10671 link10672 link10673 link10674 link10675 link10676 link10677 link10678 link10679 link10680 link10681 link10682 link10683 link10684 link10685 link10686 link10687 link10688 link10689 link10690 link10691 link10692 link10693 link10694 link10695 link10696 link10697 link10698 link10699 link10700 link10701 link10702 link10703 link10704 link10705 link10706 link10707 link10708 link10709 link10710 link10711 link10712 link10713 link10714 link10715 link10716 link10717 link10718 link10719 link10720 link10721 link10722 link10723 link10724 link10725 link10726 link10727 link10728 link10729 link10730 link10731 link10732 link10733 link10734 link10735 link10736 link10737 link10738 link10739 link10740 link10741 link10742 link10743 link10744 link10745 link10746 link10747 link10748 link10749 link10750 link10751 link10752 link10753 link10754 link10755 link10756 link10757 link10758 link10759 link10760 link10761 link10762 link10763 link10764 link10765 link10766 link10767 link10768 link10769 link10770 link10771 link10772 link10773 link10774 link10775 link10776 link10777 link10778 link10779 link10780 link10781 link10782 link10783 link10784 link10785 link10786 link10787 link10788 link10789 link10790 link10791
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