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

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

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

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

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

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

размер матрицы
#include <iostream> #include <vector> #include <stack> using namespace...

Размер vs. размерность матрицы
Вопрос скорее теоретический. Чем отличается размер матрицы от размерности? И...

Задать размер матрицы
Здравствуйте. Хочу задать размер матрицы примерно вот так (так нельзя,...

Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять его от элементов этой строки. размер матрицы 7х7.заранее спасибо
Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять...

Найти минимальный размер матрицы размером m x n
Помогите, пожалуйста! Программа считывает размеры матрицы, рандомно генерирует...

Как задать размер матрицы в конструкторе класса?
Подскажите как задать размер матрицы в конструкторе класса? Решаю задачи из...

39
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.08.2010, 01:29 #2
andreyich, Ага. Макросами.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.08.2010, 01:41 #3
andreyich,
Вообще говоря нет, каким-то образом тебе всё же придётся сообщить программе размерность...
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
24.08.2010, 02:04 #4
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Цитата Сообщение от Lavroff Посмотреть сообщение
Ага. Макросами.
это при условии, что матрица статическая и размеры её известны во время компиляции. В любом случае использование в функциях предопределённых констант - какое-то очень сомнительное решение.
0
Евгений М.
1047 / 986 / 98
Регистрация: 28.02.2010
Сообщений: 2,858
Завершенные тесты: 2
24.08.2010, 03:15 #5
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Можно схитрить, создав класс матрицы, у которого есть элементы отвечающие за размер матрицы.
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.08.2010, 03:18 #6
Евгений М.,
Мне кажется вопрос был не в том, т.к. в этом случае нам всё равно нужно самим задавать размерность. По-моему, человек хотел узнать, можно ли вообще не задавать размерность, а сделать так, чтобы программа распознавала её сама... Ну а уж если вопрос в том, чтобы не передавать размерность в функцию, то можно банально воспользоваться глобальными переменными...
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
Однако, библиотека, работающая со статическими матрицами - бесполезна.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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() резервирует памяти не меньше, чем запрошено, но может вернуть больше (из-за заморочек с выравниванием).
2
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
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;
    //...
}
0
silent_1991
Эксперт С++
5007 / 3067 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.08.2010, 04:47 #10
Да, в Си следует писать так
C
1
sizeof (array)
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 04:51 #11

Не по теме:

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


В общем, я считаю, лучше всего для своей библиотеки сделать так, как сказал Eвгений М., т.е. разработать класс "матрица"
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
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 и так далее), скобки необязательны
2
ForEveR
24.08.2010, 07:05
  #13

Не по теме:

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

0
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 10:23  [ТС] #14
Всем спасибо!!!
0
accept
4833 / 3254 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
24.08.2010, 11:37 #15
Lavroff, не, сделай sizeof 0.5, а потом sizeof 0.5L, ещё sizeof 'a'
можно узнавать размеры значений, не зная названий их типов
1
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 17:07  [ТС] #16
Вот когда с sizeof работаю в мэйне все норм, но когда ево использую в функциях постояно возвращает значение 0.
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 17:11 #17
andreyich, покажи код
0
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 17:17  [ТС] #18
Цитата Сообщение от Nameless One Посмотреть сообщение
andreyich, покажи код
Это пример кода:

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<conio.h>
#include<iostream.h>
int func(int **a);
 
main()
 {
  clrscr();
  int **a,d;
 
  a= new int* [3];
   for(int i=0;i<3;i++)
   {
     a[i]= new int [2];
   }
   d=func(a);
  cout<<d<<endl;
  getch();
  return 0;
 }
int func(int **a)
 {
  int l;
 
  l=sizeof(a);
 
  return l;
 }
И еще в функции пишет что 'а' не используется
0
Nameless One
Эксперт С++
5785 / 3434 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
24.08.2010, 17:23 #19
andreyich, тебе же уже сказали, что sizeof'ом для определения размера массива можно только тогда, когда массив у тебя - статический.
Если ты работаешь с динамическими массивами, то:
  1. передавай размер массива как параметр функции;
  2. разработай классы для работы с матрицей, которые будут хранить могут хранить размер матриц
ИМХО, второй вариант лучше

PS. Могу поделиться своими классами, если надо.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
24.08.2010, 17:25 #20
Цитата Сообщение от andreyich Посмотреть сообщение
l=sizeof(a);
Цитата Сообщение от accept Посмотреть сообщение
получится sizeof(int *)
В Вашем случае sizeof(int**), что явно тоже не то, что требовалось...
0
24.08.2010, 17:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 17:25
Привет! Вот еще темы с решениями:

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

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

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

Ввести размер массива с клавиатуры и передать этот размер в конструктор
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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