Tag: 数组

将struct作为字节数组进行访问

我目前正在重写程序以处理使用RDM协议通过串行连接接收的数据,每个数据包由UART接收并具有特定结构但长度可能不同,数据包结构示例如下,假设数据包中的字节数为n(这可能会根据数据包的内容而改变) 我想要做的是在我的C代码中定义一个结构,该结构具有定义的各种参数,但是能够从UART读取和写入结构中的字节,就像结构只是uint8_t的数组一样。 我的问题是我已经读过结构可能并不总是存储在连续的内存部分中,因此采用&RDMPacket1并通过结构递增可能最终导致数据不在正确的位置。 我的另一个问题是,如果我有一个数组来存储结构内最大可能长度(220字节)的数据包数据,那么数据包末尾的校验和将被写入错误的位置。 可以使用哪些方法来接收数据并将其放入结构中? 数据包定义示例(从标准缩短) Byte | Description 0 | START Code – Constant, can be ignored 1 | Sub-Start Code – Contains command for device to process 2 | Message Length – Points to byte number of Checksum High (up to 255) 3-8 | Destination UID – Unique ID of packet Destination 9-14 […]

字符串常量与C中的char数组

可能重复: C中的char s []和char * s有什么区别? 更多的是一般性问题,而不是试图解决问题,我一直在阅读C编程语言书,他们注意区分 char amessage[] = “blah”; char *pmessage = “blah”; 一个是char数组,另一个是指向字符串常量的指针。 他们说修改char数组是可以接受的,但你不应该修改字符串常量,因为它会触发未定义的行为。 我的问题是:不是以与char数组相同的方式存储在内存中的字符串常量吗? 为什么我可以修改它 char *p = “this is a string constant”; *(p+2) = ‘a’; printf(“%s”, p); 如您所料,结束打印“thas是一个字符串常量”。 我可以理解它是如何有意义的,因为字符串常量不应该最终在运行时被更改,因为它可能会混淆其他人/你自己处理你的代码并不期望它的价值改变,但纯粹function性的术语是什么错误的什么是可能触发的未定义行为,以及当char数组不能时它会如何机械地适得其反? 我只是想知道我是否遗漏了一些关于字符串常量如何在内存中工作以及编译器如何看到它们的内容。

C / C ++优化数据结构,数组数组或只是数组

使用一个使用16字节4v4单字节矩阵的程序: unsigned char matrix[4][4]; 和一些256字节16v16一个字节矩阵: unsigned char bigMatrix[16][16]; 通常由于数据操作,我被迫在程序中逐列循环,从而导致缓存未命中。 如果我使用数组,性能会提高,即 unsigned char matrix[16]; unsigned char matrix[256]; 并通过使用一些变量来检索元素来访问元素,即 matrix[variableA*variableB + i]; 每次我想访问一个元素时,需要重新计算variableA * variableB + i。 我只想要速度优化和内存没问题。 这会有什么帮助,比如给出一些性能上的打击或损失,还是差异太小甚至无法照顾?

所有数组元素的比较 – C算法

我有一个矩阵m * n ,对于每一行,我需要比较它们之间的所有元素。 对于我发现的每对情侣,我将调用一个将执行某些计算的函数。 例: my_array -> {1, 2, 3, 4, 5, …} I take 1 and I have: (1,2)(1,3)(1,4)(1,5) I take 2 and I have: (2,1)(2,3)(2,4)(2,5) and so on 使用CI写道: for (i=0; i<array_length; i++) { for (k=0; k<array_length; k++) { if (i==k) continue; //Do something } } } 我想知道我是否可以使用复杂度较低的算法。

如何在编译时确定数组的长度?

是否有可以在GCC编译时返回数组长度的宏或内置函数? 例如: int array[10]; 对于: sizeof(array) == 40 ???(array) == 10 Update0 我可能只是指出在C ++中这样做是微不足道的。 可以构建一个返回[]内部数字的模板。 我确信我曾经在Visual C ++编译器中找到了一个dimof和dimof宏/内置,但是再也找不到它了。

如何在C中为char **动态分配内存

我将如何在此函数中动态分配内存到char **列表? 基本上这个程序的想法是我必须从文件中的单词列表中读取。 我不能假设最大字符串或最大字符串长度。 我必须用C字符串做其他的东西,但那些东西我应该没问题。 谢谢! void readFileAndReplace(int argc, char** argv) { FILE *myFile; char** list; char c; int wordLine = 0, counter = 0, i; int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0; myFile = fopen(argv[1], “r”); if(!myFile) { printf(“No such file or directory\n”); exit(EXIT_FAILURE); } while((c = fgetc(myFile)) !=EOF) { numberOfChars++; […]

部分排序数组C.

我有一个看起来像这样的数组: int array[] = {4.53, 3.65, 7.43, 9.54, 0.72, 0.0} 我只是想知道我可以使用什么方法来对这个数组进行部分排序,以便将前三个最大的双打带到前面。 我正在寻找最有效的方法来获得这个数组中前三个最高的数字。 到目前为止,我一直在使用qsort ,但我只是在寻找另一种方法来做到这一点,甚至更快。 我知道qsort在最好的情况下是O(nlogn) ,在最坏的情况下是O(n^2) ,但有没有更有效的方法来实现这个问题? 高效的意思是比O(nlogn)更好的方法。 任何帮助都会很棒

将数据从文件放入C中的数组

这是我的代码。 #include #include int main() { //Vars FILE *fp; char word[9999], *arrayOfWords[9999]; int wordCount = 0, i; //Actions fp = fopen(“data.txt”, “r”); if(fp != NULL) { while(!feof(fp)) { fscanf(fp, “%s”, word); arrayOfWords[wordCount] = word; wordCount++; } for(i = 0; i < wordCount; i++) { printf("%s \n", arrayOfWords[i]); } puts(""); } else { puts("Cannot read the […]

C编程动态初始化2D数组

我在这里做一些愚蠢的事情,我无法确切地指出: void init_data(double **data, int dim_x, int dim_y) { int i,j,k; data = (double **) malloc(sizeof(double) * dim_x); for (k = 0; k < dim_y; k++) { data[k] = (double *) malloc(sizeof(double) * dim_y); } for (i = 0; i < dim_x; i++) { for (j = 0; j < dim_y; j++) { data[i][j] = […]

难以理解C中的可变长度数组

当我发现数组大小必须在声明时给出或者在运行时使用malloc从堆分配时,我正在读一本书。我在C中编写了这个程序: #include int main() { int n, i; scanf(“%d”, &n); int a[n]; for (i=0; i<n; i++) { scanf("%d", &a[i]); } for (i=0; i<n; i++) { printf("%d ", a[i]); } return 0; } 这段代码工作正常。 我的问题是这个代码是如何正常工作的。不是违反C的基本概念,数组大小必须在运行时之前声明或在运行时使用malloc()分配它。我不做这两件事中的任何一件,那它为什么它正常工作? 我的问题的解决方案是C99支持的可变长度数组,但是如果我玩我的代码并将语句放入int [n]; 在scanf(“%d,&n)之上;然后它停止工作为什么它如此。如果C中支持可变长度数组?