Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прошу объяснить языковую конструкцию, С++ 
V
    Опции темы
volatile
Дата 11.3.2011, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



У мелкомягких в студии есть макрос _countof()
Макрос довольно полезный, выдает размер массива в элементах.
например:
int buf[25];
int size = _countof(buf); // здесь size = 25;
Смысл понятный.
Но вот определение этого макроса сбивает несколько с толку.
Код

template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; // <-- Что это?
#define _countof(_Array) sizeof(*__countof_helper(_Array))
Растолкуйте что означает сия конструкция? конкретно 2-я строчка.
Я не понимаю это декларация функции, массив, или... в общем полный ступор. smile 
Буду благодарен за подробное объяснение.

PM MAIL   Вверх
mes
Дата 12.3.2011, 00:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



исправлено
функцию, принимающей ссылку на массив _CountOfTyper и возвращающей указатель на  массив типа char..

Добавлено @ 00:37
т.е. что то типа этого :
Код

typedef T array[N];
char (*fn(array&))[N];


Это сообщение отредактировал(а) mes - 12.3.2011, 17:45


--------------------
PM MAIL WWW   Вверх
volatile
Дата 12.3.2011, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mes @  12.3.2011,  00:34 Найти цитируемый пост)
char (*pfn(array&))[N];



mes, почему в вас амперсанд стоит после имени?  array&

Добавлено через 3 минуты и 15 секунд
или array у вас это тип? что-то туплю я ....
PM MAIL   Вверх
volatile
Дата 12.3.2011, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Да array у вас это тип. дошло.
mes, большое спасибо. Но все-же тяжеловато что-то с такими выкрутасами...

PM MAIL   Вверх
volatile
Дата 12.3.2011, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Я немного проанализировал почему до меня это тяжко доходит.
Дело в том что я никогда не пользовался типом массива, просто применял указатели вместо массива.

В связи с этим еще вопросик.
char (*pfn())[N]; // это есть указатель на функцию возвращающую массив N чаров, правильо?
а как объявить саму функцию?
char fn() [N]; // непрокатывает, 

вроде бы невозможно...? интересно что указатель на функцию возвращающую массив объявить можно, а саму функцию нельзя.
Или я ошибаюсь?
извиняюсь за идиотские вопросы  smile , но нужно уже это добить.
PM MAIL   Вверх
boostcoder
Дата 12.3.2011, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



volatile, посмотри на это:
Код

#include <iostream>

template <typename T, const size_t cols, const size_t rows>
void func (T (&arr)[cols][rows])
{
   std::cout<< "cols: "    << cols << ", rows: " << rows << std::endl
            << "summ: "    << cols*rows << std::endl
            << "sizeof: "  << sizeof(arr) << std::endl;
}

int main() {
   int array[4][32];
   func(array);
   return 0;
}


http://liveworkspace.org/code/34c4ac81effc...aa53c1c1ded2461
PM WWW   Вверх
mes
Дата 12.3.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  12.3.2011,  01:36 Найти цитируемый пост)
В связи с этим еще вопросик.
char (*pfn())[N]; // это есть указатель на функцию возвращающую массив N чаров, правильо?
а как объявить саму функцию?
char fn() [N]; // непрокатывает,

сорри, я вчера вечером немного напутал.. подправил в посте.. 

char (*pfn())[N]; // функция, возвр. указатель на массив
char (*(*pfn)())[N]; // указатель на такую функцию
char (&(&pfn)())[N]; // ссылка на  на функцию, возвр. ссылку на массив.. 
а просто возвращать массив нельзя..

Добавлено через 42 секунды
Цитата(volatile @  12.3.2011,  00:27 Найти цитируемый пост)
Но все-же тяжеловато что-то с такими выкрутасами...

 smile


--------------------
PM MAIL WWW   Вверх
volatile
Дата 12.3.2011, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Большое спасибо всем.
Постараюсь классифицировать, больше для самого себы, но и возможно кому-то из новичков тоже может пригодиться.
В начале четыре элементанрые функции

Код

int global_array [25];
//------
// Функция возвращающая указатель на массив интов размером 25;
int (* func1()) [25]
{
   return & global_array;
}
//------
// Функция возвращающая ссылку на массив интов размером 25;
int (& func2()) [25]
{
   return global_array;
}
//------
// Функция принимающая указатель на массив интов размером 25;
// возвращающая просто инт.
int func3( int (*pbuf) [25])
{
   return (*pbuf) [0];
}
//------
// Функция принимающая ссылку на массив интов размером 25;
// возвращающая просто инт.
int func4( int (& rbuf) [25])
{
   return rbuf [0];
}


Теперь объединяем это в разных вариантах smile
Код

// Функция принимающая указатель на массив интов размером 25;
// и возвращающая указатель на массив интов размером 25;

int (* func5( int (* pbuf) [25])) [25]
{
   return pbuf;
}
//------
// Функция принимающая ссылку на массив интов размером 25;
// и возвращающая ссылку на массив интов размером 25;
int (& func6( int (& rbuf) [25])) [25]
{
   return rbuf;
}
//------
// Функция принимающая указатель на массив интов размером 25;
// и возвращающая ссылку на массив интов размером 25;
int (& func7( int (* pbuf) [25])) [25]
{
   return * pbuf;
}
//------
// Функция принимающая ссылку на массив интов размером 25;
// и возвращающая указатель на массив интов размером 25;
int (* func8( int (& rbuf) [25])) [25]
{
   return & rbuf;
}

Поправьте если где ошибся.

PM MAIL   Вверх
mes
Дата 12.3.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вроде все ок smile


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 12.3.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



volatile, добавь тогда уже и мой вариант, с комментарием.
PM WWW   Вверх
volatile
Дата 12.3.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(boostcoder @  12.3.2011,  14:01 Найти цитируемый пост)
добавь тогда уже и мой вариант, с комментарием. 

boostcoder, у вас вроде функция принимающая ссылку на массив.
так что в принципе этот вариант есть.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.