Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2012, 16:58   #11
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Цитата:
mass передавался по значению.
О_о Как? Как указатель может передаватся по значению? Это зачет.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 26.10.2012, 17:09   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
О_о Как? Как указатель может передаватся по значению? Это зачет.
Я выразился ненаучно, конечно, но смысл в том, что изначальный код, не мог изменить значение mass, т.к. нужно передать указатель на двумерный массив, а не сам двумерный массив.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 26.10.2012, 18:48   #13
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Мда, учите матчасть. Использование не проинициализированного указателя - вот в чем проблема.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void GenMass(int m, int n, int a, int b, int **mas);
void OutMass(int m, int n, int **mas);

int main()
{
	int **mass=NULL;
	int m, n;

	system("chcp 1251 > nul");

	printf("\n Введите размер массива (M N): ");
	scanf("%d %d",&m, &n);

	printf("\n Генерация МАССИВА\n");
mas = (int **)malloc(m*sizeof(int));
	GenMass(m,n,-10,10,mass);
	OutMass(m,n,mass);

	return 0;
}

/* Функция генерации массива */
void GenMass(int m, int n, int a, int b, int **mas)
{
	int i, j;

	srand(time(NULL)*1000);
	
	if(mas == NULL)
		{
			printf("NO MEMORY!!!");
			exit(0);
		}
		for(i = 0; i < m; i++)
		{
			mas[i] = (int *)malloc(n*sizeof(int));
			if(mas[i] == NULL)
			{
				printf("NO MEMORY!!!");
				exit(0);
			}
			for(j = 0; j < n; j++)
				mas[i][j] = rand()%(b-a)+a;
		}
}

/* Функция вывода массива */
void OutMass(int m, int n, int **mas)
{
	int i, j;

	for(i = 0; i < m; i++)
	{
		for(j = 0; j < n; j++)
			printf("%3d", mas[i][j]);
			printf("\n");
			free(mas[i]);
	}
	free(mas);
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 26.10.2012, 20:06   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Мда, учите матчасть. Использование не проинициализированного указателя - вот в чем проблема.
Ну вот давайте не будем о матчасти (конечно же я не считаю, что знаю все, и теоретическая часть прихрамывает), но использование не проинициализированного указателя - это не проблема, т.к. задумывался аналог передачи var параметра в дельфи, например:
Код:
var
  b: integer;

procedure change(var a: integer);
begin
  a := 2;
end;

BEGIN
  b := 0;
  writeln(b);
  change(b);
  writeln(b);
END.
То есть в дельфи возможна передача как по значению, так и по указателю. В си только передача по значению, поэтому, чтобы имелась возможность изменения переданной переменной, ее нужно передавать не по значению, а указатель на нее.
Цитата:
...
В языке Си все аргументы передаются по значению (т.е. передаются только значения аргументов, и эти значения копируются в память функции).

Если аргументом является указатель, его значением является адрес объекта вызывающей функции, что обеспечивает вызываемой функции доступ к объекту.

Массив всегда передается с помощью указателя на его первый элемент.

Используя аргументы-указатели, функция может обращаться к объектам вызвавшей ее функции.

Использование указателей позволяет не дублировать массивы, передавая их функции: функции достаточно передать указатель на первый элемент массива.
...
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 26.10.2012 в 20:14.
BDA на форуме Ответить с цитированием
Старый 27.10.2012, 06:04   #15
s_t_c
АСУТП
Пользователь
 
Аватар для s_t_c
 
Регистрация: 29.07.2012
Сообщений: 19
По умолчанию

Приветствую всех. Помогите пожалуйста решить проблему с заменой строк в массиве.....
Вот мой код:
#include<iostream>
#include <conio.h>
#include <cstdio>
#include<cstdlib>

using namespace std;
void main()
{
setlocale(LC_ALL, "RUS");
const int N1=10,//Максимальное число строк
M1=10;//Максимальное число столбцов
float a[N1][M1];//Матрица
float max, min;//Минимальный элемент матрицы//Максимальный элемент матрицы
int i,//Текущий номер строки
j,//Текущий номер столбца
n,m;//Текущий размер матрицы
cout<<"Введите число строк и столбцов матрицы:\n";
cin>>n>>m;
cout<<"Введите элементы матрицы:\n";
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
cout<<"Исходный массив:\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<a[i][j]<<"\t";
cout<<"\n";
}
//Определяем минимальный и максимальный элементы матрицы и запоминаем индексы строк
max=a[0][0];
min=a[0][0];
int i1,i2;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
i1=i;
}

if(a[i][j]<min)
{
min=a[i][j];
i2=i;
}
}
cout<<"Максимальный элемент:"<<max<<"\n";
cout<<"Минимальный элемент:"<<min<<"\n";
//Теперь необходимо поменять местами строки с максимальным и минимальным
//элементами
float b;
for(j=0;j<n;j++)
{
b=a[i1][j];
a[i1][j]=a[i2][j];
a[i2][j]=b;
}
//Вывод обработанного массива
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<a[i][j]<<"\t";
cout<<"\n";
}


system("\npause");
getch();
}

=================================== ==============================

А вот что выходит на экране!

Введите число строк и столбцов матрицы:
2
2
Введите элементы матрицы:
1
2
3
4
Исходный массив:
1 2
3 4
Максимальный элемент:4
Минимальный элемент:1
1 2
-1.07374e+008 -1.07374e+008
Для продолжения нажмите любую клавишу . . .

=================================== ==============================

Не поменялись и к тому же вторая строчка потеряла первоначальный вид....
Подскажите как исправить, плиз...
Доводи начатое до конца прежде чем начать другое дело.....
s_t_c вне форума Ответить с цитированием
Старый 28.10.2012, 00:43   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Да что же это такое, уже не первое сообщение пропускаю
s_t_c, во-первых, положено создавать свою тему, а не "влезать" в чужую.
Во-вторых, используйте кнопочку # для оформления кода.
В-третьих, допишите int i1=0,i2=0;, по идее, все остальное правильно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 28.10.2012, 03:44   #17
s_t_c
АСУТП
Пользователь
 
Аватар для s_t_c
 
Регистрация: 29.07.2012
Сообщений: 19
По умолчанию

BDA, большое спасибо. Ваши замечания по поводу оформлений и создания темы учел.
Программка сработала.
Доводи начатое до конца прежде чем начать другое дело.....
s_t_c вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно написать программу для двумерного массива caught.let Паскаль, Turbo Pascal, PascalABC.NET 3 18.03.2012 11:28
Динамическая память, заполнение массива zink Общие вопросы C/C++ 4 18.02.2012 20:46
Динамическая память vladxxl Общие вопросы C/C++ 0 25.04.2011 20:04
динамическая память zhenya.ya Помощь студентам 2 24.02.2010 20:58
динамическая память в си Serjuk Помощь студентам 0 27.12.2009 13:54