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

Как инициализировать динамическую матрицу? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.93
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
05.12.2011, 06:34     Как инициализировать динамическую матрицу? #1
2 вопроса.
2 подвопроса =).

1) Как инициализировать динамическую матрицу?
Желательно через new и delete, но можно и другое.
2) Как передавать эту матрицу в функцию?
а) Прототип функции.
б) Как обращаться к матрице внутри функции?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
06.12.2011, 04:32     Как инициализировать динамическую матрицу? #21
Цитата Сообщение от Bers Посмотреть сообщение
это разница между инициализацией и присвоением.
Но какая разница между инициализацией и выделением памяти - вот этого я.. не понимаю)
WIKI::
In computing, an uninitialized variable is a variable that is declared but is not set to a definite known value before it is used. It will have some value, but not a predictable one. As such it is a programming error and a common source of bugs in software.
Присвоение знячения и есть инициализация

Добавлено через 3 минуты
C++
1
2
int n; //создадим переменную она тут только объявлена. но не инициализирована
n = 4; *//это уже присвоение. и это и есть инициализация
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
06.12.2011, 04:35     Как инициализировать динамическую матрицу? #22
Цитата Сообщение от greeezz Посмотреть сообщение
int n; //создадим переменную она тут только объявлена. но не инициализирована
Думаешь, она не содержит значения?)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
06.12.2011, 04:35     Как инициализировать динамическую матрицу? #23
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
2
3
4
5
int n=0; //создадим переменную
            //она ещё при создании инициализируется нулём
n = 4; //это уже присвоение. 
          //То есть, переменная содержала ноль, а теперь
          //будит содержать 4
так точно.

Добавлено через 24 секунды
Цитата Сообщение от Bers Посмотреть сообщение
Думаешь, она не содержит значения?)
там мусор.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
06.12.2011, 04:36  [ТС]     Как инициализировать динамическую матрицу? #24
в общем тему лучше закрыть, ибо вместо того чтобы помочь, ребята решили поспорить о своих делах.
спасибо, в общем ответ дан.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.12.2011, 04:38     Как инициализировать динамическую матрицу? #25
отдельная функция выделяет память, а инициализация проходит в теле цикла for()
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
#include <stdio.h>
#include <stdlib.h>
 
int **init (size_t n, size_t m, size_t size)
{
    int **t;
    short i = 0;
 
    t = (char **)malloc(n * size);
    if ( !t )
        exit( -1 );
    else
    {
        while( i < n )
        {
            t[ i ] = malloc(m * size);
            if ( !t[ i ] )
                exit( -1 );
            ++i;
        }
    }
    return t;
}
 
int main( void )
{
    int n = 10, m = 10;
    int i = 0, j;
    int **matr;
 
    matr = init (n, m, sizeof(int));
 
    for ( i = 0 ; i < n; ++i )
    {
        puts("");
        for ( j = 0; j < m; ++j)
            {
                matr[ i ][ j ] = rand() % 2;
                printf("%i ", matr[ i ][ j ]);
            }
    }
    for(i = 0; i < n; ++i)
        free(matr[ i ]);
    free(matr);
 
    return 0;
}
Цитата Сообщение от Bers Посмотреть сообщение
//создадим переменную //она уже проиницилизирована. //Допустим, мусором.
нет, это область памяти, в которой есть информация. Инициализация - это заполнение своей, если угодно - нужной, первоначальной информацией этой области памяти.
Bers
Заблокирован
06.12.2011, 04:39     Как инициализировать динамическую матрицу? #26
Цитата Сообщение от greeezz Посмотреть сообщение
там мусор.
Ну во первых, далеко не факт, что там будит мусор. У глобальных интов например, при дефолтной инициализации будит нолик.

А во-вторых, абсолютно не важно чем именно инициализируется переменная.
важно, что:
C++
1
2
int n; //после выполнения инструкции 
         //уже будит проинициализирован.
а в этом моменте уже не инициализация, а присвоение:

C++
1
n=10;
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.12.2011, 04:43     Как инициализировать динамическую матрицу? #27
Bers, вы никогда не думали почему при форматировании дисков с другую ФС всегда можно полноценно восстановить информацию? потому что информация никуда не исчезает, исчезает структура ее предствления. Иногда можно и полностью воссоздать первоначальную структуру без потери информации на носителе. Это я к тому что захватив участок памяти машина ею просто владеет пока не будет получена инструкция уничтожить данные и метод только один - это поместить туда новые данные.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
06.12.2011, 04:44     Как инициализировать динамическую матрицу? #28
Цитата Сообщение от greeezz Посмотреть сообщение
Присвоение знячения и есть инициализация
Бред. Выкиньте это из головы.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.12.2011, 04:44     Как инициализировать динамическую матрицу? #29
C
1
int n
это захват участка памяти
C
1
n = 0
это его инициализация. Установка в исходное положение.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
06.12.2011, 04:46     Как инициализировать динамическую матрицу? #30
Chelioss,
Bers,
Керниган,Ритчи - Программирование на C.
глава 2.4.
Bers
Заблокирован
06.12.2011, 04:47     Как инициализировать динамическую матрицу? #31
Цитата Сообщение от alkagolik Посмотреть сообщение
нет, это область памяти, в которой есть информация. Инициализация - это заполнение своей, если угодно - нужной, первоначальной информацией этой области памяти.
Вот эта фраза сказанная в терминах на языке си.
Потому что в си, вы явно выделяете область памяти. И явно же её первоначально заполняете.

В с++ первоначальным заполнением области-памяти занимаются конструкторы.
И это называется "инициализация объекта".

А присвоение - тут уже запустится operator=
Это изменение значений области памяти, уже после того, как объект создан.

По этому, на с++ есть четкое разделение понятия инициализации, и понятия присвоения.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
06.12.2011, 04:47     Как инициализировать динамическую матрицу? #32
Цитата Сообщение от alkagolik Посмотреть сообщение
это его инициализация. Установка в исходное положение.
Простой пример, доказывающий обратное.
C++
1
2
 const int value; //  error
 value = 5;
Bers
Заблокирован
06.12.2011, 04:48     Как инициализировать динамическую матрицу? #33
а есть ещё более унифицированное понятие того, что есть инициализация.

Инициализация - есть захват ресурса.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
06.12.2011, 04:49     Как инициализировать динамическую матрицу? #34
Цитата Сообщение от greeezz Посмотреть сообщение
Керниган,Ритчи - Программирование на C.
Причем тут С?
Не знаю С, но в С++, как уже выше сказали, инициализация и присваивание разные вещи.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.12.2011, 04:56     Как инициализировать динамическую матрицу? #35
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
2
const int value; // error 
value = 5;
это пример как нельзя делать? Тогда я еще один добавлю для гармонии. Он даже скомпилируется
C
1
int const x;
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
06.12.2011, 04:59     Как инициализировать динамическую матрицу? #36
Я же сказал, причем тут С? Речь о С++ идет. Читай первое сообщение топика.
Или new и delete уже в С появился?

Добавлено через 38 секунд
Цитата Сообщение от alkagolik Посмотреть сообщение
это пример как нельзя делать?
Это пример, показывающий, что присваивание!=инициализации.
Bers
Заблокирован
06.12.2011, 04:59     Как инициализировать динамическую матрицу? #37
alkagolik, попытайтесь уловить разницу:

C++
1
2
int n;  //инициализация по дефолту
n=10; //присвоение уже инициализированной переменной
Я не захотел инициализировать переменную значением.
Меня вполне устраивает дефолтная инициализация. Переменная полностью построена, и готова к употреблению.

C++
1
2
int n(10);  //инициализация явным значением. 
//n=10; //теперь, делать присвоение уже не нужно.
причем, эта запись эквивалентна следующей:

C++
1
2
3
int n=10;  //инициализация явным значением. 
               //на самом деле здесь запускается
               // конструктор, а не оператор=
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
06.12.2011, 05:04     Как инициализировать динамическую матрицу? #38
Цитата Сообщение от Chelioss Посмотреть сообщение
Не знаю С, но в С++, как уже выше сказали, инициализация и присваивание разные вещи.
тогда читайте ТУТ
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
06.12.2011, 05:06     Как инициализировать динамическую матрицу? #39
Цитата Сообщение от Chelioss Посмотреть сообщение
Это пример, показывающий, что присваивание!=инициализации.
покажите где я сказал что эти понятия эквивалентны, или вообще что-то подобное.
Bers, да, согласен с вами, явно либо неявно все инициализируется при же выделении. Мы просто немного по разному трактуем само понятие. А вообще по моему это все суета.

Добавлено через 1 минуту
Цитата Сообщение от greeezz Посмотреть сообщение
тогда читайте ТУТ
а вот что именно надо прочитать. Чтобы долго не искать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// initialization of variables
 
#include <iostream>
using namespace std;
 
int main ()
{
  int a=5;               // initial value = 5
  int b(2);              // initial value = 2
  int result;            // initial value undetermined
 
  a = a + 3;
  result = a - b;
  cout << result;
 
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2011, 05:09     Как инициализировать динамическую матрицу?
Еще ссылки по теме:

C++ Как объявить указатель на массив через typedef и как инициализировать такой тип
C++ Как инициализировать массивы?
C++ Как добавить k столбцов в динамическую матрицу?

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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
06.12.2011, 05:09     Как инициализировать динамическую матрицу? #40
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
int main ()
{
* int a=5; * * * * * * * // initial value = 5 Запуск конструктора
* int b(2); * * * * * * *// initial value = 2 Запуск конструктора
* int result; * * * * * *// initial value undetermined Запуск конструктора
a = a + 3; // запуск operator=
* result = a - b; // запуск operator=
* cout << result;
return 0;
}
Yandex
Объявления
06.12.2011, 05:09     Как инициализировать динамическую матрицу?
Ответ Создать тему
Опции темы

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