Tag: 铸造

如何将预处理器(宏)类型转换为输出int

我有一个非常简单的宏,我想将其输出类型转换为int 。 怎么做? #define Numbits(A) (sizeof(A)*CHAR_BIT) 我试过了: #define int Numbits(A)({int val; val = sizeof(A)*CHAR_BIT; return val;}) 但它也行不通

转换和copy_to_user宏

我需要将curr_task->pid (内核空间中的curr_task->pid复制到用户空间中具有很长空间的结构字段。 由于这是一个不断扩大的转换,我不期待任何问题。 但是,我收到一个令人讨厌的编译器警告( copy_long_to_user与copy_to_user一样用于所有意图和目的): cs300/process_ancestors.c:31:3: warning: passing argument 2 of ‘copy_long_to_user’ from incompatible pointer type [enabled by default] if(copy_long_to_user(&info_array[num_filled_kernel].pid, &curr_task->pid)) { ^ cs300/process_ancestors.c:9:5: note: expected ‘long int *’ but argument is of type ‘pid_t *’ 这个警告是我可以放心忽略的(编译器会为我做演员表)吗? 如果我需要明确地将curr_task->pid转换为long,那么如何在使用copy_to_user的上下文中执行此操作? 我的猜测是这样的: (copy_long_to_user(&info_array[num_filled_kernel].pid, &((long)curr_task->pid)))

简而言之

char *buffer; short num; memcpy(&num, buffer, sizeof(short)); *buffer – 指向*buffer指针,其中number位于HEX视图中。 我想把这个数字放在变量num而不调用memcpy 。 我该怎么做? number = (short) buffer; //DOESN’T work!

浮点值转换为char

在下面的代码中, #include int main(){ char array[] = {‘1’, 2, 5.2}; char* my_pointer = array[2]; printf(“%c”, *my_pointer); } 5.2存储在内存中的IEEE 754表示中,由于小端格式, char从此浮点表示中选取8位(第一个)。 C是一种松散类型的语言。 允许将float为char 。 为什么该计划是核心倾销?

将char转换为4位的位字段条目

你好伙计我正面临另一个问题,我正在研究单个位并从ascii文本中提取数据。 问题是编译器给出了一个错误,即将char(8位)转换为4位存储器字段可能会改变其值。 显然这是真的,但我怎么能克服这个错误呢? typedef struct { struct { unsigned int type: 4; unsigned int uid: 8; unsigned int operation: 4; unsigned int reg: 16; }header; char *arg_nm; } OWL_request; 完整的错误: error: conversion to ‘unsigned char:4’ from ‘char’ may alter its value [-Werror=conversion] 这是作业 request.header.type = (char)(j[0]-65); j是*char 我要做的是在不改变编译器标志的情况下摆脱错误

以不同类型访问数组成员的正确方法?

我有uint16_t 。 它的大部分成员都是uint16_t ,但有些是int16_t ,有些是uint8_t 。 你会怎么处理? 顺便说一句,我试过: 指针: 使用2个指针,一个int16_t*和另一个uint8_t* ,都初始化为数组的开头,以访问int16_t和uint8_t数组的成员。 (最初有效,但是我在程序后期遇到了一些问题,其他东西改变了指针的值,所以我不相信它。) 使用union进行类型定义。 在file.h中: typedef union { uint16_t u16[NO_OF_WORDS]; // As uint16_t int16_t s16[NO_OF_WORDS]; // As int16_t uint8_t u8[2 * NO_OF_WORDS]; // As uint8_t } ram_params_t; extern ram_params_t ram_params[]; 在file.c中: ram_params_t ram_params[] = {0}; (那真的很轰炸。) 铸件。 (我没有那么远。)

在mex上使用整数数组

我想将一个整数数组从MATLAB传递给C.我尝试使用类型uint64_T但它一直崩溃。 使用mxGetPr()获取双指针工作正常,但我需要将内容类型转换为整数,并且在每次迭代中这样做可能会很慢。 我在mexFunction中试过这个: uint64_T *l; l= (uint64_T *)mxGetData(prhs[1]); 调用此变量的函数具有以下forms: void XAction( const double *v, const uint64_T *l, double *w) { for (j=c; j; j–) for (i=r-1; i; i–) w[i] =v[l[r*j +i]] } 我在类型转换中犯了错误吗? 我已经看到了这个答案: 如何在MEX函数中读取整数数组,但我无法取得进展。

不允许在类型“const int ** const”和“int **”之间初始化,为什么?

使用V1.8 z / OS XL C编译器,使用INFO(ALL)警告升级,我在下面代码的第4行收到以下警告: WARNING CCN3196 Initialization between types “const int** const” and “int**” is not allowed. 1 int foo = 0; 2 int *ptr = &foo; 3 const int * const fixed_readonly_ptr = ptr; 4 const int ** const fixed_ptr_to_readonly_ptr = &ptr; 我无法理解为什么我会收到这个警告。 如果我可以为指向const int(第3行)的const指针分配一个int指针,那么为什么我不能将int指针的地址分配给指向const int的指针的const指针? 我错过了什么? 请注意,上面的代码是一个精简的示例,只是显示了我在少量代码中遇到的问题。 真正的上下文是我有一个const指针指向struct(struct s ** const),并将它作为参数传递给函数,该函数的参数被定义为指向const结构的const指针(const […]

C – *(long *)(host-> h_addr)是什么; 做?

我在这个例子中找到了以下代码: addr.sin_addr.s_addr = *(long *)(host->h_addr); h_addr是一个char指针, host是一个指向hostent类型结构的指针。 addr是sockaddr_in类型的结构, sin_addr是in_addr类型的结构。 s_addr是一个uint32 。 大部分信息可以在这里找到: http : //man7.org/linux/man-pages/man7/ip.7.html 我很确定(long)将char转换为long,但我不知道额外的星号是做什么的,特别是因为s_addr不是指针。 有人能解释一下这里发生了什么吗?

没有强制转换的整数指针

当我调用一个需要指针的函数,并传入一个值时,我得到了这个警告,我喜欢这样。 但是当值恰好是字面值’0’时,我没有得到警告。 我认为这是因为C认为它是空指针,而不是值。 有没有办法仍然得到0字面的警告,因为我已经有一些错误因为它。