#c #function #structure
#c #функция #структура
Вопрос:
Я пытаюсь ввести значения в созданную мной структуру, но, похоже, она не работает ни для чего, кроме значения «имя символа [50]». Это единственное, что фактически вводится и выводится при запуске программы. Я прилагаю фотографию, которая также показывает результат. Я не могу понять, почему другие значения не получают в ней никакого значения.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct ypallhlos{
char name[50];
int am;
short type;
int ohour;
double misthos;
};
void gemismaPedion(char name2[50], int am2, short type2, int hour2, double misthos2);
void emfanishPedion(struct ypallhlos ypo);
int main() {
struct ypallhlos yp1;
gemismaPedion(yp1.name, yp1.am ,yp1.type ,yp1.ohour ,yp1.misthos);
printf("n");
emfanishPedion(yp1);
// PAFSI PROGRAMMATOS
system("Pause");
}
void gemismaPedion(char name2[50], int am2, short type2, int hour2, double misthos2){
struct ypallhlos ypo;
printf("Dwse onoma : ");
scanf("%[^n]%*c", name2);
printf("Dwse arithmo mitroou : ");
scanf("%d", amp;am2);
do{
printf("Dwse typo ptixiou (1 ews 7): ");
scanf("%hd", amp;type2);
}
while(type2 < 1 || type2 > 7);
printf("Dwse yperwries : ");
scanf("%d", amp;hour2);
printf("Dwse mistho ypallhlou : ");
scanf("%lf", amp;misthos2);
}
void emfanishPedion(struct ypallhlos ypo){
printf("Onoma ypallhlou = %s n", ypo.name);
printf("Arithmos mitroou ypallhlou = %d n", ypo.am);
printf("Typos ptixiou ypallhlou = %hd n", ypo.type);
printf("Iperwries ypallhlou = %d n", ypo.ohour);
printf("Misthos ypallhlou = %lf n", ypo.misthos);
}
Ввод:
Dwse onoma: stackoverflow
Dwse arithmo mitroou: 45
Опечатка в Dwse ptixiou (1 ews 7): 4
Dwse yperwries: 5
Dwse mistho ypallhlou : 954
Вывод:
Онома ypallhlou = stackoverflow
Arithmos mitroou ypallhlou = 0
Опечатки ptixiou ypallhlou = 34
Iperwries ypallhlou = 0
Ошибка ypallhlou = 0.000000
Нажмите любую клавишу, чтобы продолжить . . .
Комментарии:
1. используйте printf следующим образом:
printf("abcd %x", amp;var)
вместоprintf("abcd %x", var)
, проверьте учебник uni и компилятор.
Ответ №1:
C использует передачу по значению для передачи параметров функции.
Если вы хотите изменить значения параметров вызываемых функций и отразить их в вызывающей функции, вам необходимо передать адрес этих переменных, а в вызываемой функции вам необходимо
- соберите их в соответствующей переменной типа указателя
- запись по адресу памяти, полученному в качестве параметров.
Таким образом, значения, обновленные вызываемой функцией, будут отражены в вызывающей функции.
Например, вам нужно изменить определение функции на
void gemismaPedion(char name2[50], int *am2, short *type2, int *hour2, double *misthos2){
и назовите это как
gemismaPedion(yp1.name, amp;(yp1.am), amp;(yp1.type), amp;(yp1.ohour), amp;(yp1.misthos));
Подход без указателей:
Вы можете сделать это без использования указателей, например
- Определяется
gemismaPedion
какstruct ypallhlos gemismaPedion (void)
. - Внутри функции определите переменную struct ypallhlos temp;`
- Как вы знаете, храните пользовательские входные данные для определенных переменных.
- наконец, используйте
return temp;
затем, из main()
, вызовите это как
struct ypallhlos yp1 = gemismaPedion ();
затем передайте yp1
, как вы это сделали, это должно выполнить эту работу.
Комментарии:
1. К сожалению, до сих пор в uni не было обученных указателей, поэтому я не могу понять, как писать по адресу памяти без использования указателей. Поскольку я могу писать по «имени», разве я не должен иметь возможность записывать и другие значения? Каким было бы решение в этом случае, если я еще не могу / не обучен использованию указателей?
2. В этом случае другим способом было бы определить структуру в вызываемой функции, заполнить ее и вернуть ее из вызывающей функции и сохранить возвращаемое значение в другой переменной этого типа структуры в вызывающей функции.
3. Я попробовал 1-е решение, но, к сожалению, оно дало мне только ошибки, когда дело дошло до замены, как вы мне показали. Я пытался понять, что вы имеете в виду и какие изменения нужно внести в мой код с помощью вашего второго решения, но, похоже, мне не удается полностью понять, что нужно сделать в ваших пунктах, или мой компилятор устарел и выдает мне ошибки (Dev-c ). Я действительно ценю вашу помощь, извините, что доставил вам неприятности.
4. Могу ли я сделать что-то подобное с тем, что я сделал во 2-й функции?