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

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

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

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

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

C++ размер матрицы
C++ Размер vs. размерность матрицы
C++ помогите сделать: подпрограмма считывает размер матрицы из первого файла и передает его во второй?
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять его от элементов этой строки. размер матрицы 7х7.заранее спасибо C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.08.2010, 01:29     Размер матрицы #2
andreyich, Ага. Макросами.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.08.2010, 01:41     Размер матрицы #3
andreyich,
Вообще говоря нет, каким-то образом тебе всё же придётся сообщить программе размерность...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2010, 02:04     Размер матрицы #4
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Цитата Сообщение от Lavroff Посмотреть сообщение
Ага. Макросами.
это при условии, что матрица статическая и размеры её известны во время компиляции. В любом случае использование в функциях предопределённых констант - какое-то очень сомнительное решение.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
24.08.2010, 03:15     Размер матрицы #5
Цитата Сообщение от andreyich Посмотреть сообщение
Можно ли сделать ,так что в параметрах функций были только матрицы , а размеры их программа знала сама???
Можно схитрить, создав класс матрицы, у которого есть элементы отвечающие за размер матрицы.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.08.2010, 03:18     Размер матрицы #6
Евгений М.,
Мне кажется вопрос был не в том, т.к. в этом случае нам всё равно нужно самим задавать размерность. По-моему, человек хотел узнать, можно ли вообще не задавать размерность, а сделать так, чтобы программа распознавала её сама... Ну а уж если вопрос в том, чтобы не передавать размерность в функцию, то можно банально воспользоваться глобальными переменными...
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.08.2010, 04:47     Размер матрицы #10
Да, в Си следует писать так
C
1
sizeof (array)
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
24.08.2010, 04:51     Размер матрицы #11

Не по теме:

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


В общем, я считаю, лучше всего для своей библиотеки сделать так, как сказал Eвгений М., т.е. разработать класс "матрица"
accept
4837 / 3236 / 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
Всем спасибо!!!
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.08.2010, 11:37     Размер матрицы #15
Lavroff, не, сделай sizeof 0.5, а потом sizeof 0.5L, ещё sizeof 'a'
можно узнавать размеры значений, не зная названий их типов
andreyich
0 / 0 / 0
Регистрация: 08.08.2010
Сообщений: 16
24.08.2010, 17:07  [ТС]     Размер матрицы #16
Вот когда с sizeof работаю в мэйне все норм, но когда ево использую в функциях постояно возвращает значение 0.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
24.08.2010, 17:11     Размер матрицы #17
andreyich, покажи код
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;
 }
И еще в функции пишет что 'а' не используется
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
24.08.2010, 17:23     Размер матрицы #19
andreyich, тебе же уже сказали, что sizeof'ом для определения размера массива можно только тогда, когда массив у тебя - статический.
Если ты работаешь с динамическими массивами, то:
  1. передавай размер массива как параметр функции;
  2. разработай классы для работы с матрицей, которые будут хранить могут хранить размер матриц
ИМХО, второй вариант лучше

PS. Могу поделиться своими классами, если надо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 17:25     Размер матрицы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2010, 17:25     Размер матрицы #20
Цитата Сообщение от andreyich Посмотреть сообщение
l=sizeof(a);
Цитата Сообщение от accept Посмотреть сообщение
получится sizeof(int *)
В Вашем случае sizeof(int**), что явно тоже не то, что требовалось...
Yandex
Объявления
24.08.2010, 17:25     Размер матрицы
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru