- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用以下结构来使用隐写术对带有消息的 PPM 文件进行编码:
typedef struct{
char code[CODE_LENGTH];
COMMENT *commentPPM;
int width, height, max;
COLOR (*colorValues)[];
} PPM;
和颜色:
typedef struct{
unsigned char red, green, blue;
} COLOR;
及方法:
PPM *encode(char *text, PPM *img){
//tested
printf("entered encode\n");
PPM *newPPM;
newPPM = duplicate(img);
printf("duplicated ppm\n");
int x,y, currentChar, textLength;
textLength = strlen(text);
////
for(currentChar = x = y = 0; currentChar < textLength; currentChar++){
printf("the current character is %c\n", *(text+currentChar));
//between 1 and the width
x += (rand() % (newPPM->width -1)) + 1;
printf("generated %d for x\n",x);
if(x >= newPPM->width){
printf("%d is greater than width(%d)\n",x,newPPM->width);
x -= newPPM->width;
printf("%d is the new x\n", x);
y++;
printf("incremented y to be %d\n", y);
}
newPPM->colorValues[y][x].red = text[currentChar]; //error (1)
printf("changed the value of color[%d][%d].red, to be %d, which is %c\n",y,x, text[currentChar], text[currentChar]);
}
return newPPM;
}
如何访问(1)中看到的一维数组指针中的“red”?
编辑:我收到错误消息:“错误:无效使用具有未指定边界的数组 newPPM->colorValues[y][x].red = text[currentChar];"
编辑 2:我听说我无法访问
中的 colorValues 元素typedef struct{
char code[CODE_LENGTH];
COMMENT *commentPPM;
int width, height, max;
COLOR (*colorValues)[];
} PPM;
因为它没有指定宽度,所以我无法确定偏移量。然而,我这只是一个指向灵活数组成员的指针,它被分配了一个类型
ppmFile->colorValues = getColors(fd, ppmFile->width, ppmFile->height);
COLOR (*getColors(FILE *fd, int width, int height))[]{
COLOR (*colors)[width] = (COLOR(*)[width]) malloc(sizeof(COLOR[height][width]));
int i,j;
for(i = 0; i < height; i++) {
for(j = 0; j < width; j++) {
fscanf(fd,"%d %d %d", &colors[i][j].red, &colors[i][j].green, &colors[i][j].blue);
}
}
return colors;
}
已指定宽度。因此,如果我理解正确,当我将其传递回存储在结构中时,我将“丢失”偏移量(宽度)。但是,当我在加密方法中时,我可以访问宽度、高度以及当前的 x 和 y 位置,当然有一种方法可以告诉编译器这个灵活的数组成员具有宽度的偏移量,我确实这样做了printColors 方法并且它工作得很好(见下文),为什么我不能告诉编译器存储在 newPPM->colorValues 中的值具有宽度偏移量?
void printColors(int width, int height, COLOR (*colors)[width]){
int n, j;
for(n = 0; n < height; n++) {
for(j = 0; j < width; j++) {
printf("%d %d %d\n", colors[n][j].red, colors[n][j].green, colors[n][j].blue);
}
}
}
有没有办法强制转换 newPPM->colorValues 来告诉它具有偏移宽度?就像我对 printColors 中的颜色所做的那样
最佳答案
您可能会收到如下错误:
prog.c:10:14: error: subscript of pointer to incomplete type 'struct foo []'
thing->foos[0][0].bar;
~~~~~~~~~~~^
1 error generated.
作为引用,上面是编译此代码的输出:
struct foo { int bar; };
struct baz {
struct foo (*foos)[];
};
int main () {
struct baz * thing;
thing->foos[0][0].bar;
return 0;
}
编译器试图告诉您的是,它无法计算访问外部数组的后续元素所需的偏移量。原因是它不知道数组元素的大小(因为它们是不完整类型,缺少大小信息)。
基本上,它正在尝试计算(以下是伪语言,而不是 C)
thing + offset(foos) + 0 * sizeof(struct foo[]) + 0 * sizeof(struct foo) + offset(bar)
但它不能,因为它不知道sizeof(struct foo[])
。
这个问题的根源是你首先试图拥有一个指向可变长度数组的指针。将成员更改为
struct foo (*foos)[42];
通过给定数组圆顶大小来“解决”这个问题。
如果您想要一个 2D 数组,只需将其设为 1D,并附加所有内部数组即可。 (当然,这仅在它们大小相同时才有效,即如果您想要矩形二维数组)
struct foo * grid = malloc (sizeof (struct foo) * rows * columns);
// access using grid [c * rows + r]
关于c - 如何更改存储在结构体中的 VLA 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362344/
在this post ,OP 包含有很多错误的代码,但是 1 行让我特别好奇,因为我无法查找任何东西,不允许它。这是具体的行: int n = 100000, arr[n]; 是否保证了声明和初始化的
我需要定义一个结构体,其中包含两个信号量和三个(至少)或更多数组作为大小为变量的结构体成员。指示性示例(不是正确的语法,而是给出上下文含义;lr 是 double 的 typedef): int
函数的参数可以在后面的参数中使用吗?这是不好的形式吗? void print(int n, int m, int matrix[n][m]) { for (int i=0; i
C11 允许像这样使用 VLA 数组(和矩阵) int row = 10; int col = 10; double matrix[row][col]; 但是如果我只想将矩阵的一行传递给一个函数,我可
我写了最简单的矩阵乘法代码来完成我对 C99 VLA 的理解。让我有点困惑的是,当我在函数定义的参数列表中声明一个指向 VLA 的指针时。 例如,在 fill_matrix_randomly 中,声明
这样的函数原型(prototype)在 C 中有效吗? int (*func())[*]; 如果是,我该如何定义这样的函数? 最佳答案 您应该返回一个指向不完整数组类型的指针,因为可变长度数组的 *
在 C 中,我相信以下程序是有效的:将指向已分配内存缓冲区的指针转换为数组,如下所示: #include #include #define ARRSIZE 4 int *getPointer(in
您可能知道,VLA's haves pros and cons 和它们在 C11 中是可选的。 我想使 VLA 成为可选项的主要原因是:“堆栈可能会爆炸”: int arr[n]; /* where
我了解什么是可变长度数组以及它们是如何实现的。这个问题是关于它们为什么存在。 我们知道 VLA 只允许在功能块(或原型(prototype))中使用,并且它们基本上不能在堆栈上的任何地方(假设正常实现
这是允许的吗? goto inside; { inside: int a[n]; } A goto statement shall not jump from outside the scope of
我注意到 C 编译器(gcc、clang、tinycc)允许我在没有警告的情况下将指向较大数组的指针分配给指向较小 VLA 的指针: #include #if !__TINYC__ void tak
我使用以下结构来使用隐写术对带有消息的 PPM 文件进行编码: typedef struct{ char code[CODE_LENGTH]; COMMENT *commentPPM;
进一步开发昨天的代码( seg fault caused by malloc and sscanf in a function ),我尝试在网上找到的一些教程的帮助下生成一个 2-dim vla。但我
我有以下无法编译的代码。 using namespace std; void f(int); template void array_ini_1d(T1 (&x)[N]) { for (int i
我在 SO 上阅读了有关 VLA 的不同答案,但找不到答案。就我而言,我有一个分配内存的函数: template void allocMemory(T *&data, const size_t num
这是一种定义矩阵类型的方法 typedef struct { int nr, nc; double *elem; } Matrix; 我想定义这个 typedef struct {
我试图了解 sizeof 运算符的工作原理,我遇到了 this问题。以下是该问题的代码 #include int main() { int i = 0; int a[i];
CERT's Secure Coding Standard包括一项 ( API05-C ),它鼓励使用一致的数组参数,这是我在很多代码中实现的建议(对于不支持它们的编译器,隐藏在 a macro 后面
(这是后续 to this question 。) 我试图了解将多维数组传递给 C 中的函数的“最佳实践”(或任何实际实践)是什么。当然这取决于应用程序,所以让我们考虑编写一个函数来打印二维数组可变大
我们已经知道,VLA (在 C99 中标准化)不是 C++ 标准的一部分。 所以下面的代码在 C++ 中是“非法的”: void foo(int n) { int vla[n]; for (i
我是一名优秀的程序员,十分优秀!