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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив как результат выполнения функции 
:(
    Опции темы
Astoret
Дата 16.4.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

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



При написании программы столкнулся с двумя вопросами на которые не смог найти ответ:
Как передать массив после выполнения функции? После поиска нашел ответ что нужно передавать указатель на первый элемент массива и количество элементов в массиве, но тут и возник вопрос: Предположим у нас есть указатель на первый элемент массива, тип данных и количество элементов но как после этого привести все это к привычному виду -  Out[20]


Код

#include <iostream>
#include <windows.h>
#include <math.h>

POINT* GetCord(int &step);

using namespace std;
void main()
{
POINT *cord;
int n,i=0;
n=20;
cord = GetCord(n);

//Как зная указатель cord и кол-во элементов n получить массив Out типа POINT?


    for(i=0;i<=n;i++)
    {
    cout << Out[i].x<<" - "<<Out[i].y<<endl; 
    }
}
POINT* GetCord(int &step)
    {
    POINT *Arr;
    Arr = new POINT[step];
    for(int i=0;i<=step;i++)
    {
    Arr[i].x = i*3;
    Arr[i].y = i; 
    }
    return Arr;
    }


PM MAIL WWW   Вверх
bsa
Дата 16.4.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Astoret, если ты пишешь на С++, то может стоит обратить внимание на std::vector? Его можно возвращать.

Как вариант (для Си), можно написать так:
Код
int myFunc(int *result_array, int array_size);
Т.е. функции передается указатель result_array на заранее подготовленный массив на array_size элементов. Она же возвращает некий результат, например, количество заполненных элементов, если их не больше array_size, или необходимый размер массива под хранение всех результатов.
Если размер массива постоянный, можно его передавать через структуру: 
Код
struct MyStruct { int data[10]; };
struct MyStruct myFunc();

PM   Вверх
Andrey44
Дата 16.4.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(Astoret @  16.4.2009,  15:14 Найти цитируемый пост)
POINT* GetCord(int &step)
    {
    POINT *Arr;
    Arr = new POINT[step];
    for(int i=0;i<=step;i++)
    {
    Arr[i].x = i*3;
    Arr[i].y = i; 
    }
    return Arr;
    }

Так делать нельзя, нельзя возвращать указатель на локальную переменную.
Код

void GetCord(POINT Arr[], int &step)
    {
    
    for(int i=0;i<=step;i++)
    {
    Arr[i].x = i*3;
    Arr[i].y = i; 
    }
   
    }



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Albor
Дата 16.4.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Andrey44 @  16.4.2009,  14:26 Найти цитируемый пост)
Так делать нельзя, нельзя возвращать указатель на локальную переменную.

В данном контексте разве нельзя? Память под массив после отработки функции не удаляется, а значение указателя копируется в другую переменную. По-моему криминала нет. Другое дело, что нужно заботиться об освобождении памяти тому кто "не знает" как она выделялась - это не красиво.
-------------------------------------------------------------------------------------------------------------------------------
Здесь память можно было выделить до вызова GetCoord, а в функции заполнить массив.


Это сообщение отредактировал(а) Albor - 16.4.2009, 15:47
PM MAIL ICQ   Вверх
Astoret
Дата 16.4.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

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



Цитата(Albor @ 16.4.2009,  15:39)
Цитата(Andrey44 @  16.4.2009,  14:26 Найти цитируемый пост)
Так делать нельзя, нельзя возвращать указатель на локальную переменную.

В данном контексте разве нельзя? Память под массив после отработки функции не удаляется, а значение указателя копируется в другую переменную. По-моему криминала нет. Другое дело, что нужно заботиться об освобождении памяти тому кто "не знает" как она выделялась - это не красиво.

Теперь я понял почему это сработало, я для пробы делал так:
Код

void main()
{
POINT *cord;
int n,i=0;
n=20;
cord = GetCord(n);

//Как зная указатель cord и кол-во элементов n получить массив Out типа POINT?
POINT temp = *(cord+2);
cout << "X="<<temp.x<<endl;

}


Это сообщение отредактировал(а) Astoret - 16.4.2009, 15:52
PM MAIL WWW   Вверх
Albor
Дата 16.4.2009, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Astoret @  16.4.2009,  14:52 Найти цитируемый пост)
Теперь я понял почему это сработало

Так сработало бы и так: POINT temp= cord[2];

PM MAIL ICQ   Вверх
NDQuattro
Дата 16.4.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не лучше будет передать ссылку?
омг, а компилер редкий, ф-ия main() типа void./
PM MAIL   Вверх
Dov
Дата 16.4.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Astoret @  16.4.2009,  15:14 Найти цитируемый пост)
//Как зная указатель cord и кол-во элементов n получить массив Out типа POINT?

Ты уже его получил, только не понял этого.  smile 
Вот же он:
Код
int  main()
{
    POINT  *cord;
    int        n, i = 0;

    n    = 20;
    cord = GetCord( n );

    //Как зная указатель cord и кол-во элементов n получить массив Out типа POINT?


    for( i = 0; i < n; i++ )
    {
        cout << cord[i].x << " - " << cord[i].y << endl;
    }

    delete [] cord;

    return 0;
}





--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Astoret
Дата 16.4.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2009

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



Цитата(Albor @ 16.4.2009,  15:56)
Цитата(Astoret @  16.4.2009,  14:52 Найти цитируемый пост)
Теперь я понял почему это сработало

Так сработало бы и так: POINT temp= cord[2];

точно, вышло так:
Код

#include <iostream>
#include <windows.h>

POINT* GetCord(int &step);
using namespace std;
void main()
{
POINT *Out;
int n,i=0;
n=20;
Out= GetCord(n);

    for(i=0;i<=n;i++)
    {
    cout << Out[i].x<<" - "<<Out[i].y<<endl; 
    }
}

POINT* GetCord(int &step)
    {
    POINT *Arr;
    Arr = new POINT[step];
    for(int i=0;i<=step;i++)
    {
    Arr[i].x = i*3;
    Arr[i].y = i; 
    }
    return Arr;
    }


to bsa,
попробовал, вышло:
Код

#include <iostream>
#include <windows.h>

void GetCord(int step, POINT *Arr);

using namespace std;
void main()
{
POINT *Out;
int n,i=0;
n=20;
Out = new POINT[n];
GetCord(n, Out);

for(i=0;i<=n;i++)
    {
    cout << Out[i].x<<" - "<<Out[i].y<<endl; 
    }
}
void GetCord(int step, POINT *Arr)
    {
    for(int i=0;i<=step;i++)
        {
        Arr[i].x = i*3;
        Arr[i].y = i; 
        }
    }


а векторы не хочется применять, у меня цель разобраться но учту на будущее.


З.Ы. Всем спасибо, похоже в этом немного разобрался

Это сообщение отредактировал(а) Astoret - 16.4.2009, 16:36
PM MAIL WWW   Вверх
mrbrooks
Дата 16.4.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(NDQuattro @  16.4.2009,  15:57 Найти цитируемый пост)
омг, а компилер редкий, ф-ия main() типа void

хм. ты думаешь?  
PM MAIL   Вверх
Dov
Дата 16.4.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Astoret @  16.4.2009,  16:30 Найти цитируемый пост)
Всем спасибо, похоже в этом немного разобрался


Astoret, у тебя ещё выход за границы массива есть в двух местах.  И память не забудь освободить.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Remiznik
Дата 16.4.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 30.4.2005

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



а у меня такой вопрос можно ли использовать что в качестве параметра в функцию передаётся ссылка на мосив в котом я хочу релучить результат ?

Код

void rasMassiv(int x,int y,int &result)
//какие то расчоты а результат записываеться в result 

  корректно ли такое использование или могут быть последствия ?
PM MAIL   Вверх
zim22
Дата 16.4.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 29
Всего: 69



Цитата(Remiznik @  16.4.2009,  17:39 Найти цитируемый пост)
корректно ли такое использование или могут быть последствия ?

записывайте. главное за пределы массива не выходите.

Добавлено через 56 секунд
Цитата(Remiznik @  16.4.2009,  17:39 Найти цитируемый пост)
 ссылка на мосив 

Код

void rasMassiv(int x,int y,int *&result)



--------------------
PM MAIL   Вверх
NDQuattro
Дата 16.4.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mrbrooks, думаю, но не уверен, может быть я слишком мало компиляторов испытал) 
PM MAIL   Вверх
Garcian
Дата 16.4.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

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



NDQuattro, у нас весь универ на  "редком компиляторе"  работает)
--------------------
Неродивый студент
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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