Tag: 类型

hsc2hs:使用Haskell改变C结构

我正在尝试编写一个与C通信的Haskell程序(最终通过GHC-iOS为iOS)。 我希望它将一个字符串从C传递给Haskell,让Haskell处理它,然后通过hsc2s将一些数据类型从Haskell返回到C Structs。 我找不到一个清晰,简单的教程是不成功的。 Haskell唯一需要的是String,没有别的。 我对第一部分没有任何问题,将字符串传递给Haskell。 testPrint :: CString -> IO () testPrint c = do s <- peekCString c putStrLn s 出于测试目的和将来的参考,我只想能够处理如下的内容。 C结构 struct testdata { char *a; char *b; int c; }; Haskell数据类型 data TestData = TestData { a :: String, b :: String, c :: Int } deriving Show — not sure […]

C中的运行时条件typedef

我知道这个问题有一个C ++版本,但是我使用的是标准的typedef而不是模板。 我编写了一个适用于16位wav文件的程序。 它通过将每个样品加载到一个短片中来实现。 然后程序在短路上执行算术运算。 我现在正在修改程序,因此可以同时使用16位和32位的wav。 我希望做一个条件typedef,即使用16位的short和32位的int。 但后来我意识到,如果编译器事先不知道变量的类型,编译器可能就不会编译代码。 所以我试着测试下面的代码: #include int main() { int i; scanf(“%i”, &i); typedef short test; if(i == 1) typedef short sample; else typedef int sample; return 0; } 并得到以下编译器错误: dt.c: In function ‘main’: dt.c:12:5: error: expected expression before ‘typedef’ dt.c:14:5: error: expected expression before ‘typedef’ 这是否意味着C中的运行时条件typedef不可能? [开放式问题:]如果没有,你们将如何处理这样的事情?

char数组可以与任何数据类型一起使用吗?

malloc()函数返回void*类型的指针。 它根据作为参数传递的size_t值以字节为单位分配内存。 生成的分配是原始字节,可以与C中的任何数据类型一起使用(无需转换)。 可以在返回void *的函数中声明类型为char的数组,可以与任何数据类型一起使用,例如生成的malloc分配吗? 例如, #include void *Stat_Mem(); int main(void) { //size : 10 * sizeof(int) int buf[] = { 1,2,3,4,5,6,7,8,9,10 }; int *p = Stat_Mem(); memcpy(p, buf, sizeof(buf)); for (int n = 0; n < 10; n++) { printf("%d ", p[n]); } putchar('\n'); return 0; } void *Stat_Mem() { static char Array[128]; return […]

如何在大多数平台上使用C99标准类型以实现最大的可移植性和效率?

首先,这是我理解并思考问题的真实情况。 对单个变量(如计数器或循环索引)使用快速数据类型。 例如: #define LOOP_COUNT (100U) uint_fast8_t index; for(index = 0; index < LOOP_COUNT; index++){ /* Do something */ } 我想这里最合适的类型是uint_fast8_t因为index永远不会超过255,这将是所有平台上最快的实现。 如果我使用unsigned int代替它,它将在> = 16位平台中最快,但在<16位平台中将更慢,因为int是标准的最小16位。 此外,如果我使用uint8_t ,它将在> 8位平台上变慢,因为编译器添加AND 0xFF指令来检查每个增量的溢出(我的ARM7编译器甚至在全速优化时也这样做)。 size_t也不是一个选项,因为它可能大于本机整数大小。 如果预计8位溢出,那么这边是坏的(?),它就不会发生。 程序员应该手动检查溢出(因为他/她应该恕我直言),这可能会导致错误的代码,如果忘记。 此外,如果LOOP_COUNT在8位平台上“意外”设置为大于255的值,编译器(甚至PC-Lint让我惊讶)也不会发出任何警告/问题,但警告将在8位平台上生成,这将降低可移植性并引入错误,但这可以通过#if检查来避免。 如果像数组或结构中那样关注内存使用情况,请尽可能使用最少的数据类型。 例如: uint_least8_t array[100]; 如果关注内存使用情况,它是最便携,最有效的声明数组的方法。 如果平台上可以进行字节访问,则此类型将提供字节数组,否则将提供最小的可访问宽度整数数组。 此外,如果我们有结构数组,则可以在结构中使用最少类型。 最小类型也可能遇到快速类型的问题,因为对于这两种情况,可以在不同平台上改变变量的宽度。 尽可能避免使用固定宽度的数据类型,因为在某些平台上它们甚至可能不存在,除了硬件寄存器访问,通信协议映射等,我们需要知道变量的确切位。 例如: typedef struct { uint8_t flags; uint8_t length; uint8_t data[100]; uint16_t crc; } […]

为什么Win32 API中没有使用标准数据类型?

我一直在学习Visual C ++ Win32编程。 为什么使用DWORD , WCHAR , UINT等数据类型而不是unsigned long , char , unsigned int等等? 我必须记住何时使用WCHAR而不是const char *,这真的很烦我。 为什么不首先使用标准数据类型? 如果我记住Win32等价物并将它们用于我自己的变量会有帮助吗?

用于复杂数据类型的Typedef

我试图从语法的角度理解C如何处理复杂的typedef的基础机制。 请考虑以下示例(问题末尾包含的参考资料)。 typedef int (*p1d)[10]; 是正确的声明,即p1d这里是一个指向10个整数数组的指针,就像在使用Array类型的声明下一样。 请注意,这与…不同 typedef int *p1d[10]; 这将使p1d成为类型为int的10个指针数组的名称。 所以,如果我考虑两个例子的运算符优先级(我将重写它们): int *p1d[10]; // Becomes … int* p1d[10]; 因此,从左到右阅读,并使用运算符优先级,我得到:“指向类型int的指针,名为p1d,大小为10”,这是错误的。 至于其他/第一种情况: int (*p1d)[10]; 我读作“p1d是一个int类型的指针,并且是一个包含10个这样的元素的数组”,这也是错误的。 有人可以解释用于确定这些typedef的规则吗? 我也想将它们应用于函数指针,我希望这个讨论也能解释const casts背后的逻辑(即:指向常量数据的指针和指向变量数据的const指针)。 谢谢。 参考文献: C教程:指向数组:指南http://www.taranets.net/cgi/ts/1.37/ts.ws.pl?w=329; b = 285 运营商优先顺序: http : //www.swansontec.com/sopc.html

返回指向函数指针的函数的N个指针数组

这是在接受采访时向我询问的! 我真的很困惑 如何声明一个N指针数组的数组,返回指向返回指向字符指针的函数的指针 有人可以帮忙吗?

在C / C ++中创建一个10位数据类型

可以创建10位数据类型吗? 我可以使用uint16_t , uint32_t等,但如果我想使用uint10_t或uint12_t怎么uint12_t ? 这可能吗?

scanf从一个输入读取多种数据类型

所以我试着以mx+b=y的forms读出一个等式。 如何使用scanf读取多种数据类型? 我尝试过使用类似的东西: scanf(” %d %c %c %d %c %d”, &num1, &variable, &sign, &num2, &equal_sign, &num3); 在这种格式中,它正确读取num1但不知何故跳过将第一个字符分配给变量,而是将其放入符号中。 任何帮助将不胜感激。 谢谢

K&R C编程语言1.5.1(文件复制)

好吧,我几个月前读过另一本“知名”的C书(用我的语言),我从来没有学到这一点。 K&R在20页中写出3章的方式简直令人惊叹,当然我不能指望大量的解释,但这也会引发问题。 我对这一点有疑问1.5.1这本书说(第16页): main(){ int c;// <– Here is the question c=getchar(); while (c != EOF){ putchar(c); c = getchar(); } } […] char类型专门用于存储此类字符数据,但可以使用任何整数类型。 我们使用int是一个微妙但重要的原因。 问题是区分输入结束和有效数据。 解决方案是,当没有更多输入时,getchar会返回一个独特的值,这个值不能被任何真实字符所包含。 对于“文件结束”,该值称为EOF。 我们必须声明c是一个很大的类型,可以保存getchar返回的任何值。 我们不能使用char,因为除了任何可能的char之外,c必须足够大以容纳EOF。 因此我们使用int。[…] 在谷歌搜索另一个解释后: EOF是一个特殊的宏,表示文件结束(Linux:在键盘上使用CTRL + d来创建它,Windows命令:使用CTRL + z(可能必须在新行的开头,然后是RETURN)):通常EOF = -1,但依赖于实现。 必须是对任何可能的字符都不是有效值的值。 因此,c的类型为int(不是人们可能预期的char)。 所以我修改了从int到char的源代码,看看问题是什么,关于获取EOF值…但是没有问题。 以同样的方式工作。 我也没有不好意思,getchar如何处理我写的每个角色,并打印所有内容。 Int类型长度为4bytes,因此变量中可以包含4个字符。 但我可以放任意数量的字符,它会以相同的方式读写所有内容。 和char一样,发生了同样的事情……真的发生了什么? 当超过1-4个字符时,值存储在哪里?