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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
#1

Размер матрицы - C++

24.08.2010, 01:26. Просмотров 2726. Ответов 39
Метки нет (Все метки)

Люди, помогите пожалуйста!

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

Объясните пожалуйста новичку! Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2010, 01:26     Размер матрицы
Посмотрите здесь:

размер матрицы - C++
#include <iostream> #include <vector> #include <stack> using namespace std; typedef vector<int > T_vec; typedef...

Размер vs. размерность матрицы - C++
Вопрос скорее теоретический. Чем отличается размер матрицы от размерности? И как правильно спрашивать пользователя в программе: "Введите...

Задать размер матрицы - C++
Здравствуйте. Хочу задать размер матрицы примерно вот так (так нельзя, естественно): #include <iostream> #include <string> #include...

Найти минимальный размер матрицы размером m x n - C++
Помогите, пожалуйста! Программа считывает размеры матрицы, рандомно генерирует значения ее членов и из них ищет минимальный. В 18-й...

Как задать размер матрицы в конструкторе класса? - C++
Подскажите как задать размер матрицы в конструкторе класса? Решаю задачи из учебника, не могу понять, думаю это невозможно... Р. Лафоре...

помогите сделать: подпрограмма считывает размер матрицы из первого файла и передает его во второй? - C++
не могли бы вы подделиться ссылкой на пример,где подпрограмма считывает размер матрицы из первого файла и передает его во второй? заранее...

С клавиатуры вводится размер матрицы и сама матрица. Найти в матрице строку с максимальной суммой и отсортиров - C++
С клавиатуры вводится размер матрицы и сама матрица. Найти в матрице строку с максимальной суммой и отсортировать

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.08.2010, 01:29     Размер матрицы #2
andreyich, Ага. Макросами.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.08.2010, 01:41     Размер матрицы #3
andreyich,
Вообще говоря нет, каким-то образом тебе всё же придётся сообщить программе размерность...
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,501
24.08.2010, 02:04     Размер матрицы #4
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Цитата Сообщение от Lavroff Посмотреть сообщение
Ага. Макросами.
это при условии, что матрица статическая и размеры её известны во время компиляции. В любом случае использование в функциях предопределённых констант - какое-то очень сомнительное решение.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
24.08.2010, 03:15     Размер матрицы #5
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Можно схитрить, создав класс матрицы, у которого есть элементы отвечающие за размер матрицы.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.08.2010, 03:18     Размер матрицы #6
Евгений М.,
Мне кажется вопрос был не в том, т.к. в этом случае нам всё равно нужно самим задавать размерность. По-моему, человек хотел узнать, можно ли вообще не задавать размерность, а сделать так, чтобы программа распознавала её сама... Ну а уж если вопрос в том, чтобы не передавать размерность в функцию, то можно банально воспользоваться глобальными переменными...
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
24.08.2010, 03:58     Размер матрицы #7
Если матрицы - статические, то сработает такая конструкция:
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
27
#include <iostream>
 
template<class T, size_t N, size_t M>
void show(T (&matrix)[N][M])
{
    for(size_t i = 0; i < N; ++i, std::cout << std::endl)
        for(size_t j = 0; j < M; ++j)
            std::cout << matrix[i][j] << "\t";
}
 
template<class T, size_t N, size_t M>
void init(T (&matrix)[N][M])
{
    for(size_t i = 0; i < N; ++i)
        for(size_t j = 0; j < M; ++j)
            matrix[i][j] = i + j + i * j;
}
 
int main()
{
    const size_t row = 5;
    const size_t col = 5;
    int imatrix[row][col];
    init(imatrix);
    show(imatrix);
    return 0;
}
Однако, библиотека, работающая со статическими матрицами - бесполезна.
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,501
24.08.2010, 04:41     Размер матрицы #8
Есть крайне ненадёжный и работающий только в несертифицированных Microsoft операционных системах, но по-своему забавный способ...
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
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
void print_sizes(int ** matrix){
    printf("Rows: %d\tColumns: %d\n", malloc_usable_size(matrix) / sizeof(int*),
        malloc_usable_size(*matrix) / sizeof(int));
}
 
int main(void){
    int rows, columns, **matrix, i;
    
    printf("Rows: ");
    scanf("%d", &rows);
    printf("Columns: ");
    scanf("%d", &columns);
    
    if ( ( matrix = (int**)malloc(sizeof(int*) * rows) ) == NULL ){
        perror("malloc");
        exit(1);
    }
    for ( i = 0; i < rows; ++i ){
        if ( ( matrix[i] = (int*)malloc(sizeof(int) * columns) ) == NULL ){
            perror("malloc");
            exit(1);
        }
    }
    
    printf("Created matrix with sizes:\n");
    print_sizes(matrix);
    
    for( i = 0; i < rows; ++i )
        free(matrix[i]);
    free(matrix);
    
    exit(0);
}
Засада в том, что malloc() резервирует памяти не меньше, чем запрошено, но может вернуть больше (из-за заморочек с выравниванием).
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
24.08.2010, 04:45     Размер матрицы #9
Также, если массив статический, можно узнать его размер внутри функции с помощью оператора sizeof языка C++ (не помню, но вроде в С это не оператор, а функция):
C++
1
2
3
4
5
void func(int* array)
{
    size_t size = sizeof array / sizeof *array;
    //...
}
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.08.2010, 04:47     Размер матрицы #10
Да, в Си следует писать так
C
1
sizeof (array)
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
24.08.2010, 04:51     Размер матрицы #11

Не по теме:

Прикол в том, что в С++ тоже есть функция sizeof, потому что оператор sizeof может работать только с переменными, в то время как функция sizeof может работать и с типами данных, и с переменными


В общем, я считаю, лучше всего для своей библиотеки сделать так, как сказал Eвгений М., т.е. разработать класс "матрица"
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.08.2010, 06:39     Размер матрицы #12
в C sizeof() - одноместная операция

Добавлено через 1 минуту
C++
1
2
3
4
5
void func(int* array)
{
    size_t size = sizeof array / sizeof *array;
    //...
}
получится sizeof(int *) / sizeof(int)

Добавлено через 3 минуты
а ещё, операцию sizeof можно использовать как со скобками, так и без скобок
когда ищешь размер типа, скобки необходимы, а когда ищешь размер объекта (переменная с таким-то именем, sizeof 0.5 и так далее), скобки необязательны
ForEveR
24.08.2010, 07:05
  #13

Не по теме:

accept, 0.5 не самое корректное имя для переменной

andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 10:23  [ТС]     Размер матрицы #14
Всем спасибо!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 11:37     Размер матрицы
Еще ссылки по теме:

Зачем при передаче матрицы в функцию, передавать вторым аргументом её размер, если в первом он уже указан? - C++
Добрый день господа.Объясните пожалуйста почему при вызове функции f() В левый индекс ничего не засовывается и для чего нужен правый...

Размер файла - C++
Добрый день , нужно получить размер файла мой код пишет что-то не внятное значение 1787408944 #include &lt;sys/stat.h&gt; ...

Размер массива - C++
Здрасте. Такой вопрос.Можно ли каким то образом вывести число элементов массива,то есть его размер? Допустим int arr; Программа...

Размер окна - C++
Знающие люди, подскажите пожалуйста,как задать размер консольного окошка??..т.е. он стандартно вроде 80х25,а мне например нужно,чтобы был...

размер vector'a - C++
как узнать размер двумерного вектора отдельно по вертикали и горизонтали


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.08.2010, 11:37     Размер матрицы #15
Lavroff, не, сделай sizeof 0.5, а потом sizeof 0.5L, ещё sizeof 'a'
можно узнавать размеры значений, не зная названий их типов
Yandex
Объявления
24.08.2010, 11:37     Размер матрицы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru