powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Умножение матриц
25 сообщений из 62, страница 2 из 3
Умножение матриц
    #38662563
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Зачем обертки? Изначально double возращать :)
...
Рейтинг: 0 / 0
Умножение матриц
    #38662588
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ вообще странно зачем писать свой аналог atoi.
Тут даже не atoi нужен, а просто scanf и читать сразу в double.
...
Рейтинг: 0 / 0
Умножение матриц
    #38662679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskymaytonИ вообще странно зачем писать свой аналог atoi.
Тут даже не atoi нужен, а просто scanf и читать сразу в double.
Может лучше atof тогда?
...
Рейтинг: 0 / 0
Умножение матриц
    #38662705
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAnatoly MoskovskyТут даже не atoi нужен, а просто scanf и читать сразу в double.
Может лучше atof тогда?
Он там читает из stdin.
Незачем читать в строку, потом преобразовывать, когда можно сразу в число считать.
...
Рейтинг: 0 / 0
Умножение матриц
    #38662717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. ОК.
...
Рейтинг: 0 / 0
Умножение матриц
    #38663112
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо :)

Dima_T
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
int str2int(const char *buf)
{
	int res = 0;
	bool is_negative = false;
	while(buf) {
		if(*buf >= '0' && *buf <= '9') {
			res = res * 10 + *buf - '0';
		} else if(*buf == '-' && res == 0) {
			is_negative = true;
		} else if(*buf != ' ' || res != 0 || is_negative) {
			break;
		}
		buf++;
	}
	if(is_negative) {
		return -res;
	} else {
		return res;
	}
}



Всё-же мне кажется что лучше выделить отдельно проверку первого НЕпробела. Это будет быстрее, и код будет более читабельный. Но то что вы не сохраняете в отдельный буфер символы, очевидное преимущество. Я плохо подумал над алгоритмом. Немного переделал согласно вашему комментарию:
Код: plaintext
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.
//Данная функция аналогична get_number. Корректировки от Dima_T
double get_number2(void)
{
	double res = 0;

	int cur;
	while ((cur = getc(stdin)) != '\n')
	{
		if (cur != ' ')//пропускаю ведущие пробелы
		{
			char isNegative = 0;
			//работа с первым символом
			if (cur == '-')
			{
				isNegative = 1;
			}
			else if (cur >= '0' && cur <= '9')
			{
				res = cur - '0';
			}
			else
			{
				return 0; //выход из функции, возврат 0
			}

			//работа с остальными символами
			while ((cur = getc(stdin)) != '\n')
			{
				if (cur >= '0' && cur <= '9')
				{
					res = 10 * res + cur - '0';
				}
				else
				{
					break;//выход из while
				}
			}
			return (isNegative == 1) ? -res:res;
		}
	}
}



maytonИ вообще странно зачем писать свой аналог atoi.


я забыл про эту функцию, и мне было самому интересно реализовать :)
...
Рейтинг: 0 / 0
Умножение матриц
    #38663113
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С вводом покончено. Сейчас напишу отдельную функцию для произведения матриц, и например для вычисления детерминанта и обратной матрицы. А можно мне хранить все функции эти в структуре например ?
...
Рейтинг: 0 / 0
Умножение матриц
    #38663122
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю что с С++ есть классы, и скорее всего для этого они и нужны. А на Си как сгруппировать эти функции ?
...
Рейтинг: 0 / 0
Умножение матриц
    #38663123
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делал сейчас умножение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
double* matrix_multiplication(double* m1, int row1, int col1, double* m2, int row2, int col2)
{
	if (col1 != row2)
	{
		printf("col1!=row2 \n");
		return 0;
	}
	//double res[row1][col2];
}



Закомментированная строчка очевидно некорректна, тк неизвестно сколько памяти выделять. Какая сигнатура должна быть у данной функции в рамках языка С ?
...
Рейтинг: 0 / 0
Умножение матриц
    #38663128
Armagedon4uk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А мне так никто не помог. Печально :(
...
Рейтинг: 0 / 0
Умножение матриц
    #38663200
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Armagedon4uk, чем тебе должен помогать форум С++ ? В твоём коде есть ошибка.
С нашей точки зрения она видна как попытка прочитать числовое значение из пустой ячейки.
Почему ты лезешь в пустую ячейку - чёрт его знает. Наверное неправильный алгоритм.
...
Рейтинг: 0 / 0
Умножение матриц
    #38664009
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗакомментированная строчка очевидно некорректна, тк неизвестно сколько памяти выделять. Какая сигнатура должна быть у данной функции в рамках языка С ?
double *res = malloc( sizeof(double) * row1 * col1);
...
Рейтинг: 0 / 0
Умножение матриц
    #38664876
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Прочитал про неё в стандарте, разобрался в целом. Вот функция
Код: plaintext
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.
//Произведение двух матриц
double* matrix_multiplication(double* m1, int row1, int col1, double* m2, int row2, int col2)
{
	if (col1 != row2)
	{
		printf("row1!=col2 \n");
		return 0;
	}
	double* res = (double*)malloc(sizeof(double)*col1*row2); //выделяю память на хранение элментов матрицы произведения
	for (int i = 0; i < row1; i++)
	{
		for (int j = 0; j < col2; j++)
		{
			*(res + i*col2 + j) = 0;//зануляю перед использованием
			for (int s = 0; s < col1; s++)
			{
				*(res + i*col2 + j) += (*(m1 + i*col1 + s)) * (*(m2 + s*col2 + j));
			}
		}
	}
	printf("\n");
	//вывод матрицы на экран
	view_matrix(res, row1, col2);
	return res;
}



1. Функция void malloc(size_t size) возвращает void, и мне необходимо явное приведение к (double*). Вы в своём примере этого не сделали. Или дело в компиляторе ?
2. Обратите внимание, я делаю вывод на экран внутри функции. Понятно почему, я возвращаю только указатель на начало, нет размерности. Потому я пришёл к выводу: нужно создать структуру Матрица, и возвращать указатель на элемент данной структуры.Это верно ?
...
Рейтинг: 0 / 0
Умножение матриц
    #38664889
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3. При объявлении переменных/массивов(да и вообще любых операций связанных с выделением памяти) скорее всего так-же происходит неявный вызов malloc ?
...
Рейтинг: 0 / 0
Умножение матриц
    #38664890
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От объявления зависит.
...
Рейтинг: 0 / 0
Умножение матриц
    #38664894
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Функция void malloc(size_t size) возвращает void, и мне необходимо явное приведение к (double*). Вы в своём примере этого не сделали. Или дело в компиляторе ?
надо приводить
Код: plaintext
1.
double *res = (double *)malloc( sizeof(double) * row1 * col1);


и по окончании не забыть освободить память
Код: plaintext
1.
free(res);


SashaMercury2. Обратите внимание, я делаю вывод на экран внутри функции. Понятно почему, я возвращаю только указатель на начало, нет размерности. Потому я пришёл к выводу: нужно создать структуру Матрица, и возвращать указатель на элемент данной структуры.Это верно ?
Можно отдельно размерность вернуть, но удобнее структуру сделать
...
Рейтинг: 0 / 0
Умножение матриц
    #38665590
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury3. При объявлении переменных/массивов(да и вообще любых операций связанных с выделением памяти) скорее всего так-же происходит неявный вызов malloc ?Нет.
Объявление переменных идет либо на стеке (локальные) либо в сегменте данных (глобальные). А память выделяемая через malloc находится на куче.
Автоматически на куче ничего не выделяется. Хотя если ты сделаешь функцию типа твоей последней, запихнешь ее в какую-то библиотеку, то можно будет говорить "при вызове этой функции неявно вызывается malloc".
На самом деле есть много таких библиотечных функций, у них в документации всегда явно будет упомянуто что функция выделяет память которую потом надо будет вручную освободить.


Dima TSashaMercury1. Функция void malloc(size_t size) возвращает void, и мне необходимо явное приведение к (double*). Вы в своём примере этого не сделали. Или дело в компиляторе ?
надо приводить
Код: plaintext
1.
double *res = (double *)malloc( sizeof(double) * row1 * col1);


В С приводить не нужно. В С++ нужно.
Приведение void* в любой другой ссылочный тип в C идет автоматом (и обратно тоже).

Dima Tи по окончании не забыть освободить память
Код: plaintext
1.
free(res);

Это не обязательно, зависит от задачи.
...
Рейтинг: 0 / 0
Умножение матриц
    #38665799
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, вот оно в чём дело. То есть дело в языке.
Но если я освобожу память внутри функции, я не смогу по выходу из неё использовать значения полученные внутри функции. При завершении процесса программы вся запрошенная память освободится автоматически ?
Сегодня создам структуру, и перепишу всё что сделал ранее.
...
Рейтинг: 0 / 0
Умножение матриц
    #38665827
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПри завершении процесса программы вся запрошенная память освободится автоматически ?"А ты угадай" (ц) бандюган из х/ф "Бедная Саша".
...
Рейтинг: 0 / 0
Умножение матриц
    #38665832
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПри завершении процесса программы вся запрошенная память освободится автоматически ?
Зависит от платформы.
Есть платформы, на которых у всех процессов общая память. Там завершение процесса не всегда освобождает память.
К счастью вероятность встретиться с такими платформами стремится к нулю :)
...
Рейтинг: 0 / 0
Умножение матриц
    #38665846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНо если я освобожу память внутри функции, я не смогу по выходу из неё использовать значения полученные внутри функции.
Освобождать надо когда память уже не нужна, а где - без разницы. free() получает конкретный адрес, по которому была выделена память, а из какой переменной он взят - без разницы.
...
Рейтинг: 0 / 0
Умножение матриц
    #38666676
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 10.06.2014 02:40, SashaMercury wrote:

> Но если я освобожу память внутри функции, я не смогу по выходу из неё
> использовать значения полученные внутри функции.

Нет, конечно же нет.

При завершении процесса
> программы вся запрошенная память освободится автоматически ?

Как правило, да.

Но надеяться на это нельзя, и стандарты языков (ни С, ни С++) это не
гарантируют. Существуют операционные системы, где память по окончании
процесса не освобождается автоматически, яркий пример -- MS DOS и её
аналоги.



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Умножение матриц
    #38667055
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу хранить все элементы матрицы в структуре. Пытался так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct matrix
{
	unsigned char row;
	unsigned char column;
	double* s = (double*)malloc(sizeof(double)*row*column);
	double determinant;
};



Но судя по всему у меня ничего не получилось, проверил вот так:
Код: plaintext
1.
2.
3.
4.
5.
	matrix a;
	printf("%i %i \n \n", sizeof(a), sizeof(a.s));
	a.column = 3;
	a.row = 3;
	printf("%i %i \n \n", sizeof(a), sizeof(a.s));



Можно ли хранить в структуре матрицу так как я хочу?

Можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct matrix
{
	unsigned char row;
	unsigned char column;
	//double* s = (double*)malloc(sizeof(double)*row*column);
	double determinant;
	double mat[];
};



И хранить матрицу в mat. Только я не понял как мне выделить на mat память в размерер double*row*column.

Подскажите как решить данную проблему, если это возможно.
...
Рейтинг: 0 / 0
Умножение матриц
    #38671895
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Например (если С++), выделять память в конструкторе, параметрами которого будут нужные row и column.
...
Рейтинг: 0 / 0
Умножение матриц
    #38671930
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, в С++ стиле классикой жанра является определение класса Матрицы, перегрузка
четырех операций, операции '=' и конструктора копирования. Этим мучают студентов обычно
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Умножение матриц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]