Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поясните код плизз кто может :)  (Прочитано 15530 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« : 04-07-2007 05:26 » 

В общем получилось так что попался мне код на C++, который мне нужно перевести в код на C# Улыбаюсь
Плюсы к стыду своему практически забыл Жаль В общем непонятны мне некоторые моменты. Если кто не ленится объяснить мне неучу эти моменты, то буду безмерно благодарен.

1. Ну в первую очередь попался мне тип unsigned . Это как я понимаю что то типа variant который может быть любым простым типом, или указателем, который потом инициализируется каким то значением, которое и определит его тип ?

2. Далее вот такая вот декларация :
Код:
typedef void (afterGettingFunc)(void* clientData, unsigned size,
  unsigned numBytes,
  struct timeval pTime,
  unsigned durationInMicroseconds, unsigned char* strTo);

Тут мне дотнетчику не совсем понятны три момента :

  а) typedef void (afterGettingFunc) : как я понимаю, то это объявляется тип afterGettingFunc, который представляет функцию с параметрами (void* clientData, unsigned size, unsigned numBytes, struct timeval pTime, unsigned durationInMicroseconds, unsigned char* strTo) ?

  б) void* clientData : это указатель на что ? Тоже на какую то функцию типа void ?

  в) unsigned char* strTo - это указатель на массив чаров (тобиш стринг вероятно) ?

Заранее спасибо тому кто не поленится мне разъяснить эти моменты для меня неясные Улыбаюсь

З.Ы. Прошу ногами не пинать Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 04-07-2007 05:41 » 

unsigned значит беззнаковый, т.е.  есть int и есть unsigned int, как в .НЕТе тип uint.
А вот аналогию с variant можешь проводить с типом void. Тип void ты потом можешь привести к любому другому типу (что конечно не всегда безопасно). С .НЕТ если проводить аналогию, то сравнить можно с Object.
a) верно
б)Это указатель так сказать ни на что. Его потом можно будет привести к какому-нибудь типу. Скорее всего в функции это будет происходить.
в)это указатель на массив чаров (беззнаковый, значит диапазон будет считаться от 0 до 255), но только не забывай, что в с++ нет типа string, а строки представлены ввиде массивов символов (как раз char*)
« Последнее редактирование: 04-07-2007 05:47 от nikedeforest » Записан

ещё один вопрос ...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #2 : 04-07-2007 06:16 » 

Спасибки nikedeforest,

Вот только насчёт unsigned я видимо не совсем верно объяснил что нужно.
Приведу пример кодаю В хедер файле задекларировано вот что :
Код:
protected:
  unsigned long fInputTransportPacketCounter;
  u_int8_t fLastContinuityCounter;
  unsigned fClosureNumber;
  unsigned fParseBufferSize;
  unsigned fParseBufferFrameStart;
  unsigned fParseBufferParseEnd;
  unsigned fParseBufferDataEnd; 

Далее в цпп файле инициализируется конструктор класса таким образом :
Код:
TestClass::TestClass(UsageClass& env)
  : SourceClass(env),
    fInputTransportPacketCounter((unsigned)-1), fClosureNumber(0),
    fLastContinuityCounter(~0),
    fParseBufferSize(PARSE_BUFFER_SIZE),
    fParseBufferFrameStart(0), fParseBufferParseEnd(4), fParseBufferDataEnd(0) {   
 
     //constructor code
}

Т.е. переменные изначально объявлены просто как  unsigned, а затем инициализируются. Вот тут как раз и непонятки. Особенно вот с такой инициализацией :
1. fInputTransportPacketCounter((unsigned)-1) : (unsigned)-1 - это что за значение получается ?
2. fLastContinuityCounter(~0) :  ~0 - это тоже неясно
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 04-07-2007 06:32 » 

MOPO3,
((unsigned)-1)
 - это приведение минус единицы к типу, указанному в скобках. Только должно уж быть написано
(unsigned long)-1 ,
 раз переменная была объявлена как
unsigned long fInputTransportPacketCounter;


(~0) - это побитовая инверсия , то есть все биты результата (~0) будут == 1

(~0) == FFFFFFFF

--------
в принципе , (~0) == ((unsigned long)-1)
, но если размер типов одинаков
------------------------
в итоге - задавай в инитке в шарпе просто (-1) в обоих случаях. Если пропустит )
« Последнее редактирование: 04-07-2007 06:38 от Алексей1153++ » Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-07-2007 06:43 » 

просто unsigned аналогично unsigned int (Страуструп изд.2 стр. 50) Если типа не указан, то подразумевается int, можно написать static x. Подразуевается static int x
« Последнее редактирование: 04-07-2007 06:46 от nikedeforest » Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 04-07-2007 06:44 » 

ну, просто так вышло , что int и long - одно и то же )
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 04-07-2007 06:51 » 

не одно и тоже. Диапазоны отличаются. Если не ошибаюсь, одно и тоже - это long и long int.
Записан

ещё один вопрос ...
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 04-07-2007 06:54 » 

Вот наваял простенький код и посмотрел на результат :

Код:
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
char chr;
unsigned fInputTransportPacketCounter((unsigned)-1);
unsigned fClosureNumber(0);
    unsigned long fLastContinuityCounter(~0);
    unsigned fParseBufferFrameStart(0);
unsigned fParseBufferParseEnd(4);
unsigned fParseBufferDataEnd(0);
cout << "fInputTransportPacketCounter : " << fInputTransportPacketCounter;
printf("\n");
cout << "fClosureNumber : " << fClosureNumber;
printf("\n");
cout << "fLastContinuityCounter : " << fLastContinuityCounter;
printf("\n");
cout << "fParseBufferFrameStart : " << fParseBufferFrameStart;
printf("\n");
cout << "fParseBufferParseEnd : " << fParseBufferParseEnd;
printf("\n");
cout << "fParseBufferDataEnd : " << fParseBufferDataEnd;
printf("\n");

cin >> chr;
return 0;
}

В итоге результат такой :
Код:
fInputTransportPacketCounter : 4294967295
fClosureNumber : 0
fLastContinuityCounter : 4294967295
fParseBufferFrameStart : 0
fParseBufferParseEnd : 4
fParseBufferDataEnd : 0
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 04-07-2007 06:56 » 

nikedeforest,  хм... а в VC - одно и то же, для обоих - 4 байта
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 04-07-2007 07:29 » 

Во-первых,
unsigned fParseBufferParseEnd(4);

это одно и тоже, что
unsigned int fParseBufferParseEnd =4;
Инициализация такая короче переменной.

Как Алексей правльно сказал, ~0 равно FFFFFF, т.е. все биты устанавливаются в 1.
(unsigned (-1))  в том случае можно было не писать, если напишешь просто -1 в скобках, то эффект будет тот же самый.  При этом (unsigned (-1)) равно ~0 и в двоичном виде это 11111111 (если представить что int 1 байт)
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 04-07-2007 07:47 » new

Алексей, да, там int равен long int Ага
Записан

ещё один вопрос ...
RXL
Технический
Администратор

ru
Online Online
Пол: Мужской

WWW
« Ответ #11 : 04-07-2007 10:19 » 

Алексей1153++,
long - 32 бита
int - размер целого для данной платформы (16, 32, 64 бита). Просто под win32 у тебя int - 32 бита, а под win64 будет 64 и программы придется переписывать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 04-07-2007 10:26 » 

понятненько... учтём при переходе =-0

и то есть разрядность платформы всегда можно проверить как
sizeof(int)*8
?
Записан

RXL
Технический
Администратор

ru
Online Online
Пол: Мужской

WWW
« Ответ #13 : 04-07-2007 15:07 » 

Алексей1153++, впринципе - да, а фактически - зависит от настроек компилятора.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #14 : 05-07-2007 04:15 » 

Ребята, спасибо вам за помощь Улыбаюсь Если возникнут ещё вопросы, то напишу Улыбаюсь Основные моменты nikedeforest и  Алексей1153++ мне уже растолковали по аське, за что им отдельное спасибки Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 05-07-2007 04:21 » 

мы ж всегда рады чем можем помочь )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines