1

我正在创建一个项目,但遇到了不应该发生的行为(至少据我所知)。我正在尝试更改函数 addOrder 内的结构数组中的值。在 main() 中,我将结构的地址提供给函数 addOrder(这是第一个警告)。然后我尝试在命名函数中更改其内容。我应该只能使用 -> 进行更改,但是,这样会出错,我只能使用 data[0].someName 进行更改

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define MENU_TITLE "----Welcome to order manager!---" // menu title
#define MENU_SIZE 4 //change based on menu options
#define INPUT_MSG "Please choose one of the following options" //enter input message (range is added later automatically)
#define SIZE 25 //size of option message array
#define STREET_NAME_SIZE 50 //size of street name array
#define BUILDING_NUMBER_SIZE 10 //size of building number array
#define EMAIL_SIZE 40 //size of email array
#define INPUT_PHONE_MAX 12

typedef struct Data{

char streetName[STREET_NAME_SIZE];
char buildingNumber[BUILDING_NUMBER_SIZE];
unsigned long long phoneNumber;
char email[EMAIL_SIZE];

}Data;

void loadOrderAmount(int *orderAmount);
void showMenu(char *menuTitle, int menuSize, char *inputMsg);
int getChoise();
void addOrder(Data *data, int *orderAmount);
void getEmail(char *email);
unsigned long long getPhoneNumber();

int main(){
    int orderAmount = 0;
    loadOrderAmount(&orderAmount);
    Data data[orderAmount + 1];
    int choise = 0;

    showMenu(MENU_TITLE, MENU_SIZE, INPUT_MSG);
    while(!choise){
        choise = getChoise();
    }

    printf("\n");
    switch(choise){
        case 1:
            addOrder(&data,&orderAmount);   // This gives first warning
            break;
        case 2:
            //removeOrder(data);
            break;
        case 3:
            //editOrder(data);
            break;
        case 4:
            printf("Have a nice day\n");
            return 0;
    }
    printf("in main data %d\n",&data);
    //printf("%s %s ",data[0].streetName,data[0].buildingNumber);
    //printf("+%llu ",data[0].phoneNumber);
    printf("in main %s %llu\n",data[0].email,data[0].phoneNumber);
    return 0;
}

void addOrder(Data *data,int *orderAmount){

    int amount = *orderAmount; //it is equal to 0
    char email[41];
    char street[51];
    char buildingNumber[11];
    printf("Adding an order...\n\n");
    //++orderAmount;

   // getStreetName(data, &orderAmount);
   // getBuildingNumber(data,&orderAmount);
    data[amount]->phoneNumber = getPhoneNumber();   //why this does not work? 
    getEmail(email);
    strcpy(data[0].email,email); // why this works? its a function....
    printf("In function data %d\n", data);
    printf("in struct %s %llu\n",data[0].email, data[0].phoneNumber);
}
}

这只是相关代码的一部分,并且缺少大多数功能。谁能帮我这个?

4

2 回答 2

1

该函数addOrder声明为

void addOrder(Data *data, int *orderAmount);

但是您将其称为传递类型的第一个参数Data ( * )[orderAmount + 1]

addOrder(&data,&orderAmount);

你需要这样称呼它

addOrder( data, &orderAmount );

而不是这个声明

data[amount]->phoneNumber = getPhoneNumber();

你必须写

data[amount].phoneNumber = getPhoneNumber();

而不是这个电话

printf("In function data %d\n", data);

你必须写

printf("In function data %p\n", ( void * )data);

注意函数内的表达式

data[amount]

data[0]

不一样,因为数量不等于零。orderAmount使用分配给 的参数(通过引用传递)调用该函数amount

于 2020-12-03T14:35:43.697 回答
0

这是解决此错误的方法:

  1. 编译器指向addOrder(&data,&orderAmount);说一些奇怪的“错误传递参数 1 blablabla”的行。我们实际上不需要了解的只是“错误参数 1”。
  2. 会不会是编译器是对的,而参数 1 有问题?
  3. 嗯哪一个是参数 1,它必须是&data.
  4. 检查声明data,它是Data data[orderAmount + 1];。这是一个数组!
  5. 他们在初级班教了我们什么?啊,当传递给函数时,数组会衰减为指向第一个元素的指针。所以没有必要&
  6. 将呼叫更改为addOrder(data,&orderAmount);
  7. 再次编译。
于 2020-12-03T14:53:22.030 回答