我有一些C代码来练习快速排序。我想用宏来获取数组的长度。宏在main()
函数中工作正常。但是当我在sort函数中使用宏时,它不会返回数组的长度。
请参阅我离开的代码中的评论。
另外,我想使用struct来创建名为“sort”和“quick_sort”的成员函数指针。任何擅长c编程的人都会给我一些建议,如果有一点我可以改进,无论语法,代码格式如何。我对struct中的sort和quick_sort函数格式感到有点奇怪。我的目的是使用Array结构来调用函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NELEMS(a) (sizeof(a) / sizeof(a[0]))
typedef struct _Array Array;
struct _Array
{
void (*sort)(int* arr);
void (*quick_sort)(int* arr, int l, int r);
};
void sort(int* arr);
void sort(int* arr)
{
// Issues here.
// The len is 2 not 5.
// the macro returns the sizeof arr here is 8, not 20.
int len = NELEMS(arr);
if(len == 0){
return;
}
void quick_sort(int* arr, int l, int r);
quick_sort(arr, 0, len-1);
}
void quick_sort(int* arr, int l, int r)
{
int j;
if(l < r)
{
j = partition(arr, l, r);
quick_sort(arr, l, j - 1);
quick_sort(arr, j+1, r);
}
}
int partition( int* a, int l, int r) {
int pivot, i, j, t;
pivot = a[l];
i = l; j = r+1;
while( 1)
{
do ++i; while( a[i] <= pivot && i <= r );
do --j; while( a[j] > pivot );
if( i >= j ) break;
t = a[i]; a[i] = a[j]; a[j] = t;
}
t = a[l]; a[l] = a[j]; a[j] = t;
return j;
}
void print_array(int* array, int len){
int i;
for(i = 0; i < len; i++)
printf("%d, \n", array[i]);
}
int main(int argc, char const *argv[])
{
int nums[5] = {5, 1, 3, 2, 4};
// len is 20 / 4 = 5. It works fine.
int len = NELEMS(nums);
Array *array = malloc(sizeof(Array));
array->sort = sort;
array->quick_sort = quick_sort;
sort(nums);
print_array(nums, NELEMS(nums));
return 0;
}
答案 0 :(得分:4)
该宏适用于prime = []
nprime = []
def first():
global prime
global nprime
prime.extend([1, 2])
nprime.extend([6, 4])
return (prime, nprime)
def second():
global prime
prime.extend([3, 7])
return prime
first()
A = second()
print A
,因为prime = []
nprime = []
def first(prime, nprime):
prime.extend([1, 2])
nprime.extend([6, 4])
return (prime, nprime)
def second(prime):
prime.extend([3, 7])
return prime
prime, nprime = first(prime)
prime = second(prime)
print prime
是一个数组,main
获取数组的大小。
但是,当它作为函数参数传递时,它会自动转换为指针。在nums
中,sizeof(nums)
只获得指针的大小。
您可以通过显式传递数组的大小来修复它。