Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

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


Ответ
 
Опции темы
Старый 16.10.2013, 20:50   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,666
Вопрос Проблема с динамическим выделением памяти

Добрый день!
Даже не знаю как описать проблему....
Программа выполняет решение дифференциального уравнения методом Рунге-Кутта.
Проблема в динамическом выделении памяти. На сколько я могу судить неверно выделяется динамическая память... Скажу даже происходит выход за пределы массива x[i + 1]. Решение проблемы не по глазам... К тому же компилятор возмущается...
warning C4244: функция: преобразование 'double' в 'size_t', возможна потеря данных естественно в строке где выделяется память под массивы. Сможет кто-нибудь намякнуть, как разрешить проблему в коде..???

Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* ------- Прототипы функций ------- */
double myFunc(double, double);

int main()
{
	double  a = 0.0;	// Начальное значение
	double  b = 1.0;	// Конечное значение
	int		i;			// Счетчик
	double	n;
	double  h = 0.05;	// Шаг
	double	*x = NULL; 
	double	*y = NULL;
	double	k1, k2, k3, k4;
 
	n = (b - a) / h; // Количество шагов 
 
	x = (double*)malloc(n * sizeof(double)); // Выделение памяти под массив X
	y = (double*)malloc(n * sizeof(double)); // Выделение памяти под массив Y
	
	if(x == NULL || y == NULL)
	{
		printf("Error memory!!!");
		exit(1);
	}
 
	x[0] = a;
	y[0] = 0;
 
	for(i = 0; i <= n; i++)
	{
		k1 = myFunc(x[i], y[i]);
		k2 = myFunc(x[i] + h * 0.5, y[i] + (h * 0.5 * k1));
		k3 = myFunc(x[i] + h * 0.5, y[i] + (h * 0.5 * k2));
		k4 = myFunc(x[i] + h, y[i] + h * k3);
		x[i + 1] = x[i] + h;
		y[i + 1] = y[i] + (h / 6) * (k1 + (2 * k2) + (2 * k3) + k4);
	}
 
	for(i = 0; i <= n; i++)
		printf("x = %.3lf - y = %.3lf\n", x[i], y[i]);
	 
	free(x); // Освобождение памяти
	free(y);
	 
	return 0;
}

/* ------- Дифференциальное уравнение ------- */
double myFunc(double x, double y)
{
	return cos(7 * x + y) + 7 * (x - y);
}
/* ------------------------------------------ */
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 20:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

циклы то до n-1 нужно делать. Тем более присвоение в x[i + 1] и y[i + 1] есть, даже так будет выход за пределы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 21:00   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,666
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
циклы то до n-1 нужно делать. Тем более присвоение в x[i + 1] и y[i + 1] есть, даже так будет выход за пределы
Если посмотреть то конечно понятно, алгоритм который мне скинули противоречит... Может я чего-то не до понял... Глаз замылился..
http://www.simumath.net/library/book...f_Ur_method_RK
Может есть какой-нибудь вариант???
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 21:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

на вскидку сделайте 1-ый цикл до n-2, 2-ой до n-1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 21:22   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,666
По умолчанию

Как вариант.... Одной итерации не хватает для расчета x = 1.0. Что можно придумать.
Может увеличить объем выделяемой памяти...???
Например
Код:
x = (double*)malloc(n+1 * sizeof(double));
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 21:28   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Память для n+1 и оба цикла до n-1? Можно и так
Код:
x = (double*)malloc((n+1) * sizeof(double));
Не?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.10.2013 в 21:31.
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 21:36   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,666
По умолчанию

Работает, но что-то не то... Наверно слишком дотошный
Может сам алгоритм реализации неправильный...?
А что с предупреждением компилятора (пост №1)
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 21:41   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Цитата:
А что с предупреждением компилятора
Не скажу, код понимаю, но не мой язык. Алгоритмически похоже верно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2013, 21:43   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,666
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не скажу, код понимаю, но не мой язык
А по поводу алгоритма выполнения??? Может как-то по другому построить...?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.10.2013, 21:54   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

А что смущает? Разве что в лишней точке вычисления. Но она за пределами отрезка справа. А в алгоритме по ссылке описка, должно быть Yi+1=Yi + ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.10.2013 в 21:59.
Аватар вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с динамическим распределением памяти takeNmake Общие вопросы C/C++ 2 01.04.2013 16:06
Проблема с выделением памяти в глобальной области windows forms(C++\CLI) DartLenin Помощь студентам 2 24.01.2012 20:58
Массив динамических структур. Проблема с выделением памяти. Алексей Емеля Общие вопросы C/C++ 6 15.07.2011 19:24