Попытка записи в структуре с функцией

#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-й функции?