Построение структуры с функцией - PullRequest
0 голосов
/ 01 февраля 2020

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

Я получаю сообщение об ошибке "ошибка чтения нарушения доступа", спасибо!

  #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define SIZE 10
typedef struct
{
    char model[10];
    float price;
    int year;
}car;

void findCar(car *arr[], int minYear, float maxPrice, char modelWanted, int carAmount);
int main()
{
    int carAmount;
    car* arr;
    puts("How many cars?");
    scanf("%d", &carAmount);
    arr = (car*)malloc(carAmount * sizeof(car));
    if (arr == NULL)
        return -1;
    for (int i = 0; i < carAmount; i++)
    {
        puts("Enter car details, Model, Price,Year");
        scanf("%s%f%d",arr[i].model,&arr[i].price,&arr[i].year);
    }
    char modelWanted[SIZE];
    float maxPrice;
    int minYear;
    puts("Enter wanted model,maximum price and minimum year!");
    scanf("%s%f%d", modelWanted, &maxPrice, &minYear);
    for (int i = 0; i < carAmount; i++)
        printf("Model is: %s, Price is: %.2f, Year is: %d\n", arr[i].model, arr[i].price, arr[i].year);
    findCar(&arr, minYear, maxPrice, modelWanted, carAmount);
    free(arr);
    return 1;
}

void findCar(car *arr[], int minYear, float maxPrice, char modelWanted,int carAmount)
{
    int i, counter = 0;
    for (i = 0; i < carAmount; i++)
        if (((strcmp(arr[i]->model, modelWanted)) == 0) && (arr[i]->year >= minYear) && (arr[i]->price <= maxPrice))
        {
            printf("Model is: %s, Price is: %.2f, Year is: %d\n", arr[i]->model, arr[i]->price, arr[i]->year);
            ++counter;
        }
    printf("We found %d cars for you!", counter);
}

1 Ответ

1 голос
/ 01 февраля 2020

Вы передаете указатель на массив struct

car *arr[]

, поэтому вместо доступа к элементам с помощью arr[i]->model, как вы делаете, вы должны получить к ним доступ с помощью (*arr)[i].model. Метод, который вы используете, предназначен для доступа к массиву указателей на элемент struct, но у вас есть указатель на массив struct.

Конечно, уже прокомментированный char вместо char* также вызовет ошибку времени выполнения, но Вы должны были получить предупреждение компилятора за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...