C - Самый длинный подмассив указанных элементов из данного массива

Мне нужна помощь в следующей проблеме:

Учитывая массив arr из structs

typedef struct
{
    char name[20];
    float amount,price;
}product;

Выведите самый длинный подмассив элементов из массива arr такой, что элемент arr имеет большее или равное price, чем некоторое value, которое читается.

Функция для проверки того, имеет ли элемент большее или равное price, чем value, задается в качестве аргумента функции void subarray(product *arr,int n,int (*check)(product * ,float ), product *newArr,int *len_newArr,float value), где newArr — выходной подмассив.

Вот мой код:

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

typedef struct
{
    char name[20];
    float amount,price;
}product;

void subarray(product *arr,int n,int (*check)(product * ,float ),
                product *newArr,int *len_newArr,float value)
{
    len_newArr=0;
    int *current_len;
    current_len=0;
    int i;

    for(i=0;i<n;i++)
    {
        //if condition is true, increment current length of newArr
        //and store that element to newArr
        if((*check)(arr+i,value))
        {
            current_len++;
            newArr[i]=arr[i];
        }
        else
            //begin with the next subarray
            current_len=1;

        //update newArr length
        if(current_len > len_newArr)
            len_newArr=current_len;
    }

    newArr=calloc(*len_newArr , sizeof(product));

    //print the subarray
    for(i=0;i<len_newArr;i++)
        printf("%-19s %6.2f %6.2f\n",newArr[i].name,newArr[i].amount,newArr[i].price);
}

int check(product *pr,float value)
{
    if(pr->price >= value)
        return 1;
    return 0;
}

void inputProduct(product *pr)
{
    printf("name: ");
    scanf("%s",pr->name);
    printf("amount: ");
    scanf("%f",&pr->amount);
    printf("price: ");
    scanf("%f",&pr->price);
}

int main()
{
    int n,i;
    product *arr,*newArr;
    int len_newArr;
    float value;

    do
    {
        printf("n = ");
        scanf("%d",&n);
    }
    while(n<1);

    arr=malloc(n * sizeof(product));
    newArr=calloc(n,sizeof(product));

    for(i=0;i<n;i++)
    {
        printf("%d. product: \n",i+1);
        inputProduct(arr+i);
    }

    printf("value: ");
    scanf("%f",&value);

    subarray(arr,n,&check,newArr,&len_newArr,value);

    return 0;
}

Программа выдает предупреждения assignment makes pointer from integer without a cast в строке

    //begin with the next subarray
    current_len=1;

и comparison between pointer and integer в строке

//print the subarray
for(i=0;i<len_newArr;i++)
    printf("%-19s %6.2f %6.2f\n",newArr[i].name,newArr[i].amount,newArr[i].price);

person ufo    schedule 21.09.2016    source источник
comment
Почему вы объявляете current_len указателем? Как вы думаете, что делает инициализация этого указателя на 0?   -  person Some programmer dude    schedule 21.09.2016
comment
Я также не понимаю, почему вы передаете newArr и len_newArr в качестве аргументов функции? Они не используются вне функции subarray. И если вы используете newArr вне функции, вам нужно передать указатель на указатель (т.е. product **) в функцию.   -  person Some programmer dude    schedule 21.09.2016
comment
Наконец, вы выделяете память для newArr в функции subarray, но никогда не инициализируете ее до того, как напечатаете ее содержимое. Много-много-много вещей, которые приводят (или могут) привести к неопределенному поведению.   -  person Some programmer dude    schedule 21.09.2016


Ответы (1)


int *current_len=0; /* assigining NULL to a pointer to int */

Этот

        *current_len++;

Эквивалентно *NULL++, и вы не можете разыменовать указатель на NULL. [Подробнее]

То же самое:

*current_len=1;

Кажется, вам нужен простой int вместо указателя на int

person David Ranieri    schedule 21.09.2016