Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как не потерять массив, созданный в функции, При завершении ее работы. 
:(
    Опции темы
C(++)-padavan
Дата 3.9.2005, 12:41 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

//...
void func (double  **);
//...
int main(void)
{
    double **ArrayPointer;
 //...
// где-то его инициализирую;
//...
    func(ArrayPointer);
// Теперь я хочу прочитать данные из массива *ArrayPtr
// Допустим, я выведу один из его элементов на экран
    printf("\n  *ArrayPointer[0] = %f ", **ArrayPointer );

    return 0;
}

void func (double  **ArrayPtr)
{
//...
   nt n;
//...
//где-то здесь получается заранее не известный размер массива n
//...
   *ArrayPtr = (double *) malloc (n*sizeof(double));
//...
// Далее этот массив заполняется, и,  например:
   *ArrayPtr[0] = 2.44;
   *ArrayPtr [1] = 345.67;
//...
}


И что же я вижу на экране?!
Цитата
*ArrayPointer[0] = -123785465435456.345873956000000000000...

Ну или что-то в этом роде.
А вовсе не 2.44 !
То есть, это, наверное, значит, что область памяти этого массива освобождена, и
все значения оттуда стерты ( судя по всему, такой массив считается локальным) .
Ну и как тогда с этим бороться? Как можно реализовать функцию, которая генерировала бы
массив заранее неизвестной длины, и позволяла бы пользоваться им и после завершения её работы? smile

Может быть, это и ламерский вопрос, но все же, ответьте пожалуйста, если не трудно.
  Вверх
chaos
Дата 3.9.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



ты наверное хотел сделать так
Код

func (double *array)
{
//...
    array = new double[n];
    array[0] = 2.44;
    array[1] = 345.67;
//...
}

main()
{
    double *array;
    func(array);
    printf ("%d\n", array[0]);
    delete[] array;
}


Это сообщение отредактировал(а) chaos - 3.9.2005, 12:51
PM WWW   Вверх
Mayk
Дата 3.9.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



func::double* array является локальной переменной для func(локальней некуда),
если она изменяется(а она ей богу изменяется когда вызывается =malloc/=new), то это изменение не затронет main::func.
Код

void makeArray(double** _arr)
{
   double* arr = new double[512];
   //что-то страшное
   arr[0]=2.44;
   *_arr=arr;
}
int main()
{
   double* arr;
   makeArray(&arr);
   printf("arr[0]=%f\n",arr[0]);
   delete[] arr;
}

зы. а вообще вектор рулез.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 3.9.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Так тоже пойдёт:
Код

#include <stdio.h>
void makeArray(double** _arr)
{
   *_arr = new double[512];
   //что-то страшное
   *_arr[0]=2.44;
}


Или так:
Код

#include <stdio.h>
void makeArray(double* &_arr)
{
   _arr = new double[512];
    //что-то страшное
   _arr[0]=2.44;
}
int main()
{
   double* arr;
   makeArray(arr);
   printf("arr[0]=%f\n",arr[0]);
   delete[] arr;
   return 0;
}

А вообще это нехороший стиль, менять значение аргументов в функции...


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
C(++)-padavan
Дата 3.9.2005, 13:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











to Mayk & sergej.z

Спасибо. Это, действительно, работает. Только, хоть убей, не пойму принципиальных отличий от моего варианта (кажется, будто на аппаратном уровне все происходит одинаково).
  Вверх
Yurec
Дата 7.9.2005, 18:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Или так :

Код


#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

using namespace std;

template<typename T> T* AppendItem(T* array, T item, int size)
{
      T* tmp = new T[size+1];
      if(tmp == NULL)
                return array;
      memcpy(tmp,array,sizeof(T)*size);
      tmp[size] = item;
      delete [] array;
      return tmp;
}

void main()
{
       srand(time(0));
       int size,item;
       cin >> size;
       int  * a = new int [size];
       for(int i=0;i<size;i++)
               a[i] = rand()%101;
      cin >> item;
      a = AppendItem(a,item,size); 
}

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.