2016-09-21 4 views
1

ich bei folgendem Problem helfen muß:C - Längste Subarray bestimmter Elemente aus gegebener Array

ein Array arr von structs

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

druckt die längste Unteranordnung von Elementen aus dem Array arr solche Da die arr Element hat mehr oder gleich price als einige value, die gelesen wird.

Funktion zu überprüfen, ob Element größer oder gleich ist als ein pricevalue als Argument einer Funktion angegeben void subarray(product *arr,int n,int (*check)(product * ,float), product *newArr,int *len_newArr,float value) newArr wo der Ausgang Subarray ist.

ist hier mein Code:

#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; 
} 

Das Programm gibt Warnungen assignment makes pointer from integer without a cast in Zeile

//begin with the next subarray 
    current_len=1; 

und comparison between pointer and integer in Zeile

//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); 
+0

wollen Warum Sie 'current_len' als Zeiger erklären kann? Und was denkst du, wenn du diesen Zeiger auf "0" initialisierst? –

+0

Ich sehe auch nicht, warum Sie 'newArr' und' len_newArr' als Argumente für die Funktion übergeben? Sie werden nicht außerhalb der "Subarray" -Funktion verwendet. Und wenn Sie 'newArr' außerhalb der Funktion verwenden, müssen Sie einen Zeiger auf den Zeiger (d. H.' Product ** ') an die Funktion übergeben. –

+0

Schließlich ordnen Sie Speicher für 'newArr' in der 'Subarray'-Funktion zu, aber Sie initialisieren es nie, bevor Sie den Inhalt davon drucken. Viele Dinge, die zu * undefiniertem Verhalten * führen (oder könnten). –

Antwort

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

Diese

 *current_len++; 

entspricht *NULL++ und Sie können nicht dereferenzieren einen Zeiger auf NULL. [More info]

Hier gilt das gleiche:

*current_len=1; 

Es scheint, dass Sie eine einfache int statt einen Zeiger auf int