Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > инициализация char[] из constexpr char[]


Автор: boostcoder 29.4.2011, 16:33
всем привет.

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

#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/9971940363d8fc125afe34144cdf24ed
бажная строка отмечена.

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

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, 17:08
упрощенный пример:
Код

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

int main() {
   func(__PRETTY_FUNCTION__);
}

http://liveworkspace.org/code/ced3e4b8e1391beb6ca2db7bd3963988

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

Автор: mes 29.4.2011, 17:08
Вы собрались инициализировать массив в структуре другим массивом ? 
а чего бы не разгрузить этот стык  конструктором ?

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

memcpy smile

Автор: boostcoder 29.4.2011, 17:17
Цитата(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/b80134fea3283c5a80cd08aaec1befa8

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

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]'

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

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

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

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

жаль.. smile 

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

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

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

сейчас попробую..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)