Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/43: Рейтинг темы: голосов - 43, средняя оценка - 4.51
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
1

Функции: возврат структуры

12.12.2010, 15:11. Показов 8084. Ответов 15
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct my_info{
//поля
} my_struct; //структура
 
struct my_info funct (struct my_info); //прототип функции
 
void main()
{ 
 
funct (my_struct); // вызов функции, заполнение полей структуры
printf("%d", my_struct.price); //вывод значения 1го из полей
 
     getch();
}
 
struct my_info funct(struct my_info my_struct)
{
    memset(&my_struct, 0, sizeof(my_struct));
    //...заполнение полей
    return my_struct;
}
В итоге в функции printf("%d", my_struct.price); (стр.11) выводятся нули для всех полей типа int.

Посмотрите, пожалуйста, что-то не так с возвратом структуры из функции?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.12.2010, 15:11
Ответы с готовыми решениями:

Возврат структуры из функции
Здравствуйте. Допустим, есть следующий код, работающий успешно. typedef struct { int a; int...

Возврат структуры функцией через указатель
Здравствуй. После С++ никак не могу понять, как сделать. Нужно создать функцию struct A*...

Возврат структуры из функции
Добрый день! Я только начинаю, и сразу стал путаться с массивами и структурами с горем попалам...

Возврат структуры из функции
Всем доброго времени суток. awesome.h struct point { float x = 1; float y = 1; }; struct...

15
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
12.12.2010, 15:35 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот так должно работать, не компилировал правда
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct my_info{
//поля
} my_struct; //структура
 
void funct ( my_info* my_strict ); //прототип функции
 
int main( void )
{
  funct( &my_struct ); // вызов функции, заполнение полей структуры
  printf("%d", my_struct.price); //вывод значения 1го из полей
  getch();
  return 0;
}
 
void funct( my_info* my_struct)
{
        //...заполнение полей
}
1
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
12.12.2010, 15:37 3
chaosfall, почитайте про то, что в си параметры передаются по значению
1
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
12.12.2010, 15:43 4
chaosfall, да вообще почитайте про функции в си, и передачу параметров в функции, а так же их возвращение.
0
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
12.12.2010, 16:52  [ТС] 5
alex_x_x, illuminati, Спасибо за советы. Если не сложно, подскажите, пожалуйста, книги\статьи, где хорошо и подробно описаны темы указателей и функций. По этим темам в сети много информации, но мне пока попадается только поверхностное описание основной сути, которого, видимо, недостаточно.
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
12.12.2010, 20:06 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

chaosfall, https://www.cyberforum.ru/cpp-... ost1092740

Добавлено через 6 минут
Ну а что б работать с массивом нужно сделать следующее :
1. передать сам массив( имя массива является указателем на первый элемент массива )
2. передать длинну массива

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
#define SIZE 10
 
int* f( int arr[] ) {
  // действия с массивом
  return arr;
}
 
int main( void ) {
  int A[SIZE];
  f( A, SIZE );
  return 0;
}
Добавлено через 2 минуты
На счет книг, посмотри в Г.Шилдт, у него довольно доступное изложение специфики языка Си
1
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
12.12.2010, 21:06  [ТС] 7
illuminati, спасибо!

Цитата Сообщение от illuminati Посмотреть сообщение
void funct( my_info* my_struct)
{
//...заполнение полей
}
Не подскажешь еще, как правильно в этой функции заполнять поля значениями, вводимыми с клавиатуры?

Пробую это делать так:
C
1
scanf("%d",&my_struct->price);
после ввода значения вылетает ошибка "Необработанное исключение в "0x5b2a6af2 (msvcr90d.dll)" в "w.exe": 0xC0000005: Нарушение прав доступа при записи "0x0000001c".
и подсвечивается желтым строчка
C
1
*(long UNALIGNED *)pointer = (unsigned long)number;
в input.c.
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
12.12.2010, 23:32 8
обращение по полю структуры через точку, т.е.
C
1
scanf( "%d", &my_struct.price );
В VS2008, да и 10ой тоже, если к структуре можно обратится, то после нажатия на точку вываливается менюшка с полями этой структуры.
Оператор -> , это обращение по указателю( если не прав, поправьте )
Вообщем, если в функции объявлена структура, то к её полям обращаться через точку.
0
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
12.12.2010, 23:48  [ТС] 9
так пишет
Ошибка 3 error C2228: выражение слева от ".price" должно представлять класс, структуру или объединение
..
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
12.12.2010, 23:51 10
chaosfall, выложи весь исходник.
0
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
13.12.2010, 00:10  [ТС] 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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <io.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <ctype.h>
 
void enterStructure (struct scan_info*);
 
struct scan_info{
char model[25]; 
int price;  
//...   
} *my_struct;
 
 
void main()
{ 
setlocale (LC_ALL, "Russian");
    SetConsoleCP(1251);
           SetConsoleOutputCP(1251);
    FILE *file;
    short nop = 0; 
 
file=fopen("file", "w+b");
 
if (file == NULL)
  {
    perror("Ошибка при открытии");
    exit(1);
  }
 
fwrite (&nop,sizeof(short), 1, file);
 
enterStructure(my_struct);
printf("%s", &my_struct->model);
 
fwrite (&my_struct,sizeof(my_struct),1,file);
fclose(file);
 
     getch();
}
 
 
void enterStructure(struct scan_info *my_struct)
{
    memset(&my_struct, 0, sizeof(my_struct));
    fflush (stdin);
    printf("\nВведите наименование модели:");
    scanf("%s",&my_struct.model);
    fflush (stdin);
    printf("\nВведите цену модели:");
    scanf("%d",&my_struct.price);
//...
}
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
13.12.2010, 00:29 12
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <io.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <ctype.h>
 
typedef struct scan_info{
char model[25]; 
int price;      
//...   
} *my_struct;
 
void enterStructure ( scan_info* ); 
 
void main()
{ 
setlocale (LC_ALL, "Russian");
        SetConsoleCP(1251);
           SetConsoleOutputCP(1251);
        FILE *file;
        short nop = 0; 
 
file=fopen("file", "w+b");
 
if (file == NULL)
  {
    perror("Ошибка при открытии");
    exit(1);
  }
 
fwrite (&nop,sizeof(short), 1, file);
 
enterStructure(my_struct);
printf("%s", &my_struct->model);
 
fwrite (&my_struct,sizeof(my_struct),1,file);
fclose(file);
 
         getch();
}
 
 
void enterStructure(scan_info *my_struct)
{
        fflush (stdin);
        printf("\nВведите наименование модели:");
        scanf("%s",&my_struct.model);
        fflush (stdin);
        printf("\nВведите цену модели:");
        scanf("%d",&my_struct.price);
//...
}
Добавлено через 6 минут
во-первых, структура - тип данных, который определяется программистом
во-вторых, лучше использовать typedef, т.е. переопределение типа
в-третьих, в функции не нужно выделять память под структуру, когда ты передаешь переменную, ты передаешь указатель, т.е. адрес на ячейку памяти, а начиная с той ячейки память УЖЕ выделена.
в-четвертых, в параметрах функции не нужно писать struct компилятор понимает с первого раза.

т.е. в твое случае :
scan_info - это тип данных, такой же как и int, float, char и т.п., соответственно обїявлять переменніе ты можешь точно так же
C
1
scan_info my_struct; // переменная my_struct типа scan_info
1
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
13.12.2010, 00:55  [ТС] 13
Ошибка 2 error C2275: my_struct: недопустимое использование этого типа в качестве выражения 38
Ошибка 3 error C2275: my_struct: недопустимое использование этого типа в качестве выражения 39
Ошибка 4 error C2275: my_struct: недопустимое использование этого типа в качестве выражения 41
Ошибка 5 error C2275: my_struct: недопустимое использование этого типа в качестве выражения 41
Ошибка 6 error C2228: выражение слева от ".model" должно представлять класс, структуру или объединение 52
Ошибка 7 error C2228: выражение слева от ".price" должно представлять класс, структуру или объединение 55
не компилируется

Добавлено через 1 минуту
Цитата Сообщение от illuminati Посмотреть сообщение
в-третьих, в функции не нужно выделять память под структуру, когда ты передаешь переменную, ты передаешь указатель, т.е. адрес на ячейку памяти, а начиная с той ячейки память УЖЕ выделена.
C
1
 memset(&my_struct, 0, sizeof(my_struct));
- этим я хотела обнулить структуру..
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
13.12.2010, 01:15 14
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Да, прости, не компилируется)
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
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <io.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>
#include <ctype.h>
 
typedef struct scan_info{
  char model[25]; 
  int price;      
  //...   
};
 
void enterStructure ( scan_info* ); 
 
void main()
{ 
   setlocale (LC_ALL, "Russian");
   FILE *file;
   scan_info my_struct;
   short nop = 0; 
   
   file=fopen("file", "w+b");
 
   if (file == NULL)
   {
     perror("Ошибка при открытии");
     exit(1);
   }
 
   fwrite (&nop,sizeof(short), 1, file);
 
   enterStructure(&my_struct);
   printf("%s", &my_struct.model);
 
   fwrite (&my_struct,sizeof(my_struct),1,file);
   fclose(file);
 
   getch();
}
 
 
void enterStructure(scan_info *my_struct)
{
        fflush (stdin);
        printf("\nВведите наименование модели:");
        scanf("%s",&my_struct->model);
        fflush (stdin);
        printf("\nВведите цену модели:");
        scanf("%d",&my_struct->price);
//...
}
2
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
13.12.2010, 01:18  [ТС] 15
illuminati, Вот теперь все ок, спасибо огромное!
0
21 / 21 / 5
Регистрация: 14.06.2010
Сообщений: 108
13.12.2010, 01:19 16
Строкой
C
1
scan_info my_struct;
мы инициализурем нашу структуру

В main обращатся к полям структуры по значению, т.е. через оператор точка "."
В функции, в которой структура передаётся по указателю(адресу), обращаться к полям структуры нужно через оператор "->"

Вот вроде всё.

З.Ы.: постарайся не подключать лишних библиотек, мне кажется это дурной тон. И отдельный + за то что девушка, не каждая станет сама разбираться с кодом)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2010, 01:19

Возврат структуры из функции
Задание на структуру: создается банковский счет с возможностью изменения его данных по ходу. Я не...

Возврат структуры из функции через указатель
Помогите,пожалуйста, немного знаю C++,спрашивала у знакомой - она не знает, а я гуглила и так...

Возврат значения структуры
Приветствую Есть структура public struct Field { string _name; string...

Возврат структуры из процедуры
Помогите решить задачу! Мне надо написать процедуру которая заполняет структуру данными и...


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

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

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