Форум программистов, компьютерный форум CyberForum.ru

Как в функции создать два массива и передать их в другую функцию - C++

Восстановить пароль Регистрация
 
Maxak
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 47
07.08.2013, 15:26     Как в функции создать два массива и передать их в другую функцию #1
Как в функции создать два массива и передать их в другую функцию, например в main()?
Так хорошо делать?
Кликните здесь для просмотра всего текста

C++
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 * Func(double *B, .....)
{
 int N= Func2();
   double *A = New double[N];
   B = New double [N];
   for(int i =0; i<N;i++)
{
A[i] = Func3(...);
B[i] = Func4(...);
 
}
 
   return A;
 
}
int main()
{
 
double *B;
double *A=Func(B);
//и задесь могу как угодно извращаться над массивами A, B? а в конце не забуду написать:
delete[] A;
delete[] B;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 15:26     Как в функции создать два массива и передать их в другую функцию
Посмотрите здесь:

C++ Можно ли в качестве параметра функции передать другую функцию?
как переменную из одной функции передать в другую? C++
Как передать массив из одной функции в другую C++
Как передать значение переменной из одной функции в другую функцию C++
как передать значение функции класса в другую функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
07.08.2013, 15:45     Как в функции создать два массива и передать их в другую функцию #2
Цитата Сообщение от Maxak Посмотреть сообщение
//и задесь могу как угодно извращаться над массивами A, B? а в конце не забуду написать:
И будет самодельное горе.
Но никто к этому не принуждает. Вы можете выяснять размеры и выделять память в той области определения, где и удаляете, а инициализировать и обрабатывать где угодно. Или не забывать. Для этого функцию возвращающие указатель на динамический массив можно снабдить сигнатурой с "антисклеротическим" именем вроде:
C++
1
2
3
4
5
6
 int *fn_ret_ptr_by_NEW_arr(int &szArr);
//или
void fn_ret_ptr_by_NEW_arr(int *arr, int &szArr);
//что менее наглядно в месте вызова и не отражает явно инициализации указателя, 
//то есть хуже, но это вопрос памяти
//(размер тоже надо вернуть, по ссылке например))
Maxak
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 47
07.08.2013, 16:25  [ТС]     Как в функции создать два массива и передать их в другую функцию #3
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы можете выяснять размеры и выделять память в той области определения, где и удаляете, а инициализировать и обрабатывать где угодно.
Что бы выяснить размеры, потребуется отдельная функция.
Кстати по поводу инициализации. В процессе выполнения выскакивает такая ошибка Run-Time Check Failure #3 - The variable 'A' is being used without being initialized.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Func(double * A)
{
A = new double[2];
A[0] =1; A[1]=2;
return 2;
}
int main()
{
double *A;
int jjj=Func(A);
 
return 0
}
Получается, так как я писал выше делать нельзя. Как же тогда быть? (допустим размер массива A может быть определен только внутри Func())
Т.е. до вызыва функции мне нужно чем то инициализировать A?
ching0n
 Аватар для ching0n
3 / 3 / 1
Регистрация: 06.08.2013
Сообщений: 23
07.08.2013, 18:46     Как в функции создать два массива и передать их в другую функцию #4
Maxak, можно проще сделать. Объявить два глобальных массива, а функцию "Func" сделать пустышкой (void). Внутри этой функции вы будете изменять значение двух глобальных массивов. А уже в самой программе (функции main) ссылаться на те два глобальных массива. То бишь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int a[3], b[5];
 
void func(double a)
{
    ...
    a[0] = ... ; b[0] = ... ; a[1] = ... и т.д.
}
int main()
{
    ...
    func();
    // и пользоваться этими двумя массивами a и b
}
coloc
07.08.2013, 18:50
  #5

Не по теме:

ching0n, можно сразу на Brainfuck-е кодить...

IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
07.08.2013, 22:28     Как в функции создать два массива и передать их в другую функцию #6
Цитата Сообщение от Maxak Посмотреть сообщение
допустим размер массива A может быть определен только внутри Func()
Ну и пусть вернёт размер. Указатель ей не передавайте и не создавайте там массив и всё.
Что касается динамических массивов, то их инициализация при выделении памяти невозможна. Одиночную переменную можно инициализировать при выделении. Массив же вы должны заполнять присваиванием, после выделения памяти. То есть инициализируется динамический массив мусором и это нормально. О чем толкует Ваш компилятор не понял. Дайте код с нумерацией и полное сообщение об ошибке.
Ага, - вот:
Цитата Сообщение от Maxak Посмотреть сообщение
такая ошибка Run-Time Check Failure #3 - The variable 'A' is being used without being initialized.
Перед передачей указателя в функцию нулём его инициализируйте.
Maxak
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 47
08.08.2013, 10:06  [ТС]     Как в функции создать два массива и передать их в другую функцию #7
Цитата Сообщение от ching0n Посмотреть сообщение
Maxak, можно проще сделать. Объявить два глобальных массива, а функцию "Func" сделать пустышкой (void). Внутри этой функции вы будете изменять значение двух глобальных массивов. А уже в самой программе (функции main) ссылаться на те два глобальных массива. То бишь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int a[3], b[5];
 
void func(double a)
{
    ...
    a[0] = ... ; b[0] = ... ; a[1] = ... и т.д.
}
int main()
{
    ...
    func();
    // и пользоваться этими двумя массивами a и b
}
Та все дело в том, что я не знаю размеров массивов, я их могу узнать только внутри func()/....
Maxak
0 / 0 / 0
Регистрация: 27.12.2012
Сообщений: 47
08.08.2013, 10:24  [ТС]     Как в функции создать два массива и передать их в другую функцию #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
О чем толкует Ваш компилятор не понял.
кстати ошибка вылетает не на этапе компиляции, а при выполнении программы.Попробуйте, пожалуйста у себя запустить этот код, мне кажется дело может быть действительно в компиляторе.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
int Func(double * A)
{
    A = new double[2];
    A[0] =1; A[1]=2;
return 2;
}
 
int main()
{
    double *AA;
    int jjj=Func(AA);
    cout<<" A[] = " << AA[0]<<" ; "<< AA[1];
    delete [] AA;
 
 
    char quit;
    cin>>quit;
    return 0;
}


кстати
C++
1
double *AA = 0;
такой вариант ничего хорошего не дает.
Ошибка вида:
Код
Unhandled exception at 0x00f4f82c in Matrix_test.exe: 0xC0000005: Access violation reading location 0x00000008.
Ну оно и понятно, не можем же мы в произвольный адрес памяти писать, как я понимаю?

C++
1
double xx= 0; double *AA = &x;
а такой когд выдает ассерт, и в массив AA ничего хорошего не записывается.
Миниатюры
Как в функции создать два массива и передать их в другую функцию  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2013, 12:28     Как в функции создать два массива и передать их в другую функцию
Еще ссылки по теме:

C++ Как передать массив из одной функции в другую?
C++ Как передать значение из одной функции в другую?
Передать значение из одной функции в другую функцию в связном списке C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6171 / 2900 / 284
Регистрация: 04.12.2011
Сообщений: 7,712
Записей в блоге: 3
08.08.2013, 12:28     Как в функции создать два массива и передать их в другую функцию #9
Maxak, да, если указатель не указывает на выделенную память, а используется для выделения, то нужно его передать по указателю:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include <iostream>
using namespace std;
 int Func(int ** A)
{
    *A = new int[2];
    (*A)[0] =1; (*A)[1]=2;
return 2;
}
 
int main()
{
    int *AA=0;
    int jjj=Func(&AA);
    cout<<" A[] = " << AA[0]<<" ; "<< AA[1];
    delete [] AA;
     cout<<endl;
    cin.get();
    return 0;
}
Но гораздо лучше сначала получить размер, а потом выделить и инициализировать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int FuncRetSize(/* всё что ей нужно */)
{
 //как то выяснятся что 2 например   
return 2;
}
void FuncFillArr(double *AA, int n)
{
    for( int i = 0 ; i < n ;  ++i ) AA [i]  = i + 1;
return ;
} 
int main()
{
     int jjj=FuncRetSize();
    double *AA = new double[jjj];//
FuncFillArr(AA, jjj);
    cout<<" A[] = " << AA[0]<<" ; "<< AA[1];
    delete [] AA;//
     cout<<endl;
    cin.get();
    return 0;
}
тогда просто указатель можно.
Yandex
Объявления
08.08.2013, 12:28     Как в функции создать два массива и передать их в другую функцию
Ответ Создать тему
Опции темы

Текущее время: 09:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru