Форум программистов, компьютерный форум, киберфорум
Наши страницы

Определить размерность массива по указателю на него - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ проверить решение http://www.cyberforum.ru/cpp-beginners/thread392670.html
Даны вещественные массивы A S.Для каждого массива определить количество элементов предшествующих первому отрицательному элементу массива. #include <iostream.h> #include <iomanip.h> // прототипы...
C++ В чем преймущество создания обьектов в куче? Знаю, что задаю глупый вопрос поэтому прошу матом не ругаться палками не бить. Я не понимаю в чем преимущества создания объектов и переменных в куче (кроме динамического распределения памяти). http://www.cyberforum.ru/cpp-beginners/thread392667.html
C++ Двумерный массив
1)Заполнить матрицу и вывести результат на экран 2)Заполнить матрицу и сохранить в 2 файла( текстовый file.txt и бинарный file.bin) 3)Прочитать матрицы из файлов и обе матрицы вывести на экран...
C++ Библиотека fltk и неразрешенные внешние элементы
Здравствуйте. Уже не знаю, куда обратится, пишу сюда. Извиняюсь, если вопрос не новый, но думаю что не тривиальный. Вобщем читаю книгу Страуструпа "Programming: principles and practice using C++",...
C++ Как правильно объявить fopen http://www.cyberforum.ru/cpp-beginners/thread392653.html
Доброго времени суток. наткнулся на некоторого рода проблемку. Не могу объявить fopen.. Описываю так как на MSDN написано , а компилятор ругается , мол смотрите объявление fopen; int main() {...
C++ Указать наименьшую длину числовой оси, содержащую заданные числа дана последовательность чисел а1,а2,...аn.указать наименьшую длину числовой оси, содержащую все эти числа. подробнее

Показать сообщение отдельно
Lupus
23 / 23 / 1
Регистрация: 13.03.2011
Сообщений: 326
27.11.2011, 17:44  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Ваша шаблонная функция объявлена, как принимающая указатель. Указатель не имеет никакого представления о том, передаете ли вы указатель на первый элемент массива, или на одиночный объект. Поэтому, объявив таким образом функцию, вы не сможэете получить информацию о массиве, если таковой передаетя в функцию.
Более того, вы объевляете двумерный массив, а парметр у вас указан как указательна на объект. Поэтому ваш код вообще не должен компилироваться.
Вам следует изменить объявление вашей шаблонной функции и объявить параметр, как ссылку (возможно констатную ссылку, на массив. Например,


C++
1
2
template< typename T, size_t N, size_t M >
void info( T  ( &x )[M][N] );
Тогда внутри функции вы сможете выполнять операции с вашим массивом.
Код прекрасно компилится и на Qt и на Visual Studio, просто я не знал как можно еще передать массив в шаблон. А если бы массив был заранее проинициализирован нулями, можно было каждый раз увеличивать указатель, до встречи не с нулем? Я ведь мог бы тогда узнать точный размер (с большой долью вероятности) массива?

Цитата Сообщение от Nameless One Посмотреть сообщение
можно, но только статические:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cstdlib>
 
template <class T, size_t rows, size_t cols>
void fill(T (&arr)[rows][cols])
{
    for(size_t i = 0; i < rows; ++i)
    for(size_t j = 0; j < cols; ++j)
        arr[i][j] = i + j + i * j + 1;
}
 
template <class T, size_t rows, size_t cols>
void dump(const T (&arr)[rows][cols])
{
    for(size_t i = 0; i < rows; ++i, std::cout << std::endl)
    for(size_t j = 0; j < cols; ++j)
        std::cout << arr[i][j] << '\t';
}
 
int main()
{
    int arr[2][3];
 
    fill(arr);
    dump(arr);
}
для динамических массивов нужно будет явно передавать размерность в функцию
Нубский вопрос - а почему берём в циклах именно size_t? И почему нельзя в качестве параетров принимать интовую размерность массива?
Цитата Сообщение от BRcr Посмотреть сообщение
А если, допустим, мы заранее знаем размерность массива и передаем функции указатель int * - можем ведь мы в этом случае работать с ним как с указателем на массив соответствующей размерности?
Наверное да, ведь указатель должен (должен ли ??) указывать на первый элемент массива, и мы можем увеличивать его до размера массива

P.S. а за функцию типа "T (&arr)[rows][cols]" спасибо! То, что надо!
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.