![]() |
|
|
![]()
|
|
| фигурист |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Возник вот какой вопрос:
В программе вычисляется массив Length. float K1 =0.1; float *s=NULL; float Length_max = 0; /*Вызываем бибилиотеку Traektory1_DLL*/ s=Return_massive(); Length[0]=ceil(s[0]/K1); Length[1]=ceil(s[1]/K1); Length[2]=ceil(s[2]/K1); Length[3]=ceil(s[3]/K1); Length[4]=ceil(s[4]/K1); Length[5]=ceil(s[5]/K1); Length[6]=ceil (s[6]/K1); Length_max=ceil (s[7]/K1); Библиотека Traektory1_DLL float *Return_massive(void) { float *a=NULL; float d[9]; d[0]=6.20; d[1]=37.60; d[2]=76.00; d[3]=553.60; d[4]=4.00; d[5]=4.00; d[6]=17.00; d[7]=553.60; d[8]=7; a=d; return a; } Если вычислять так, то программа правильно вычисляет только 4 значения, остальные элементы массива принимают произвольное значение. Установил, что дело в функции ceil(x). Если делать так Length[0]=(s[0]/K1)+1; то программа правильно вычисляет 7 значений. Тот же эффект при использовании floor, ceill, floorl Может кто-нибудь объяснит, в чем дело, у меня самому не получается разобраться. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
||||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
Ты пытаешься вернуть указатель на локальную переменную. В пределах функции массива d не существует. Используй malloc / free или директиву static. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
float *d;
float *Return_massive(void) { d = new float[9]; d[0]=6.20; d[1]=37.60; d[2]=76.00; d[3]=553.60; d[4]=4.00; d[5]=4.00; d[6]=17.00; d[7]=553.60; d[8]=7; return d; } Это сообщение отредактировал(а) SVN74 - 28.10.2008, 00:22 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
в функции создается массив, указатель на который она возвращает, поэтому использовать глобальную переменную себе во вред, также название (желательно) должно отражать, что внутри происходит создание объекта, и надо не забыть удалить его(массив), когда он станет ненужным. Это сообщение отредактировал(а) mes - 27.10.2008, 21:29 |
|||
|
||||
| 586 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
Код не поддерживает многопоточность, из-за общей переменной. Следует объявить указатель d локально:
|
||||
|
|||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
(Утечка памяти) А как же очистка памяти? Тогда для данной модели надо передавать указатель не через return. Вопрос о многопоточности не стоял. В данном случае... На мой взгляд надо применять глобальный указатель с последующей очисткой, либо возвращать не через return с последующей очисткой внутри функции, иначе хоть указатель и локальный, память не освобождается... Это сообщение отредактировал(а) SVN74 - 27.10.2008, 22:08 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 6 Всего: 250 |
||||
|
||||
| фигурист |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 1.10.2008 Репутация: нет Всего: нет |
Большое спасибо всем ответившим
Я тут новичок поэтому Ваши ответы очень пригодятся для дальнейшего изучения СИ++ Попробую пределать прогу. Спасибо Добавлено через 13 минут и 49 секунд Работает, урра. |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 11 Всего: 18 |
Вот накидал один из (рабочих, без утечки памяти) способов обмена данными между динамическими массивами...
================================================================================= void __fastcall TForm1::Proba(float *c[]) { int M = 8; float *g = new float[M]; g[0]=14.63; g[1]=73.8; g[2]=35.66; g[3]=755.85; g[4]=33.6; g[5]=732.53; g[6]=332.64; g[7]=73.83; memcpy(&(*c[0]),g,sizeof(g)*M); delete [] g; } //--------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int M =8; float *R = new float[M]; for(int y=0;y<M;y++) { Proba(&R); Memo1->Lines->Add(FloatToStr(R[y])); } delete [] R; } |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |