Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
1

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

04.10.2015, 01:40. Показов 971. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу тут код, сделал указатель на структуру. Захотел создать динамичный массив в отдельной ф-ии и заполнить его. Внутри ф-ии все работает хорошо, но когда сделал проверку в мэине вывело крякозябру. Хочу разобраться в чем причина.

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
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct FIO{
        char name[ 20 ];
        char surname[ 20 ];
        char otch[ 20 ];
};
struct JOB{
        int exper;
        char oldplace[ 50 ];
};
struct ADRESS{
        char town[ 15 ];
        char street[ 20 ];
        char house[ 10 ];
};
 
typedef struct{
        FIO fio;
        JOB job;
        ADRESS ad;     
        
        bool reg;   
}*LPFORM, FORM;
 
void vvod( LPFORM, int & );
void PrintRez( LPFORM, int );
void Rez( LPFORM, int );
 
int main()
{
    int n;
    LPFORM forms;
    
    vvod( forms, n );
    //for( int i = 0; i < strlen(  ) )
    printf( forms[ 0 ].fio.name );
    
    return system( "pause" );
}
 
void vvod( LPFORM f, int &n )
{
     float fn;
     do{
        printf( "Vvedite kolichestvo anket: " );
        scanf( "%f", &fn );
        if( fn <= 0 )printf( "Kolichestvo ne mozhet bit otricatelnim libo ravno 0.\n" );
        if( fn != (int)fn )printf( "Kolichestvo dolzhno bit celim.\n" );
     }while( fn <= 0 || fn != (int)fn );
     
     n = fn;
     f = new FORM[ n ];
     char yn[4];
     
     for( int i = 0; i < n; i++ )
     {
          printf( "\n-----------------------Anketa #%d-----------------------\n", i + 1 );
          printf( "_________________________FIO_________________________\n" );
          printf( "Vvedite im'a: " );
          scanf( "%s", f[ i ].fio.name );
          printf( "Vvedite familiy: " );
          scanf( "%s", f[ i ].fio.surname );
          printf( "Vvedite otchestvo: " );
          scanf( "%s", f[ i ].fio.otch );
          printf( "________________________Adress_______________________\n" );
          printf( "Vvedite gorod: " );
          scanf( "%s", f[ i ].ad.town );
          printf( "Vvedite ylicy: " );
          scanf( "%s", f[ i ].ad.street );
          printf( "Vvedite dom: " );
          scanf( "%s", f[ i ].ad.house );
          printf( "________________________Rabota_______________________\n" );
          printf( "Vvedite staroe mesto raboti: " );
          scanf( "%s", f[ i ].job.oldplace );
          printf( "Vvedite stazh raboti(godi): " );
          scanf( "%d", &f[ i ].job.exper );
          
          printf( "_____________________________________________________\n" );
          do{
                 printf( "Nalichie propiski(da/net): " );
                 scanf( "%s", yn );
                 if( strcmp( yn, "da" ) == 0 )f[ i ].reg = true;
                 else if( strcmp( yn, "net" ) == 0 )f[ i ].reg = false;
                 else printf( "Vvedite libo "da", libo "net"\n" );
          }while( strcmp( yn, "da" ) != 0 && strcmp( yn, "net" ) != 0 );
     }
     printf( "-------------------------------------------------------------\n" );
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2015, 01:40
Ответы с готовыми решениями:

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

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

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

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

13
81 / 25 / 19
Регистрация: 27.10.2014
Сообщений: 420
04.10.2015, 02:12 2
Может я сейчас не прав, но:
передаешь в функцию указатель f а потом ему же выделяешь память в куче под пассив FORM, там все нормально?
0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 02:16  [ТС] 3
Цитата Сообщение от valeriy007 Посмотреть сообщение
Может я сейчас не прав, но:
передаешь в функцию указатель f а потом ему же выделяешь память в куче под пассив FORM, там все нормально?
А как сделать? Я б хотел бы чтобы ввод был полностью в отдельной ф-ии
0
Fonduee
04.10.2015, 09:35
  #4

Не по теме:

У вас в коде куча синтаксических ошибок, очень сомневаюсь, что у вас он компилируется.

0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 09:55  [ТС] 5
Цитата Сообщение от Fonduee Посмотреть сообщение
У вас в коде куча синтаксических ошибок, очень сомневаюсь, что у вас он компилируется.
эм, какие это?

Добавлено через 11 минут
Исправил ошибку.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct FIO{
        char name[ 20 ];
        char surname[ 20 ];
        char otch[ 20 ];
};
struct JOB{
        int exper;
        char oldplace[ 50 ];
};
struct ADRESS{
        char town[ 15 ];
        char street[ 20 ];
        char house[ 10 ];
};
 
typedef struct{
        FIO fio;
        JOB job;
        ADRESS ad;     
        
        bool reg;   
}*LPFORM, FORM;
 
LPFORM vvod( LPFORM, int & );
void PrintRez( LPFORM, int );
void Rez( LPFORM, int );
 
int main()
{
    int n;
    LPFORM forms;
    //forms = new FORM[ 10 ];
    
    forms = vvod( forms, n );
    //for( int i = 0; i < strlen(  ) )
    printf( forms[ 0 ].fio.name );
    
    delete [] forms;
    
    return system( "pause" );
}
 
LPFORM vvod( LPFORM f, int &n )
{
     float fn;
     do{
        printf( "Vvedite kolichestvo anket: " );
        scanf( "%f", &fn );
        if( fn <= 0 )printf( "Kolichestvo ne mozhet bit otricatelnim libo ravno 0.\n" );
        if( fn != (int)fn )printf( "Kolichestvo dolzhno bit celim.\n" );
     }while( fn <= 0 || fn != (int)fn );
     
     n = fn;
     f = new FORM[ n ];
     char yn[4];
     
     for( int i = 0; i < n; i++ )
     {
          printf( "\n-----------------------Anketa #%d-----------------------\n", i + 1 );
          printf( "_________________________FIO_________________________\n" );
          printf( "Vvedite im'a: " );
          scanf( "%s", f[ i ].fio.name );
          printf( "Vvedite familiy: " );
          scanf( "%s", f[ i ].fio.surname );
          printf( "Vvedite otchestvo: " );
          scanf( "%s", f[ i ].fio.otch );
          printf( "________________________Adress_______________________\n" );
          printf( "Vvedite gorod: " );
          scanf( "%s", f[ i ].ad.town );
          printf( "Vvedite ylicy: " );
          scanf( "%s", f[ i ].ad.street );
          printf( "Vvedite dom: " );
          scanf( "%s", f[ i ].ad.house );
          printf( "________________________Rabota_______________________\n" );
          printf( "Vvedite staroe mesto raboti: " );
          scanf( "%s", f[ i ].job.oldplace );
          printf( "Vvedite stazh raboti(godi): " );
          scanf( "%d", &f[ i ].job.exper );
          
          printf( "_____________________________________________________\n" );
          do{
                 printf( "Nalichie propiski(da/net): " );
                 scanf( "%s", yn );
                 if( strcmp( yn, "da" ) == 0 )f[ i ].reg = true;
                 else if( strcmp( yn, "net" ) == 0 )f[ i ].reg = false;
                 else printf( "Vvedite libo "da", libo "net"\n" );
          }while( strcmp( yn, "da" ) != 0 && strcmp( yn, "net" ) != 0 );
     }
     printf( "-------------------------------------------------------------\n" );
     
     return f;
}
0
Музыка нас Связала
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
04.10.2015, 10:40 6
Цитата Сообщение от HardLogin Посмотреть сообщение
Исправил ошибку.
Уверены?

Bash
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
nikolaj@stargate:~$ gcc -Wall -g -std=c99 -o errors errors.c 
errors.c:21:9: error: unknown type name ‘FIO’
         FIO fio;
         ^
errors.c:22:9: error: unknown type name ‘JOB’
         JOB job;
         ^
errors.c:23:9: error: unknown type name ‘ADRESS’
         ADRESS ad;     
         ^
errors.c:25:9: error: unknown type name ‘bool’
         bool reg;   
         ^
errors.c:28:26: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
 LPFORM vvod( LPFORM, int & );
                          ^
errors.c: In function ‘main’:
errors.c:38:5: warning: implicit declaration of function ‘vvod’ [-Wimplicit-function-declaration]
     forms = vvod( forms, n );
     ^
errors.c:38:11: warning: assignment makes pointer from integer without a cast [enabled by default]
     forms = vvod( forms, n );
           ^
errors.c:40:27: error: request for member ‘name’ in something not a structure or union
     printf( forms[ 0 ].fio.name );
                           ^
errors.c:42:5: error: ‘delete’ undeclared (first use in this function)
     delete [] forms;
     ^
errors.c:42:5: note: each undeclared identifier is reported only once for each function it appears in
errors.c:42:13: error: expected expression before ‘]’ token
     delete [] forms;
             ^
errors.c: At top level:
errors.c:47:28: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
 LPFORM vvod( LPFORM f, int &n )
                            ^
0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 12:47  [ТС] 7
Цитата Сообщение от Fonduee Посмотреть сообщение
Уверены?
Эээ.. У вас что то не то с компилятором. Он даже на бул ругается. Все структуры объявлены. В деве всем прекрасно компилируется.

Добавлено через 53 секунды
Если вы видите ошибку, то укажите на неё
0
Музыка нас Связала
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
04.10.2015, 13:06 8
Цитата Сообщение от HardLogin Посмотреть сообщение
У вас что то не то с компилятором.

У меня как раз всё то.

Цитата Сообщение от HardLogin Посмотреть сообщение
Он даже на бул ругается.

Мы в разделе СИ, а значит какой в нативе bool? Тоже касается new, delete и etc.

То что ваш DevC++ не ругается - очень страно, ибо даже если проект у вас и использует C++ компайлер, то на

C
1
printf( "Vvedite libo "da", libo "net"\n" );
должен как минимум кинуть ошибку и отказаться работать.
0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 18:01  [ТС] 9
Цитата Сообщение от Fonduee Посмотреть сообщение
То что ваш DevC++ не ругается - очень страно, ибо даже если проект у вас и использует C++ компайлер, то на
Код CВыделить код
1
printf( "Vvedite libo "da", libo "net"\n" );
должен как минимум кинуть ошибку и отказаться работать.
вообще то странно, там на самом деле стоят косые черты. Не знаю почему не скопировались

Добавлено через 16 минут
Пипец.
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct FIO{
        char name[ 20 ];
        char surname[ 20 ];
        char otch[ 20 ];
};
struct JOB{
        int exper;
        char oldplace[ 50 ];
};
struct ADRESS{
        char town[ 20 ];
        char street[ 20 ];
        char house[ 10 ];
};
 
struct FORM{
        FIO fio;
        JOB job;
        ADRESS ad;     
        
        bool reg;   
};
struct REZ{
        char town[ 20 ];
        int c;
};
 
FORM* vvod( FORM *, int & );
REZ* Rez( FORM *, int, int & );
void PrintRez( REZ *, int );
void CopyForm( FORM &, FORM );
 
int main()
{
    int n, CountRez = 0;
    LPFORM forms;
    LPREZ rez;
    
    forms = vvod( forms, n );
    rez = Rez( forms, n, CountRez );
    PrintRez( rez, CountRez );
    
    free(forms);
    free(rez);
    
    return system( "pause" );
}
 
FORM *vvod( FORM *f, int &n )
{
     float fn;
     do{
        printf( "Vvedite kolichestvo anket: " );
        scanf( "%f", &fn );
        if( fn <= 0 )printf( "Kolichestvo ne mozhet bit otricatelnim libo ravno 0.\n" );
        if( fn != (int)fn )printf( "Kolichestvo dolzhno bit celim.\n" );
     }while( fn <= 0 || fn != (int)fn );
     
     n = (int)fn;
     f = malloc (sizeof(FORM) * n);
     char yn[4];
     
     for( int i = 0; i < n; i++ )
     {
          printf( "\n-----------------------Anketa #%d-----------------------\n", i + 1 );
          printf( "_________________________FIO_________________________\n" );
          printf( "Vvedite im'a: " );
          scanf( "%s", f[ i ].fio.name );
          printf( "Vvedite familiy: " );
          scanf( "%s", f[ i ].fio.surname );
          printf( "Vvedite otchestvo: " );
          scanf( "%s", f[ i ].fio.otch );
          printf( "________________________Adress_______________________\n" );
          printf( "Vvedite gorod: " );
          scanf( "%s", f[ i ].ad.town );
          printf( "Vvedite ylicy: " );
          scanf( "%s", f[ i ].ad.street );
          printf( "Vvedite dom: " );
          scanf( "%s", f[ i ].ad.house );
          printf( "________________________Rabota_______________________\n" );
          printf( "Vvedite staroe mesto raboti: " );
          scanf( "%s", f[ i ].job.oldplace );
          printf( "Vvedite stazh raboti(godi): " );
          scanf( "%d", &f[ i ].job.exper );
          
          printf( "_____________________________________________________\n" );
          do{
                 printf( "Nalichie propiski(da/net): " );
                 scanf( "%s", yn );
                 if( strcmp( yn, "da" ) == 0 )f[ i ].reg = true;
                 else if( strcmp( yn, "net" ) == 0 )f[ i ].reg = false;
                 else printf( "Vvedite libo "da", libo "net"\n" );
          }while( strcmp( yn, "da" ) != 0 && strcmp( yn, "net" ) != 0 );
     }
     printf( "-------------------------------------------------------------\n" );
     
     return f;
}
 
REZ * Rez( FORM * f, int n, int &c )
{
      REZ *r = malloc (sizeof(REZ) * n);
      FORM *f1 = malloc (sizeof(FORM) * n);
      for( int i = 0; i < n; i++ )CopyForm( f1[ i ], f[ i ] );
      int count;
      for( int i = 0; i < n; i++ )
      {
           if( strcmp( f1[ i ].ad.town, "-1" ) != 0 )
           {
               count = 1;
               for( int j = i + 1; j < n; j++ )
               if( strcmp( f1[ i ].ad.town, f1[ j ].ad.town ) == 0 )
               {
                   count++;
                   strcpy( f1[ j ].ad.town, "-1" );
               }
               strcpy( r[ c ].town, f1[ i ].ad.town );
               r[ c ].c = count;
               c++;
           }
      }
      free(f1);
      return r;
}
 
void PrintRez( REZ *r, int n )
{
     printf( "********************************************\n" );
     printf( "*        Gorod        *  Kolichestvo lydei *\n" );
     printf( "********************************************\n" );
     for( int i = 0; i < n; i++ )
     printf( "*%20s *%19d *\n", r[ i ].town, r[ i ].c );
     printf( "********************************************\n" );
}
 
void CopyForm( FORM &l, FORM r )
{
     strcpy( l.fio.name, r.fio.name );
     strcpy( l.fio.surname, r.fio.surname );
     strcpy( l.fio.otch, r.fio.otch );
     
     strcpy( l.ad.town, r.ad.town );
     strcpy( l.ad.street, r.ad.street );
     strcpy( l.ad.house, r.ad.house );
     
     strcpy( l.job.oldplace, r.job.oldplace );
     l.job.exper = r.job.exper;
     
     l.reg = r.reg;
}
Что это вообще за ошибки, чем ему структуры не понравились? И почему на указатели ругается?

Добавлено через 23 минуты
Скомпилировал на Си. Те же ошибки выдало. Что это за..? Странные ошибки
0
Музыка нас Связала
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
04.10.2015, 18:16 10
Цитата Сообщение от HardLogin Посмотреть сообщение
Странные ошибки
Как уже сказал, синтаксические ошибки, используете C++, что в СИ не есть гуд.

К примеру:

* структуру нужно объязательно указывать, если не использовать typedef.

Неверно:
C
1
FORM* vvod( FORM *, int & );
Верно:
C
1
struct FORM* vvod(struct FORM*, int*);
* Также, заместо амперсанда нужно использовать звёздочку *.

Много текста, одна мысль: Переписывайте свой код с C++ на СИ.
0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 18:46  [ТС] 11
Цитата Сообщение от Fonduee Посмотреть сообщение
Много текста, одна мысль: Переписывайте свой код с C++ на СИ.
ну вот переписываю..

Добавлено через 26 секунд
Цитата Сообщение от Fonduee Посмотреть сообщение
структуру нужно объязательно указывать, если не использовать typedef.
всмысле?
0
Музыка нас Связала
232 / 232 / 52
Регистрация: 26.03.2008
Сообщений: 616
04.10.2015, 18:56 12
Цитата Сообщение от HardLogin Посмотреть сообщение
всмысле?

Можно дефинировать свой тип и использовать его, чтобы не писать повсюду keyword struct.

C
1
2
3
typedef struct FORM FORM;
 
FORM my_form;
0
54 / 54 / 2
Регистрация: 20.01.2013
Сообщений: 832
Записей в блоге: 1
04.10.2015, 20:38  [ТС] 13
Цитата Сообщение от Fonduee Посмотреть сообщение
Можно дефинировать свой тип и использовать его, чтобы не писать повсюду keyword struct.
Осталось только решить почему на циклы ругается
0
590 / 413 / 135
Регистрация: 02.10.2008
Сообщений: 1,745
Записей в блоге: 1
04.10.2015, 20:59 14
Цитата Сообщение от HardLogin Посмотреть сообщение
Осталось только решить почему на циклы ругается
По той же причине - Если пишите на C - то на нём и пишите, а не на C++. Почитайте стандарт на C и покажите где там разрешено переменные объявлять в середине программы, тем более внутри объявления for.
0
04.10.2015, 20:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2015, 20:59
Помогаю со студенческими работами здесь

Передача члена структуры в функцию
Задача такова. Есть массив структурного типа, нужно передать конкретное поле(член) этой структуры в...

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

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

Передача структуры в функцию
#include &lt;stdio.h&gt; struct Student { char Name; /* Фамилия студента */ int ...


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

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