0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 21
1

Выделение памяти под динамический массив

01.03.2013, 00:07. Показов 1400. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужна помощь, кому не трудно откликнитесь. Нубас вообще в указателях и выделении памяти.

Алгоритм и работа правильная. Проблема только в выделении памяти и передачи переменных функциям, из-за пробела в указателях.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h> //scanf, printf
#include <conio.h> //getch
 
void matrix_assign (int n, int ***matrix);
void matrix_diplay (int n, int **matrix);
 
void main (){
    int n, i, j, max, **matrix;
//n-размерность, i и j для счётчиков, max для хранения макс. элемента
    n=EnterN();
    matrix=(int *)malloc(n*sizeof(int));
    matrix_assign(n, **matrix);
    matrix_diplay(n, matrix);
    max=matrix_check(n, matrix);
    //Вывод максимального элемента.                   
    printf("\nMAX element of this matrix is %d",max);               
    getch();
}
 
//Ввод N для определения размерности матрицы
int EnterN(){
int n;
    do
    {
    printf("BBEDUTE N\n N=");
    scanf("%d",&n);         
    } while (n>=12);
    return (n); 
}
 
//ввод элементов матрицы
void matrix_assign(int n, int ***matrix){
    int i, j;
    for (i=0; i<n; i++)
        for (j=0;j<n;j++)
        {
            printf ("BBEDUTE matrix[%d][%d]\n",i, j);
            scanf("%d",&matrix[i][j]);
        }
    
}
 
//Вывод матрицы на экран.
void matrix_diplay(int n, int **matrix){
    int i, j;
        for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)printf("[%2.1i] ",matrix[i][j]);
        printf("\n");
    }
    getch();    
}
 
//Проверка первой половины матрицы. Сверху вниз.
int matrix_check(int n, int **matrix){
    int max, i, j;
        for(i=0;i<(int)(n/2);i++)
        for (j=i;j<n-i;j++)
//Сравнение текущего [i][j] элемента с максимальным
            if (matrix[i][j]>max)max=matrix[i][j];
//Проверка оставшейся части матрицы.  
    for(;i<n;i++)
        for (j=n-i-1;j<=i;j++)
            if (matrix[i][j]>max) max=matrix[i][j]; 
    return (max);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2013, 00:07
Ответы с готовыми решениями:

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

Выделение памяти под динамический массив выдает ошибку
В общем проблема такова, при компиляции вылазит ошибка: 27 C:\Users\USER\Desktop\projects\main.c...

Выделение памяти под двумерный массив
Здравствуйте! скажите пожалуйста почему нельзя выделить под двумерный массив память через функцию....

Динамическое выделение памяти под массив
Здравствуйте, помогите пожалуйста сделать в процедуре input динамическое выделение памяти под...

3
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
01.03.2013, 06:46 2
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h> //scanf, printf
#include <stdlib.h>
#include <conio.h> //getch
 
int EnterN();
void matrix_assign(int, int**);
void matrix_diplay(int, int**);
int matrix_check(int, int**);
 
int main()
{
   int n, i, max, **matrix;
   //n-размерность, i и j для счётчиков, max для хранения макс. элемента
   n = EnterN();
   matrix = (int**) malloc(n * sizeof(int*));
   for (i = 0; i < n; ++i)
   {
      matrix[i] = (int*) malloc(n * sizeof(int));
   }
 
   matrix_assign(n, matrix);
   matrix_diplay(n, matrix);
   max = matrix_check(n, matrix);
   //Вывод максимального элемента.
   printf("\nMAX element of this matrix is %d", max);
   getch();
 
   return 0;
}
 
//Ввод N для определения размерности матрицы
int EnterN()
{
   int n;
   do
   {
      printf("BBEDUTE N\n N=");
      scanf("%d", &n);
   }
   while (n >= 12);
   return (n);
}
 
//ввод элементов матрицы
void matrix_assign(int n, int** matrix)
{
   int i, j;
   for (i = 0; i < n; i++)
      for (j = 0; j < n; j++)
      {
         printf("BBEDUTE matrix[%d][%d]\n", i, j);
         scanf("%d", &matrix[i][j]);
      }
 
}
 
//Вывод матрицы на экран.
void matrix_diplay(int n, int** matrix)
{
   int i, j;
   for (i = 0; i < n; i++)
   {
      for (j = 0; j < n; j++)
      {
         printf("[%2.1i] ", matrix[i][j]);
      }
      printf("\n");
   }
   getch();
}
 
//Проверка первой половины матрицы. Сверху вниз.
int matrix_check(int n, int** matrix)
{
   int max = 0, i, j;
   for (i = 0; i < (int)(n / 2); i++)
      for (j = i; j < n - i; j++)
         //Сравнение текущего [i][j] элемента с максимальным
         if (matrix[i][j] > max)
         {
            max = matrix[i][j];
         }
   //Проверка оставшейся части матрицы.
   for (; i < n; i++)
      for (j = n - i - 1; j <= i; j++)
         if (matrix[i][j] > max)
         {
            max = matrix[i][j];
         }
   return (max);
}
Выделение памяти под динамический массив


Исходник + бинарник: program.7z
1
0 / 0 / 0
Регистрация: 16.06.2010
Сообщений: 21
01.03.2013, 20:40  [ТС] 3
anmartex,

спасибо большое. Я исправил сам и работает. Если можно, то у меня есть вопросы.
1. Зачем использовать двойной указатель? Я всюду использовал один указатель и только на матрицу.
2. Как работают (int**), (int*) и (int)? В чем разница?
3. Как правильно определить нужный объем памяти? Я, например выделил (n*n+1)

Спасибо.
0
...
1906 / 1326 / 965
Регистрация: 12.02.2013
Сообщений: 2,172
04.03.2013, 07:50 4
Извините за столь долгое молчание, дела.

Цитата Сообщение от BuBlicK.SQP Посмотреть сообщение
1. Зачем использовать двойной указатель? Я всюду использовал один указатель и только на матрицу.
2. Как работают (int**), (int*) и (int)? В чем разница?
3. Как правильно определить нужный объем памяти? Я, например выделил (n*n+1)
Начнём пожалуй вообще с понятия указатель. Вы, я полагаю, уже поняли, что это такая же переменная, только в себе хранит адрес участка памяти. Т.е. выглядит это примерно так:
Название: pointer01.png
Просмотров: 173

Размер: 15.5 Кб
Основной особенность такой переменной является применение к ней разадресации, т.е. когда вы пишите *b, происходит переход по адресу хранимого в переменной b. Для простых переменных разадресация не применима. И т.к. указатель хранит всего-лишь адрес, то он применим как к конкретной переменной, так и к вектору (массиву) значений. Т.е. вы можете получить значение так *b, и так b[0] (по сути компилятор преобразует эту запись в *(b+0)). Соответственно ваш массив представляется следующим образом:
Выделение памяти под динамический массив

Как видите, такой массив - это указатель на список указателей векторов. Поэтому и выделение памяти было хитрым:
  1. Выделяем память под массив указателей matrix = (int**) malloc(n * sizeof(int*));
  2. А теперь выделяем память под каждый вектор в цикле matrix[i] = (int*) malloc(n * sizeof(int));.
Я думаю все что изложено выше вам даст ответы на ваши вопросы.

P.S.: вообще-то это всё рассматривается практически в любой книге по C/C++.
0
04.03.2013, 07:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.03.2013, 07:50
Помогаю со студенческими работами здесь

Выделение памяти под трехмерный массив
Здравствуйте. Выделяю память под трехмерный массив, но не получается обратиться к элементу...

Динамическое выделение памяти под массив
Доброго времени! Требуется ввести размер массива с клав-ры, заполнить массив - изменить его размер...

Выделение памяти динамически под массив
Есть программа, нужно выделить динамически память под массив, все попытки сделать это...

Выделение памяти под одномерный массив
int main() { int *a; a = new int; for (int i = 0;i &lt; 10;i++) { a = rand() % 100; cout...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru