Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2017, 22:34   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Например, в таком коде компилятор этого уже не знает:
Код:
void exampleBadBar(int a[2][3])
{
    std::cout << "[must be 1] min value = "<< min__(a) <<std::endl;
}

void exampleBadFoo()
{
    int a[2][3] = {
        {3,4,5},
        {6,7,1},
    };
    exampleBadBar(a);
}
разумеется.

функция exampleBadBar работает с типом "указатель на массив",
а не с типом "массив".
_Bers вне форума Ответить с цитированием
Старый 29.07.2017, 22:40   #12
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
функция exampleBadBar работает с типом "указатель на массив"
Получается, массивы существуют только внутри одной функции, а при передаче в другую они волшебным образом перестают быть массивами, а становятся указателями на массив.

Тогда в чём глубинный смысл знания об их внутренней структуре?
Black Fregat вне форума Ответить с цитированием
Старый 29.07.2017, 22:42   #13
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Интересно почему?
1) Код усложняется
2) Код превращается в нечитабельную лапшу
3) Легче совершить ошибку
4) Это ничего не дает
5) Уходит больше времени

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Например, в таком коде компилятор этого уже не знает
а со ссылкой знает:
Код:
void exampleBadBar(int (&a)[2][3])
Croessmah вне форума Ответить с цитированием
Старый 29.07.2017, 22:44   #14
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
а при передаче в другую они волшебным образом перестают быть массивами, а становятся указателями на массив.
Не становятся они указателями на массив.
Массив может быть неявно скастован к указателю на первый элемент.
Указатель на какой-нибудь int и указатель на массив - разные вещи.
Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Тогда в чём глубинный смысл знания об их внутренней структуре?
Как минимум, не получить по башке?
Цитата:
Получается, массивы существуют только внутри одной функции
Функция может принять и вернуть указатель/ссылку на массив.
Croessmah вне форума Ответить с цитированием
Старый 29.07.2017, 22:49   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Получается, массивы существуют только внутри одной функции, а при передаче в другую они волшебным образом перестают быть массивами, а становятся указателями на массив.

Тогда в чём глубинный смысл знания об их внутренней структуре?
получается что в записи:
void exampleBadBar(int a[2][3])
в качестве аргумента вы сами же
указали тип данных: "указатель на массив"
а не тип данных "массив".

в аргументах int a[2][3]
это - не массив.
это - указатель на массив.
причем - одномерный.

такое вот кривое сишное наследие.

хотите сохранить информацию о размерностях массива,
передавайте его либо по ссылке на двухмерный массив:
void exampleBadBar(int (&a)[2][3])

либо по указателю на двухмерный массив:
void exampleBadBar(int (*p)[2][3])

хотите передавать любые массивы любых размерностей,
без потери знания о размерностях,
см пример функции выше:
Код:
template<class T> 
const typename elem__<T>::type& min__(const T& arr)
_Bers вне форума Ответить с цитированием
Старый 30.07.2017, 03:27   #16
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

...если вам таки приспичило именно массив, с известными размерами во время компиляции, пишите std::array и все. Двумерный массив, например:

Код:
template<class T, int s1, int s2>
using arr2d_t = std::array<std::array<T, s2>, s1>;
Так точно ничего и нигде не сломается + скорость как у всего описаного выше + методы доступа, как у контейнеров.
alexzk вне форума Ответить с цитированием
Старый 30.07.2017, 11:57   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Код:
template<class T, int s1, int s2>
using arr2d_t = std::array<std::array<T, s2>, s1>;
Так точно ничего и нигде не сломается
сломается.
тип int, указанный в вашем шаблоне - знаковый.
1.
он полагает легальным использование отрицательных величин.

Цитата:
warning: negative integer implicitly converted to unsigned type [-Wsign-conversion]
то, чего быть не должно, не должно быть в принципе.

2.
диапазон допустимых положительных значений
получается в два раза меньше
против реального диапазона std::array,

прототип которого выглядит:
template < class T, size_t N > class array;
http://www.cplusplus.com/reference/array/array/

3.
почему вообще вы использовали знаковый тип данных
для обозначения величины,
которая в принципе не может быть отрицательной?
где здравый смысл?

Последний раз редактировалось _Bers; 30.07.2017 в 12:02.
_Bers вне форума Ответить с цитированием
Старый 30.07.2017, 12:14   #18
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Так точно ничего и нигде не сломается
прохладная история.

http://rextester.com/CULJL90760


Код:
#include <iostream>
#include <array>

template<class T, int s1, int s2>
using arr2d_t = std::array<std::array<T, s2>, s1>;

int main()
{
    // warning: negative integer implicitly converted to unsigned type [-Wsign-conversion]
    arr2d_t<int, 0,-10> v;  //<--- dimension of array is zero. WTF???
    
    // Invalid memory reference (SIGSEGV)
    v[0][0] = 1;  //<--- Upsss

    // warning: ISO C++ forbids zero-size array ‘a’ [-Wpedantic]
    // error: size of array ‘a’ is negative
    int a[-10][0];
    
}
итого:
в вашем случае диагностирована
только одна проблема (использование int)
механизм благополучно профакапил ноль
в качестве количество элементов массива
и завалил всю работу
с сегфолдом в рантайме.

в случае с реальным массивом были диагностированы
обе проблемы: и проблема отрицательных чисел,
и нолик.

отрицательные числа компилятор скомпилировать не позволил.

зы:
std::array полагает легальным нулевой размер массива.
правда объявить то его можно.
а вот использовать - нельзя.
Цитата:
Zero-sized arrays are valid, but they should not be dereferenced (members front, back, and data).
нафига это нужно - для меня загадка.

Последний раз редактировалось _Bers; 30.07.2017 в 12:23.
_Bers вне форума Ответить с цитированием
Старый 30.07.2017, 14:22   #19
tutejshy
Форумчанин
 
Регистрация: 13.05.2017
Сообщений: 100
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
1) Код усложняется
2) Код превращается в нечитабельную лапшу
3) Легче совершить ошибку
4) Это ничего не дает
5) Уходит больше времени
1) 2) Тоесть запись a[1] более читабельная чем *(a + 1)?
3) и почему?
4) Кернел и Ритчи не согласны)
5) я бы так не сказал

К тому же, для обработки массива в другой ф-ции проблематично передавать и использовать синтаксический сахар, если заранее не знаешь размерности массива (на сколько я могу судить по полученному опыту).
tutejshy вне форума Ответить с цитированием
Старый 30.07.2017, 14:23   #20
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от tutejshy Посмотреть сообщение
Кернел и Ритчи не согласны)
а что они говорят?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык Си - массивы leonid_spartak Помощь студентам 1 12.05.2017 09:30
Массивы.Язык Си Caca0 Помощь студентам 26 05.02.2013 00:10
массивы. язык СИ. skauzer_blr Помощь студентам 8 10.04.2012 22:15
Массивы, язык - C. xcyber Помощь студентам 9 19.10.2009 21:38
Массивы (язык С++) Ноберт Помощь студентам 3 24.08.2009 23:10