'->'的类型参数无效,从一个单独的函数中编辑结构的字段。

问题描述 投票:0回答:2

我在从一个单独的函数中编辑一个结构的字段时遇到了问题,我试图从update droneinfofunction中编辑我的无人机结构的字段,基本上我的所有箭头都得到了同样的错误(无效类型参数'->')。

我确信这个问题源于我对指针的不理解。

任何帮助将是非常感激:)

这里是代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DRONE_COUNT 10

typedef struct{
//define struct info and variables
    int drone_number;
    char drone_name[20];
    int year_manufactured;
    double mass;
    double top_speed;
    double max_distance;
    double load_capacity;

} drone_info;

int updateDroneInfo(drone_info *droneinfo, int no_of_drones) {

    int searchID, numdrones, i, drYrMan;    
    double drMass, drTopSpeed, drMaxDist, drLoadCap;
    char drname[20];
    numdrones = no_of_drones;

    printf("what drone ID would you like to update?: ");
    scanf("%d", &searchID);
    printf("name: ");
    scanf("%s", drname);
    printf("year manufactured: ");
    scanf("%d", &drYrMan);
    printf("mass: ");
    scanf("%lf", &drMass);
    printf("top speed: ");
    scanf("%lf", &drTopSpeed);
    printf("max distance: ");
    scanf("%lf", &drMaxDist);
    printf("load capacity: ");
    scanf("%lf", &drLoadCap);

    droneinfo[searchID]->drone_number = searchID;
    droneinfo[searchID]->drone_name = drname;
    droneinfo[searchID]->year_manufactured = drYrMan;
    droneinfo[searchID]->mass = drMass;
    droneinfo[searchID]->top_speed = drTopSpeed;
    droneinfo[searchID]->max_distance = drMaxDist;
    droneinfo[searchID]->load_capacity = drLoadCap;



    for(i=0; i < numdrones; i++){




    }

return 0;

}



//drone search function
int searchDroneName(drone_info *droneinfo, int no_of_drones){


int i, found;
char namechoice[20];
printf("input drone name: ");
scanf("%s", namechoice);
found=0;


scanf("what drone would you like to search %s", namechoice);
for (i=0; i < no_of_drones; i++){
    if (!strcmp(namechoice, droneinfo[i].drone_name)) {

printf("found a match\n\nID: %d Name: %s  Year: %d  Mass: %.2f  Top Speed: %.2f  Max Distance: %.2f Load Capacity: %.2f\n", 
        droneinfo[i].drone_number, droneinfo[i].drone_name, droneinfo[i].year_manufactured, droneinfo[i].mass, droneinfo[i].top_speed, droneinfo[i].max_distance, droneinfo[i].load_capacity);


    found = 1;
    }

}

if(found == 0){
    printf("\nNo matches were found!\n");
}

return 0;

//make condition for all

}

int main(void)  {

drone_info droneinfo[10];   

int choice, droneID, yrman, i, no_of_drones;
double dronemass, dronemaxdist, dronetopspd, droneload;
char dronename[20];
i=0;

//open the drone.txt file where the drone info is stored
    FILE* inputfile = fopen("drone.txt", "r");
    if(inputfile == NULL)
    {
        perror("ERROR! ");
        exit(-1);
    }

//initialise the function that puts the struct in an array
    while(fscanf(inputfile, "%d %19s %d %lf %lf %lf %lf", &droneID, dronename, &yrman, &dronemass, &dronetopspd, &dronemaxdist, &droneload)==7){
        if(ferror(inputfile)){
            perror("An error occurred: ");

        }

        droneinfo[i].drone_number = droneID;
        strcpy(droneinfo[i].drone_name, dronename);
        droneinfo[i].year_manufactured = yrman;
        droneinfo[i].mass = dronemass;
        droneinfo[i].top_speed = dronetopspd;
        droneinfo[i].max_distance = dronemaxdist;
        droneinfo[i].load_capacity = droneload;

        i++;
    }

    no_of_drones = i;

    fclose(inputfile);

    //print the dtone info in an array
    printf("Data:\n\n");
    for (i=0; i < no_of_drones; i++){
        printf("ID: %d Name: %s  Year: %d  Mass: %.2f  Top Speed: %.2f  Max Distance: %.2f Load Capacity: %.2f\n", 
        droneinfo[i].drone_number, droneinfo[i].drone_name, droneinfo[i].year_manufactured, droneinfo[i].mass, droneinfo[i].top_speed, droneinfo[i].max_distance, droneinfo[i].load_capacity);

    }


do{
//program menu with appropriate menu items
  printf("Please select an option:\n\n");
  printf("1. Input/update drone information\n");
  printf("2. Search a drone\n");
  printf("3. Simulate a drone delivery scenario\n");
  printf("4. Display simulation results\n");
  printf("5. Save drone information\n");
  printf("6. Save all results\n");
  printf("7. Exit\n\n");

  scanf("%d", &choice);
    //switch for the 7 available menu cases
    switch(choice)
    {
    case 1:
    //input drone function
    updateDroneInfo(droneinfo, no_of_drones);

    break;

    case 2:
    //search drone function
    searchDroneName(droneinfo, no_of_drones);

    break;



    case 3:
    //simulate drone function


    break;


    case 4:
    //display simulation results


    break;


    case 5:
    //save drone information


    break;



    case 6:
    //save all results function


    break;



    case 7:
    //exit/breaks the loop

    break;


    default:
      printf("Invalid Data Entered! please enter a number between 1 and 7\n\n");
    break;


    }
}   while(choice != 7);
return 0;

}   

re

c function pointers struct structure
2个回答
1
投票
droneinfo[searchID]

类型为 drone_info 而不是 drone_info*,所以你用 . 而不是 ->.


1
投票

在这样的陈述中

droneinfo[searchID]->drone_number = searchID;

语气 droneinfo[searchID] 不是一个指针。它的类型是 drone_info 因为指针 droneinfo 已经被下标操作符取消了引用。

您必须写下

droneinfo[searchID].drone_number = searchID;

另外数组没有赋值操作符。你需要将元素元素从一个数组复制到另一个数组。

我们可以用以下语句来代替

droneinfo[searchID]->drone_name = drname;

你必须使用标准的字符串函数来写。strcpy

$include <string.h>

//...

strcpy( droneinfo[searchID].drone_name, drname );
© www.soinside.com 2019 - 2024. All rights reserved.