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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация char[] из constexpr char[] 
V
    Опции темы
boostcoder
Дата 29.4.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



всем привет.

есть такой код:
Код

#include <iostream>

struct type {
   char file[128];
   char function[256];
};

template<size_t ls, size_t fs>
void func(const char(&file)[ls], int line, const char(&function)[fs]) {
   type t = { file, function }; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   std::cout << __PRETTY_FUNCTION__ << std::endl;
   std::cout << "sizeof(file) = " << sizeof(file) << std::endl;
   std::cout << "sizeof(function) = " << sizeof(function) << std::endl;

   std::cout << t.file << std::endl;
   std::cout << t.function << std::endl;
}

int main() {
   func(__FILE__, __LINE__, __PRETTY_FUNCTION__);
}

http://liveworkspace.org/code/9971940363d8...afe34144cdf24ed
бажная строка отмечена.

получаю такую ошибку:
Цитата

error: invalid conversion from 'const char*' to 'char' [-fpermissive]
error: invalid conversion from 'const char*' to 'char' [-fpermissive]

почему?
если закомментить бажную строку, то код компилится.
sizeof(file) и sizeof(function) выводят правильные размеры массивов, значит file и function не указатели. иначе бы sizeof`ы возвращали размер указателей.

в общем объясните что не так.

спасибо.


Это сообщение отредактировал(а) boostcoder - 29.4.2011, 16:39
PM WWW   Вверх
boostcoder
Дата 29.4.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



упрощенный пример:
Код

template<size_t size>
void func(const char(&arr)[size]) {
   const char buf[128] = {arr}; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<
}

int main() {
   func(__PRETTY_FUNCTION__);
}

http://liveworkspace.org/code/ced3e4b8e139...ca2db7bd3963988

как инициализировать buf ?

PM WWW   Вверх
mes
Дата 29.4.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Вы собрались инициализировать массив в структуре другим массивом ? 
а чего бы не разгрузить этот стык  конструктором ?

Добавлено через 40 секунд
Цитата(boostcoder @  29.4.2011,  16:08 Найти цитируемый пост)
как инициализировать buf ?

memcpy smile



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


pattern`щик
****


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

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



Цитата(mes @  29.4.2011,  17:08 Найти цитируемый пост)
Вы собрались инициализировать массив в структуре другим массивом ?

да.


Цитата(mes @  29.4.2011,  17:08 Найти цитируемый пост)
а чего бы не разгрузить этот стык  конструктором ?

а что изменится?
и какой должен быть в этом случае конструктор?

Цитата(mes @  29.4.2011,  17:08 Найти цитируемый пост)
memcpy

от этого и хочу избавиться.

Добавлено через 8 минут и 6 секунд
Цитата(mes @  29.4.2011,  17:08 Найти цитируемый пост)
а чего бы не разгрузить этот стык  конструктором ?

не понимаю каким должен быть конструктор для этого.. пробовал так:
Код

#include <iostream>

struct type {
   template<size_t ls, size_t fs>
   type(const char(&f)[ls], const char(&u)[fs])
      :file(f),
      function(u)
   {}

   const char file[128];
   const char function[128];
};

template<size_t ls, size_t fs>
void func(const char(&file)[ls], int line, const char(&function)[fs]) {
   type t(file, function); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

   std::cout << __PRETTY_FUNCTION__ << std::endl;
   std::cout << "sizeof(file) = " << sizeof(file) << std::endl;
   std::cout << "sizeof(function) = " << sizeof(function) << std::endl;

   std::cout << t.file << std::endl;
   std::cout << t.function << std::endl;
}

int main() {
   func(__FILE__, __LINE__, __PRETTY_FUNCTION__);
}

http://liveworkspace.org/code/b80134fea328...0cd08aaec1befa8

получаю это:
Цитата

source.cpp: In constructor 'type::type(const char (&)[ls], const char (&)[fs]) [with unsigned int ls = 88u, unsigned int fs = 11u]':
source.cpp:16:25:   instantiated from 'void func(const char (&)[ls], int, const char (&)[fs]) [with unsigned int ls = 88u, unsigned int fs = 11u]'
source.cpp:27:48:   instantiated from here
source.cpp:7:17: error: incompatible types in assignment of 'const char [88]' to 'const char [128]'
source.cpp:7:17: error: incompatible types in assignment of 'const char [11]' to 'const char [128]'

PM WWW   Вверх
mes
Дата 29.4.2011, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  29.4.2011,  16:17 Найти цитируемый пост)
от этого и хочу избавиться.

без копирования в том или ином виде не обойтись.. C++ не позволяет инициализацию массива другим массивом..

Добавлено через 2 минуты и 6 секунд
копирование можно реализовать через рекурсивную шаблонную функцию..
 


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


pattern`щик
****


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

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



Цитата(mes @  29.4.2011,  17:25 Найти цитируемый пост)
без копирования в том или ином виде не обойтись..

жаль.. smile 
PM WWW   Вверх
mes
Дата 29.4.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  29.4.2011,  16:28 Найти цитируемый пост)
жаль..   

копирование можно развернуть в компильтайме, используя рекурсивно шаблоную (по размеру) функцию.. 


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


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


pattern`щик
****


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

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



Цитата(mes @  29.4.2011,  17:33 Найти цитируемый пост)
копирование можно развернуть в компильтайме, используя рекурсивно шаблоную (по размеру) constexpr функцию..

сейчас попробую..
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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