我将一大块内存传递给我的子程序。在子程序中,我将此内存的一部分分配给内部1D数组指针。
public class TestDate {
public static void main(String[] args) {
// TODO Auto-generated method stub
String fromDate = "18-FEB-2018";
String toDate = "20-FEB-2018";
String requestDate = "19/02/2018";
System.out.println(checkBetween(requestDate,fromDate, toDate));
}
public static boolean checkBetween(String dateToCheck, String startDate, String endDate) {
boolean res = false;
SimpleDateFormat fmt1 = new SimpleDateFormat("dd-MMM-yyyy"); //22-05-2013
SimpleDateFormat fmt2 = new SimpleDateFormat("dd/MM/yyyy"); //22-05-2013
try {
Date requestDate = fmt2.parse(dateToCheck);
Date fromDate = fmt1.parse(startDate);
Date toDate = fmt1.parse(endDate);
res = requestDate.compareTo(fromDate) >= 0 && requestDate.compareTo(toDate) <=0;
}catch(ParseException pex){
pex.printStackTrace();
}
return res;
}
}
我如何指定第二个成员2D阵列?
答案 0 :(得分:2)
struct中的声明float c[][SIZE_C2]
声明了一个数组数组,这些数组在结构中内联存储。该声明不包含任何指向存储在别处的数组的指针。
如果您希望保留当前的结构签名,可以按以下方式填充c
:
memcpy(&obj->c, mem_p, SIZE_C1 * SIZE_C2 * sizeof(float));
这会将mem_p
中的数据复制到连续的数组c
中,之后c
不会引用来自mem
的任何数据,就像a
一样1}}和b
,而是拥有自己的数据副本。
请记住,您的struct当前将c
保存为“灵活的数组成员”,因为最外层的数组具有未指定的大小,这意味着您的结构必须通过malloc
或类似的动态分配。必须给予额外的空间来保存数组元素:
OBJ *obj = malloc(sizeof *obj + SIZE_C1 * sizeof(float));
如果您只打算在obj
中存储引用mem
引用的内存而不存储单独副本的指针,那么c
与a
和{{ 1}},您必须将结构中b
的声明更改为以下内容:
c
这声明float (*c)[SIZE_C2];
是“指向c
元素数组的指针”(可能在一个连续的数组序列中),而不是“{{1}的数组数组元素“。
这可以在SIZE_C2
函数中填充,如下所示:
SIZE_C2
如果您希望在init
之后分配更多obj->c = (float (*)[SIZE_C2]) mem_p;
字段,则可以继续递增float
,而不是将其转换为指向数组的指针,因为C中的数组只是其元素类型的大小乘以其元素的数量:
c
使用这种方法,元素仍然可以作为mem_p
访问,就像当前结构的签名一样。
由于指向数组的指针在C中使用有点棘手,并且要求内部数组具有固定大小,因此您可能会发现将/* sizeof(float [SIZE_C2]) == SIZE_C2 * sizeof(float) */
/* mem_p is a `float *` so goes up in steps of `sizeof(float)` */
mem_p += SIZE_C1 * SIZE_C2;
存储为常规单obj->c[1][2]
指针更合适并自己手动地解释元素,就好像它是一个二维数组,例如:
c
答案 1 :(得分:0)
我一直在想这个问题,也许你整个事情都过于复杂。据我所知,你开始使用静态分配的结构:
typedef struct
{
float a[SIZE_A];
float b[SIZE_B];
float c[SIZE_C1][SIZE_C2];
} OBJ;
现在您希望动态分配内存。因此,您分配一块大小为sizeof(float) * (SIZE_A + SIZE_B + SIZE_C1 * SIZE_C2)
的内存,并将结构中的指针设置为该内存。
但请注意那块内存是如何与原始结构的大小完全相同的?那么为什么不动态分配原始结构而不是将结构成员更改为指针?
void init( OBJ** obj, void* mem )
{
*obj = (Obj*)mem;
memset(mem, 0, sizeof(OBJ));
}
void cleanup( OBJ** obj) {
free(*obj);
*obj = NULL;
}
你甚至可以将malloc()移动到init()函数中,使其更容易使用,就像我在cleanup()中调用free()一样。
答案 2 :(得分:-1)
你做不到。在你的struct float c[][SIZE_C2];
中是一个二维浮点数组,它存在于struct中。它不是指向您可以指向您分配的内存的指针。你必须使c指向一个二维数组,如下所示:
#define SIZE_A 4
#define SIZE_B 8
#define SIZE_C1 12
#define SIZE_C2 16
struct Float2D {
float c[0][SIZE_C2];
};
typedef struct
{
// float a[SIZE_A];
// float b[SIZE_B];
// float c[SIZE_C1][SIZE_C2];
float* a;
float* b;
struct Float2D *c;
} OBJ;
void init( OBJ* obj, void* mem )
{
float* mem_p = (float*)mem;
obj->a = mem_p;
mem_p += SIZE_A;
obj->b = mem_p;
mem_p += SIZE_B;
obj->c = (struct Float2D*)mem_p;
}
注意:float c[0][SIZE_C2];
中的0是必需的,因为您不能只有flex数组的结构。这可能是gcc编译器扩展。也许你可以弄清楚如何在没有额外结构的情况下指定类型。