1 / 1 / 0
Регистрация: 04.04.2015
Сообщений: 23
1

Передача члена структуры в функцию

04.04.2015, 23:31. Показов 2099. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача такова. Есть массив структурного типа, нужно передать конкретное поле(член) этой структуры в функцию, причем, получается, нужно передать массив полей из структуры, как при этом оформить список формальных параметров при объявлении функции, и как к этим полям обращаться при вызове функции в программе? Нигде не могу найти. Буду оч признателен, если поясните или дадите линк на тутор. Четно, гуглил, ничего кроме
C
1
2
struct offt
{char d;}; funk(off.d);
не нашел.
Под спойлером программа которая работает в обход этой задачи. Писана в DevC++
Кликните здесь для просмотра всего текста

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
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<stdio.h>
#include<math.h>
#include<conio.h>
    struct DATA
    {
        char rp[20];
        float x;
        float y;
    };
void entering(char *name, struct DATA *dat, FILE *F1, int &n);
void midl(struct DATA *dat, int n, float &sr_x, char c);//ñðåäíåå çíà÷åíèå âõîäíûõ äàííûõ
void disp(struct DATA *dat, int n, float sr_x, float &disp_x, char c);
main()
{   int n=0,/*êîëè÷åñòâî çàïèñåé*/b,a;
    char name[10]/*èìÿ ôàéëà*/;
    float sr_x=0, sr_y=0, disp_x=0, disp_y=0;
    DATA dat[100];
    FILE *F1;
    setlocale(0,"");
    puts("Ââåñòè èìÿ ôàéëà");
    gets(name);
    puts("Èìÿ ôàéëà:");
    puts(name);
    if (fopen("Data.txt","r+")==NULL)
    {puts("Îòêðûòü ôàéë íå óäàëîñü. Çàêðûòèå ïðîãðàììû."); 
    getchar(); 
    return 0;}
    else {puts("Îòêðûòèå óñïåøíî çàâåðøåíî"); 
    F1=fopen("Data.txt","r+");}
    entering(name, dat, F1,n);
    midl(dat.x, n, sr_x,'x');
    midl(dat.y, n, sr_y,'y');
    disp(dat, n, sr_x, disp_x,'x');
    disp(dat, n, sr_y, disp_y,'y');
    fclose(F1);
    fflush (stdin);
    getchar();
    return(0);
}
void entering(char *name, struct DATA *dat, FILE *F1, int &n)
{
    printf("_______________________________________________\n");
    printf("|      Ðàéïî     |   Çàòðàòû    | Çàòð. íà ðóá|\n");
    printf("|________________|______________|_____________|\n");
    while(!feof(F1))
    {
    fscanf(F1,"%s%f%f",&dat[n].rp, &dat[n].x, &dat[n].y);
    printf("|%s\t |\t%.2f\t|\t%.2f|\n",dat[n].rp, dat[n].x, dat[n].y);
    n++;
    }
    printf("_______________________________________________\n");
    printf("Êîëëè÷åñòâî çàïèñåé â ôàéëå: %d\n",n);
    fflush (stdin);
}
void midl(struct DATA *dat, int n, float &sr_x, char c)
{
    int i=0;
    do
    {
    sr_x=sr_x+dat[i].x;
    i++;    
    }
    while(i<n);
    sr_x=sr_x/n;    
    printf("i %d",i);
    printf("Ñðåäíèå âûïîëíåíèå ïî %c:%.1f\n",c,sr_x);
}
void disp (struct DATA *dat, int n, float sr_x, float &disp_x, char c)
{
    int i=0;
    while(i<n)
    {
     disp_x=disp_x+pow((dat[i].x-sr_x),2);
     i++;
    }
    disp_x=disp_x/(n-1);
    printf("Äèñïåðñèÿ ïî %c:%.1f\n",c,disp_x);
}

А я хочу, чтобы она работала как-то так. Тоесть в качестве параметра принимала конкретное поле структуры.
Листинг под спойлером.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include<stdio.h>
#include<math.h>
#include<conio.h>
    struct DATA
    {
        char rp[20];
        float x;
        float y;
    };
void entering(char *name, struct DATA *dat, FILE *F1, int &n);
void midl(struct DATA *dat, int n, float &sr_x, float &sr_y);//среднее значение входных данных
main()
{   int n=0,/*количество записей*/b,a;
    char name[10]/*имя файла*/;
    float sr_x=0, sr_y=0, disp_x=0, disp_y=0;
    DATA dat[100];
    FILE *F1;
    setlocale(0,"");
    puts("Ввести имя файла");
    gets(name);
    puts("Имя файла:");
    puts(name);
    if (fopen("Data.txt","r+")==NULL)
    {puts("Открыть файл не удалось. Закрытие программы."); 
    getchar(); 
    return 0;}
    else {puts("Открытие успешно завершено"); 
    F1=fopen("Data.txt","r+");}
    entering(name, dat, F1,n);
    midl(dat, n, sr_x, sr_y);
    fclose(F1);
    fflush (stdin);
    getchar();
    return(0);
}
void entering(char *name, struct DATA *dat, FILE *F1, int &n)
{
    printf("_______________________________________________\n");
    printf("|      Райпо     |   Затраты    | Затр. на руб|\n");
    printf("|________________|______________|_____________|\n");
    while(!feof(F1))
    {
    fscanf(F1,"%s%f%f",&dat[n].rp, &dat[n].x, &dat[n].y);
    printf("|%s\t |\t%.2f\t|\t%.2f|\n",dat[n].rp, dat[n].x, dat[n].y);
    n++;
    }
    printf("_______________________________________________\n");
    printf("Колличество записей в файле: %d\n",n);
    fflush (stdin);
}
void midl(struct DATA *dat.x, int n, float &sr_x)
{
    int i=0;
    do
    {
    sr_x=sr_x+dat[i].x; 
    i++;
    }
    while(i<n);
    sr_x=sr_x/n;    
    printf("Средние выполнение плана по кондитерским изделиям:%.1f\nСреднее выполнение плана по затратам на 1 руб:%.1f\n",sr_x,sr_y);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2015, 23:31
Ответы с готовыми решениями:

Передача структуры в функцию
Здравствуйте! Я первый день изучаю си , до этого паскаль, не судите строго ) Задача : Составить...

Передача структуры в функцию
Не могу понять, что делаю не так при передаче структуры в функцию. Подскажите, пожалуйста.#define...

Передача структуры в функцию
Пишу тут код, сделал указатель на структуру. Захотел создать динамичный массив в отдельной ф-ии и...

Передача структуры в функцию
Здравствуйте. При попытке передачи структуры в функцию возникает ошибка: error: type of formal...

3
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
06.04.2015, 10:01 2
Цитата Сообщение от guma Посмотреть сообщение
как при этом оформить список формальных параметров при объявлении функции
Описать также как и любой другой -- в строгом соответствии типов данных и режима доступа (чтение по значению, запись через указатель).
Цитата Сообщение от guma Посмотреть сообщение
как к этим полям обращаться при вызове функции в программе
Как к полям.

Пример:
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
typedef struct
{
  int a;
  float b;
  char c[20];
} TMyStruct;
 
void PrintB(const float fieldBValue)
{
  printf("%f\n", fieldBValue);
}
 
void WriteA(int* const fieldAPtr)
{
  (*fieldAPtr) = 5;
}
 
int main(void)
{
  TMyStruct myStructArray[4]; /* объявляем массив */
  int index = 2;
  /* как-то заполняем поля */
  PrintB(myStructArray[index].b);
  /* ... */
 
  WriteAValue(&myStructArray[index].a);
  return 0;
}
0
1 / 1 / 0
Регистрация: 04.04.2015
Сообщений: 23
07.04.2015, 22:46  [ТС] 3
Это и в книгах есть.
А что если структура будет следующая:
C
1
2
3
4
5
6
 struct DATA
{
  int a;
  float b;
  char c[20];
} TMyStruct[100];
И мне нужно передать массив элементов структуры. Да, если обращаюсь к функции так:
C
1
fun(TMyStruct.b);
То компилятор ругается вот так:[Error] request for member 'b' in 'TMyStruct', which is of non-class type 'DATA [100]'
Пользуюсь Dev-C++.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
08.04.2015, 08:08 4
Скажу так: если вам дано
C
1
2
3
4
5
6
struct DATA
{
  int a;
  float b;
  char c[20];
} TMyStruct[100];
А вам
Цитата Сообщение от guma Посмотреть сообщение
нужно передать массив элементов структуры
, то налицо косяк архитектуры приложения. Если он непреодолим в том смысле, что надо (ну прям жесть как надо) делать именно так, то наиболее оптимально было бы завести массив значений полей из вашего массива структур, и уже его передавать в функцию.
0
08.04.2015, 08:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2015, 08:08
Помогаю со студенческими работами здесь

Передача структуры в функцию
#include &lt;stdio.h&gt; #define DEBUG 1; typedef struct { int worksBefore; int...

Передача вложенной структуры в функцию
Добрый вечер!интересует вопрос,есть Массив структур,который содержит в себе еще несколько массивов...

Передача массива структуры в функцию
Добрый вечер! У меня такая проблема. Необходимо создать функцию, которая &quot;обнуляет&quot; все значения в...

Передача члена структуры в функцию
Здравствуйте. Столкнулся с проблемой и не могу найти ее решение. есть структура: #ifndef...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru