Другие языки программирования и технологии

Почему нельзя использовать глобальные переменные?

Вот если надо передать массив или матрицу в функцию.
...

int f1(int a[][], int N, int M);//Тогда расход памяти увеличивается вдове.

// А вдруг нам надо получить значение в a[i][j] или вернуть -1 если a[i][j] находится вне матрицы M*N?

int f2((int a[][], int i, int j, int N, int M);//потребление памяти увеличивается уже в 3 раза!

//А вдруг у нас есть еще аналогичные f3, f4, f5, f6?

int main()

{

....

int a[N] [M];

int b;

b=f1(a[N][M], N, M);

....

}

//но ведь можно сделать так

int **a;

int f1(int **a, int N, int M);
int f2((int **a, int i, int j, int N, int M);


{
....
//Создаем матрицу N*M через malloc;
int b;
b=f1(a, N, M);
....
}
Потому что стили программирования оптимизируются по приниципу "у Вас программа может быть миллион строк, нужно писать ее так, чтоб было легко разобраться"
Олег Уваров
Олег Уваров
19 662
Лучший ответ
А откуда ты взял "int f1(int a[][], int N, int M);//Тогда расход памяти увеличивается вдОВе. "?
Память под массив резервируется только там, где он объявлен. В функцию передается адрес начала массива и его тип. Никакого "лишнего" расхода памяти нет!
Arman Nurshimov
Arman Nurshimov
78 139
Ты напутал совершенно разные вещи. Все твои функции во всех случаях будут занимать одинаково памяти, потому что в C++ имя массива почти всегда (кроме sizeof) преобразуется в указатель на его нулевой элемент: arr == &arr[0]. Зато если сделать
struct A { int array[100];};

int func(A a);

то здесь действительно будет происходить выделение памяти и копирование структуры. Но этого можно избежать, передавая указатель (C/C++):

int func(A *a);


или ссылку (только C++):

int func(A &a);

А глобальные переменные не используют из-за побочных эфектов. Приведу пример из жизни: мне попадалась производственная программа, где все преобразования строк во всех функциях были вынесены в глобальный буфер char BUFFER[1024] (да, вот такой талантливый программист писал) . Ну так вот, в некоторых функциях этот буфер перед работой очищался, а в некоторых - нет, и понять по коду, что именно за чем выполнялось было практически невозможно: если в одной функции к буферу дописывалась строка с именем пользователя, то чтобы что-то в этой функции поменять, надо было проверить все ее вызовы и оценить, что находилось в буфере на тот момент. Представил объем работы?
1) глобальные переменные использовать можно, но лишь в крайнем случае, если без них не обойтись
2) память уже на байтами меряется, что надо экономить, сейчас упор - на читаемость и отладку
можно, в некоторых случаях даже предпочтительнее.
Игорь Иванов
Игорь Иванов
7 591
почитайте что такое область видимости и указатели. Решение кроется там