Форум программистов, компьютерный форум CyberForum.ru

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

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

Показать сообщение отдельно
Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 324
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]" спасибо! То, что надо!
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru