微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

参数 NULL 不应该是

如何解决参数 NULL 不应该是

我必须对我的记录数组进行排序,但是当比较 2 个记录时,其中一个具有 NULL 值。此时我的 C 调试不起作用,所以如果有人可以给我一个链接来告诉我“如何”使用,在启动时会导致错误“Prelaunch 返回 -1 退出状态”,然后“文件没有路径中的exixt”...但这是一个offtopic,所以...我将我的代码留在下面,也许我使用指向函数的指针是错误的,因为我试图打印函数“比较”的每个调用显示我比我多一些时间。

主要内容

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


#define START_CAPACITY_RECORD 10

typedef struct {  
  int id;
  char* field1;
  int field2;
  float field3;
}Record;
int compare_record_int(void* ele1,void* ele2){
  if(ele1 == NULL){
    fprintf(stderr,"precedes_record_int_field: the first parameter is a null pointer");
    exit(EXIT_FAILURE);
  }
  if(ele2 == NULL){
    fprintf(stderr,"precedes_record_int_field: the second parameter is a null pointer");
    exit(EXIT_FAILURE);
  }
  Record *A = (Record*)ele1;printf("\n\nele1: %d",A->id);
  Record *B = (Record*)ele2;printf("\nele2: %d\n",B->id);
  if(A->id < B->id) return 1; 
  else if(A->id > B->id)return 2;
  return 0;
}
int GetRecord(char* file_name,Record* A){
    FILE *fd = fopen(file_name,"rt");int i=0;
    char* st=(char*)malloc(100*sizeof(char*));
    
    if(fd == NULL){
      printf("GetRecord:path file doesn't exist");
      exit(EXIT_FAILURE);
    };
    
     while(!feof(fd)){
        fscanf(fd,"%s\n",st);
        A[i].id=atoi(strtok(st,";"));
        A[i].field1 = strdup(strtok(NULL,";"));
        A[i].field2 = atoi(strtok(NULL,";"));
        A[i].field3 = atof(strtok(NULL,";"));
        i++;     
    }
    fclose(fd);
    return i; 
}
void print_record(void* record){
    Record *B = (Record*)record;
    printf("\nValore %d field1 %s field2 %i field3 %f ",B->id,B->field1,B->field2,B->field3);
}
int main(int argc,char* argv[]){
    
    OrderedArray* b = ordered_array_create();
    Record* A = (Record*)malloc(START_CAPACITY_RECORD*sizeof(Record));
    
    int dim = GetRecord("TEST.csv",A);
   
    for(int i = 0; i<dim;i++){
      ordered_array_add(b,&A[i]);
    }
    ordered_array_print(b,print_record);
    ordered_array_sort_by(b,compare_record_int);
    ordered_array_print(b,print_record);
    ordered_array_free(b);
    free(A);
}

Library(仅包含排序方法的部分,其他人请在评论中编辑):

void ordered_array_sort_by(OrderedArray * a,int (*compare)(void*,void*)){
    if(a== NULL){
    fprintf(stderr,"ordered_array_sort_by: ordered_array parameter cannot be NULL");
    exit(EXIT_FAILURE);
  }
  if(compare == NULL){
    fprintf(stderr,"ordered_array_sort_by: function parameter cannot be NULL");
    exit(EXIT_FAILURE);
  }
    a->compare = compare;
    a->array = array_merge_binary_insertion(a);
}
void** array_merge_binary_insertion(OrderedArray *a){
    if (ordered_array_size(a) == 1)return a->array;
    int m = ordered_array_size(a) / 2;
    OrderedArray *B = ordered_array_create(m);
    for(int i=0;i<m;i++)ordered_array_add(B,a->array[i]);
    OrderedArray *C = ordered_array_create(m);
    for(int i=m;i<ordered_array_size(a);i++)ordered_array_add(C,a->array[i]);
    if (m <= 10){
       B->array = array_binary_insertion(B->array,ordered_array_size(B),a->compare);  
       C->array = array_binary_insertion(C->array,ordered_array_size(C),a->compare);
    }else{
        B->array = array_merge_binary_insertion(B);
        C->array = array_merge_binary_insertion(C);
    }
    return array_merge(B->array,C->array,a->compare);
   
}
void** array_merge(void** B,void** C,void*)){
  if (B == NULL) return C;
    else if (C == NULL) return B;

    int dimB = sizeof(B) + 1;
    int dimC = sizeof(C) + 1;
    OrderedArray *X = ordered_array_create(dimB+dimC);
    
    int x = 0,y = 0,i = 0;
    while ((i < dimB) || (x < dimC)){
        if((B[i]==NULL)||(C[i]==NULL))printf("\nerrore");
        if ((*compare)(B[i],C[x]) == 1){
            X->array[y] = B[i];
            i++;
        } else{
            X->array[y] = C[x];
            x++;
        }
        y++;
    }
    return X->array;
}
void** array_binary_insertion(void** array,int size,void*)){             
    //ricontrollare la funzione,non sistema bene
    if(size == 1)return array;
    int j = 0,x,y,temp;
    OrderedArray *temp_array = ordered_array_create(size);
    temp_array->array[0] = array[0];
    for (int i = 1; i < size; i++){        
        temp = (int)array[i];
        x = array_binary_search(temp_array->array,temp,j,compare);
        y = j;
        while (y >= x){
            temp_array->array[y + 1] = temp_array->array[y]; 
            y--;
        }
        temp_array->array[x] = (void*)temp;
        j++;
    }
    return temp_array->array;
}
int array_binary_search(void** array,int a,int l,int h,void*)){
    if((array[l]==NULL)||((void*)a==NULL))printf("\nerrore");
     if (l >= h){
        if ((*compare)((void*)a,array[l]) == 2)
            return l + 1;
        else
            return l;
    }
    int m = (l + h) / 2;
    if ((*compare)((void*)a,array[m]) == 0)
        return m + 1;
    else if ((*compare)((void*)a,array[m]) == 2)
        return array_binary_search(array,a,m + 1,h,compare);
    else
        return array_binary_search(array,l,m - 1,compare);
}

同时,如果您有其他建议,我们将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。