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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
SLiTHER
3 / 3 / 0
Регистрация: 09.08.2010
Сообщений: 125
14.06.2013, 01:15     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #1
Проблема заключается в следующем: предположим есть некая структура, которая была определена внутри функции main. Далее я допустим хочу передать указатель на эту структуру в другую функцию, в которой ее поля будут заполнены. Загвоздка не в том, как написать такую функцию, а в том, как ее объявить. Какой тип данных я должен указать при объявлении заголовка функции?

C++
1
2
3
4
5
6
7
8
9
10
11
void main (void)
{
    struct myStruct     //есть условная структура
    {
        int a;
        float b;
        char c;
    }*p;   //и указатель на эту структуру
 
    //тут должен быть вызов функции, в которую передается указатель на эту структуру.
}
Как должен выглядеть прототип такой функции? В другой-то функции этот тип myStruct не определен.
C++
1
void NameFunc (myStruct *);       //но тогда компилятор ругаться начнет, что не знает такой структуры
Подскажите пожалуйста. Описание структуры должно в main быть. Когда она глобальная у меня проблем нет, а вот здесь есть.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2013, 01:15     Как передать в функцию указатель на структуру, если эта структура не определена глобально?
Посмотрите здесь:

Как передать указатель на функцию в функцию C++
C++ В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
C++ Как правильно передать в функцию указатель на двумерный массив?
Указатель на функцию (как передать?) C++
C++ Как передать указатель на структуру в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.06.2013, 01:44     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #2
Цитата Сообщение от SLiTHER Посмотреть сообщение
Описание структуры должно в main быть
почему?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.06.2013, 01:46     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #3
Цитата Сообщение от SLiTHER Посмотреть сообщение
Какой тип данных я должен указать при объявлении заголовка функции?
Т.к. структура локально объявлена, явно тип извне указать не получиться. Максимум, что могу предложить - использовать шаблон ф-ии, но это возможно только с компилятором, поддерживающим последний официальный стандарт языка (C++11):
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename F>
void f(F p) {
   // ...
}
 
int main() {
   struct myStruct {
      // ...
   } * p;
 
   f(p);
}
http://ideone.com/fWLtp4
SLiTHER
3 / 3 / 0
Регистрация: 09.08.2010
Сообщений: 125
14.06.2013, 01:48  [ТС]     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #4
Так написано в задании к лабораторной работе.
"Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается."
Вот сижу уже второй час и понять не могу, как передать вообще можно эту структуру.
...и можно ли вообще!
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.06.2013, 01:51     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #5
Цитата Сообщение от SLiTHER Посмотреть сообщение
Использование глобальных переменных
Об объявлениях типов ни слова.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
14.06.2013, 01:55     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #6
SLiTHER, когда мы объявляем структуру, мы не обязательно должны объявить глобальные переменные.
Вот пример программы на С со структурами, но без evil global variables.
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
59
60
61
62
63
64
65
/* объявляем структуру и создаем синоним, чтобы не писать каждый раз struct */
typedef struct 
{
    char name[SIZE];    /* название  */
    char country[SIZE]; /* страна    */
    int cost;           /* стоимость */
} Resort;
 
/* <<<------- объявляем прототипы функций для работы со структурой ------->>> */
void init(Resort *);         /* инициализация структуры  */
void print(const Resort *);  /* вывод структуры на экран */
                             /* считывание с файла структурной переменной */
void readFromFile(Resort *, FILE *);
 
/* <<<---- объявляем прототипы функций для работы с массивом структур ---->>> */
/* вывод всех структур на экран */
void printAll(const Resort *, const int size);
...
/* <<<<<<<------- реализация функций для работы со структурой -------->>>>>>> */
/* функция инициализации структуры. Принимает указатель на структурную
переменную. Запрашивает у пользователя информацию и заполняет поля структуры */
void init(Resort *r)
{
    system("cls"); /* очистка экрана */
    printf("Введите название курорта: "); /* информационное сообщение */
    scanf("%s", r->name);                 /* заполнение полей по указателю */
    printf("Введите страну: ");
    scanf("%s", r->country);
    printf("Введите стоимость: ");
    scanf("%d", &r->cost);
}
 
/* функция вывода полей структуры на экран. Принимает указатель на константную
(read-only) структурную переменную типа Resort. Выводит поля на экран */
void print(const Resort *r)
{
    printf("Название курорта: %s\n", r->name);                
    printf("Страна: %s\n",           r->country);
    printf("Стоимость: %d\n\n",      r->cost);
}
 
/* функция считывания структуры с файла. Принимает в качестве параметров
указатель на структурную переменную и указатель на файловую переменную.
Инициализирует поля структурной переменной данными из файла */
void readFromFile(Resort *r, FILE *fp)
{
    fscanf(fp, "%s", r->name);
    fscanf(fp, "%s", r->country);
    fscanf(fp, "%d", &r->cost);
}
 
 
/* <<<<<<----- реализация функций для работы с массивом структур ------>>>>>> */
/* функция вывода всех структур на экран. Принимает указатель на константный
(read-only) массив структурных переменных, его размер. */
void printAll(const Resort *arr, const int size)
{
    int i;                   /* параметр цикла */
    system("cls");           /* очистка экрана */
    for (i=0; i < size; i++) /* адрес каждого элемента массива */
        print(&arr[i]);      /* передаем в функцию print */
    
    printf("Назад");
    _getch();                /* пауза */
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2013, 02:10     Как передать в функцию указатель на структуру, если эта структура не определена глобально?
Еще ссылки по теме:

как в функцию передать указатель на матрицу C++
C++ Как передать указатель на функцию через метод класса ?
Структура и функция, возвращающая указатель на структуру C++

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

Или воспользуйтесь поиском по форуму:
SLiTHER
3 / 3 / 0
Регистрация: 09.08.2010
Сообщений: 125
14.06.2013, 02:10  [ТС]     Как передать в функцию указатель на структуру, если эта структура не определена глобально? #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Об объявлениях типов ни слова.
Хм, я почему-то подумал, что и к объявлениям структур это относится. Видимо заработался и пора отдохнуть до утра!

Добавлено через 1 минуту
Спасибо всем ответившим! Кликнул вам на плюс каждому!
Yandex
Объявления
14.06.2013, 02:10     Как передать в функцию указатель на структуру, если эта структура не определена глобально?
Ответ Создать тему
Опции темы

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