Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.94
nikphil87
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 182
#1

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

09.10.2012, 22:00. Просмотров 7261. Ответов 9
Метки нет (Все метки)

Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже заполненные массивы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void func1()  //функия 1
{
typedef struct   //объявление структуры
{
float p;
double t;
}
Array;
 
Array* arr = new Array[n];  
for(int i=0;i<n;i++)   //заполнение массива
{
arr[i].p=i*0.1;
arr[i].f=i*2;
}
}
 
void func2(.....)  //??????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 22:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать указатель на структуру в функцию (C++):

Как передать в функцию указатель на структуру, если эта структура не определена глобально? - C++
Проблема заключается в следующем: предположим есть некая структура, которая была определена внутри функции main. Далее я допустим хочу...

Указатель на функцию (как передать?) - C++
void abc(int a, int b) { } void func(void *f(int, int)) { f; }

Как передать параметр типа "указатель на указатель" в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; #include &lt;iomanip&gt; using std::setiosflags; ...

Как передать указатель на структуру так, чтобы потом иметь возможность корректно удалить его? - C++
Есть класс в котором содержится указание на некоторую структуру данных. Этот указатель передается в другие классы. Однако, я делаю это...

Как передать указатель на функцию в функцию - C++
И как с ней работать?

Как передать указатель на файл в функцию? - C++
Здравствуй по ходу написания программы столкнулся с вопросом как передать указатель на тип файл в функцию. напишите код. ...

9
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.10.2012, 22:04 #2
C++
1
2
3
4
5
6
7
void func2(Array* ptr, int n)
{
//....
}
 
//вызов
func2(arr, n);
0
nikphil87
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 182
09.10.2012, 22:38  [ТС] #3
Не узнает указатель arr за пределами func1.

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
26
27
28
29
30
31
32
33
void func1()
{
int i;
typedef struct
        {
        float p;
        double t;
        }
        Array;
 
                Array* arr = new Array[n];
        for(i=0;i<n;i++)
        {
        arr[i].p=i*0.1;
        arr[i].t=i*2;
        }
    
}
void func2(Array* ptr,int n)
{
 
        f1=fopen("1.txt","w");
        for(int i=0;i<n;i++)
        {
        fprintf(f1,"p=%f t=%d\n",arr[i].p,arr[i].t);      //<--Undefined symbol "arr"
        }
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
func1();
func2(arr,n);                                                   //<--Undefined symbol "arr"
}
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.10.2012, 23:14 #4
Вынесите определение типа struct Array из функции.
0
nikphil87
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 182
09.10.2012, 23:18  [ТС] #5
выносил,тогда ругается при вызове функции также на arr.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2012, 00:29 #6
Цитата Сообщение от nikphil87 Посмотреть сообщение
Не узнает указатель arr за пределами func1.
Создайте массив в глобальной области и передавайте указатель на него в функции. Или возвращать из функции, где массив создаётся, указатель на него, и использовать этот указатель в других функциях.
0
nikphil87
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 182
13.10.2012, 22:55  [ТС] #7
Ну вот вроде все попробовал, но не работает. На операторе fprintf выдает ошибку "Access Violation" и в этом месте arr[i].p=NULL, то есть в эту функцию так ничего и не передалось.
Вот текст программы может кто подскажет где собака порылась. В файле один хранятся числа 1,2,3,4,5. Каждое с новой строки.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
int j,N;
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
FILE *f1,*f2,*f3;
 
typedef struct
        {
        int p;
        }
        Array;
Array *arr;
//--------------------------------------------------------------------------
void func1()
{
int i;
fprintf(f3,"j=%i\n",j);
for(i=0;i<=j;i++)
fscanf(f1,"%i",&N);                         //размер массива
          Array *arr = new Array[N];
for(i=0;i<N;i++)
fscanf(f1,"%i",&arr[i].p);                 //заполнение массива
}
 
void func2(Array *ptr,int N)
{
int i;
fprintf(f3,"j=%i\n",j);
for(i=0;i<N;i++)
fprintf(f3,"func2->%i\n",arr[i].p);      //вывод на печать, где и происходит остановка программы
 
}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
j=0;
f1 = fopen ("1.txt","r");
f3 = fopen("3.txt","a");
        while(j<3)
        {
        func1();
        func2(arr,N);
        j++;}
fclose(f1);
fclose(f3);
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.10.2012, 23:06 #8
Опять неправильно делаете. Вы в функции создаёте локальный указатель на массив, а глобальный остаётся не у дел. Если создали глобальный указатель, то не объявляйте указатель с тем же именем в функции, это будет уже другой указатель. Просто выделяйте память под глобальный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
Array *arr;
 
void func1()
{
int i;
fprintf(f3,"j=%i\n",j);
for(i=0;i<=j;i++)
fscanf(f1,"%i",&N);                         //размер массива
          arr = new Array[N]; //!!!
for(i=0;i<N;i++)
fscanf(f1,"%i",&arr[i].p);                 //заполнение массива
}
...
0
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2012, 11:55 #9
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
struct Array   //объявление структуры
{
    float p;
    double t;
};
 
void func2(Array *p, int n);
 
void func1()  //функия 1
{
    Array* arr = new Array[n];  
 
    for(int i = 0; i < n; i++)   //заполнение массива
    {
        arr[i].p = i * 0.1;
        arr[i].f = i * 2;
    }
    func2(arr, n);
    delete [] arr;
}
 
void func2(Array *p, int n)  //??????
{
    p[0].p *= 2;
}
0
nikphil87
0 / 0 / 0
Регистрация: 03.01.2010
Сообщений: 182
15.10.2012, 10:25  [ТС] #10
всем спасибо,разобрался!!
0
15.10.2012, 10:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 10:25
Привет! Вот еще темы с ответами:

Как в функцию передать указатель на матрицу? - C++
Че то я немного туплю, давно с функциями не работал, мне нужно реализовать функцию которая бы работала и изменяла элементы матрицы...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель - C++
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Как передать в функцию ссылку на структуру? - C++
Добрый вечер, помогите пожалуйста разобраться. Нужно чтобы функция myProc принимала не структуру, а ссылку на структуру.struct vs { long...

Как в конструкторе класса передать параметром указатель на функцию? - C++
Друзья! Вот тут всё понятно, есть класс, в котором приватная функция f_0, в конструкторе передаётся указатель на функцию f_1. Эта функция...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru