我想根据计算初始化一个数组,但是当我尝试这样做时编译器给我一个错误(我使用的是 GCC 版本 6.3.0):
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
char textgrid[SCREEN_HEIGHT/16][SCREEN_WIDTH/16];
Run Code Online (Sandbox Code Playgroud)
编译器错误如下:
error: variably modified 'textgrid' at file scope
Run Code Online (Sandbox Code Playgroud)
有没有办法在文件范围内执行此操作?
看来我不能使用计算作为 #define 语句的一部分来完成此操作,因为以下给出了相同的错误:
#define TEXTGRID_WIDTH (SCREEN_WIDTH / 16)
#define TEXTGRID_HEIGHT (SCREEN_HEIGHT / 16)
char textgrid[TEXTGRID_HEIGHT][TEXTGRID_WIDTH];
Run Code Online (Sandbox Code Playgroud) 我有一个练习,我应该使用固定大小的数组和输入/输出参数来处理矩阵(添加,扫描,打印等),但我想在任意长度的矩阵上做它并返回它们不是每次都添加更多(in /)输出参数(因此可能允许更"功能"的风格).
由于我想返回它们,我想我可能需要malloc来保持数组在内存中传递函数作用域.因为我想使用多维下标符号(mat[x][y]而不是mat[x*len+y]或者mat+x*len+y)我想我应该使用某种vla或者转换...但似乎强制转换为数组(但我经常返回指针,以及如何使用下标符号如果我不能投射吗?),我可能"可能没有像编译器那样初始化一个可变大小的对象"(即使它不是直接的数组而是指向数组的指针),就像使用这种表示法一样:
int *tab[x][y]=malloc(x*y*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果我像3手工一样用常量值替换x和y,我也会得到"无效的初始化器" .
我通过差不多一个星期的搜索,也许这是不可能的,我应该继续前进...我也发现了这个符号,对我来说看起来像函数指针表示法,除非它是一种优先考虑*运算符的方法...
int (*tab)[x][y]=malloc(x*y*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
但是,我并不完全确定理解这种表示法,然后以这种方式从打印/填充数组中获取随机值.
以前我曾尝试使用VLA(可变长度数组)和GNU扩展来提供数组长度作为参数:
void
printMat (int h, int w; int tab[h][w], int h, int w)
{
[code using tab[x][y]]
}
Run Code Online (Sandbox Code Playgroud)
但我很快意识到我需要用指针和malloc来处理一个"添加"函数,添加两个矩阵并返回一个指向新的malloc'ed矩阵的指针......
我特别想知道,如果我不够具体,我应该如何声明参数和返回类型,以便能够将它们用作多维数组而不必使用中间变量,同时实际传递指针(无论如何,这已经是正常的多维数组作为参数做对了吗?)
好吧经过多次测试和尝试后,它现在按照我的意图工作,即使我不确定是否已经很好地理解了所有内容,尤其是指针是什么,什么不是(我可能会因为试图弄清楚gdb这个而感到困惑,我应该进一步调查一下,正常的单维或多维数组是否被gdb视为地址,等等),而今天我的睡眠/休息时间并没有达到最佳状态.
现在,我想对我最初问题的第二部分给出正确答案:如何回归?是否有一个适当的泛型类型(除了无意义void*),它可能被用于指向二维数组的指针(比如int(*)[][]但这会起作用吗?)?如果太通用,什么是投射返回指针的正确方法,所以我可以使用多维下标表示法?是对的(int(*)[3][3])吗?
然而,如果我没有得到任何令人满意的结果(一个合理的 - 足够的"它在C中是不可能的"我猜),我会设置@JohnBod当前的答案来解决问题,因为他通过一个完整的确定了多维vla malloc多维数组的解释性答案,完全回答问题的第一部分,并在第二部分的路径上给出了几个答案(如果有的话).
#include <stdio.h>
#include <stdlib.h>
void
print_mat (int x, int y; int mat[x][y], int x, int y)
{
for (int i = 0; i < x; …Run Code Online (Sandbox Code Playgroud) c arrays pointers multidimensional-array variable-length-array
我是 Vue 新手,这也是我在 Vue 上的第一个项目。我有三个包含空值的输入字段。select如果输入字段 1 收到超过 5 个字符,是否有办法自动转到第二个输入字段或使其移动?并转到输入字段 3,或者如果输入字段 2 包含超过 5 个字符,则选择输入字段 3?
看法
<div id="app">
<h2>Input Fields:</h2>
<div v-for="(todo,index) in todos" :key="index">
<b-form-input type="text" v-model="todo.datatype" :value="todo.id" placeholder="Insert Datatype"
v-on:input="moveToNextField($event)"></b-form-input>
/** If the input field 1, consists more than 5 characters. Automatically move on to second input field **/
<br>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
脚本
new Vue({
el: "#app",
data: {
todos: [
{ id: "1", datatype: ""},
{ id: "2", datatype: ""},
{ id: "3", datatype: ""} …Run Code Online (Sandbox Code Playgroud) 我正在编写一段遗留代码(没有测试)。我偶然发现了隐藏在几个宏中的部分。如果使用 GCC 的-Wvla.
有问题的代码相当于在这个小程序中可以看到的代码:
\ntypedef struct entry {\n unsigned index;\n unsigned reserved;\n unsigned value;\n} entry_t;\n\nint main(int argc, char **argv) {\n long pa = 0;\n long res = pa + sizeof(entry_t[10 - argc]);\n return res;\n}\nRun Code Online (Sandbox Code Playgroud)\n编译时,会发出警告:
\n$ gcc -g -Wvla repro-vla.c\nrepro-vla.c: In function \xe2\x80\x98main\xe2\x80\x99:\nrepro-vla.c:9:5: warning: ISO C90 forbids variable length array [-Wvla]\n 9 | long res = pa + sizeof(entry_t[10 - argc]);\n | ^~~~\n\nRun Code Online (Sandbox Code Playgroud)\n罪魁祸首当然是这个表达式:sizeof(entry_t[10 - argc])。这里的语法有点混乱。我相信会创建一个用于10 - argc类型条目的临时匿名数组entry_t …
我的代码包含以下行:
int counts[config.max_c];
Run Code Online (Sandbox Code Playgroud)
我很惊讶地看到它在gcc没有任何标志的情况下使用默认编译而没有问题.根据man gccc代码的默认标准是gnu89.这个标准是否支持这种类型的数组初始化,如果是这样,我在哪里可以找到参考?
这两种形式的数组声明是否正确?
第一:
int n;
n=3;
int A[n];
Run Code Online (Sandbox Code Playgroud)
第二:
#define N 300;
.
.
.
.
int a[N];
Run Code Online (Sandbox Code Playgroud)
对我来说,这两种方式完全有效,但有人告诉我,第一种方式是错误的.
第一个就是说:
int A[10];
Run Code Online (Sandbox Code Playgroud)
所以,对我来说,说第一个无效是没有多大意义的.
但要完全确定,我想在这里问一下.它只是关于编程风格还是第一个不是正确的方式?
谢谢.
我做了一个家庭作业的程序,它在运行时没有任何错误崩溃.
在纠正之后,任何提高我的编码方法效率的建议都会受到赞赏.
首先,我将m,n,p,q声明为全局变量,我只将数组传递给函数,但程序表现得很奇怪.
然后我将数组的维度作为参数包含在每个函数中,并在任何地方声明它.CRASH
*VLA支持
//functions on matrices
#include<stdio.h>
int i, j;
void getMatrix(int m, int n, int values[m][n]);
void displayMatrix(int m, int n, int values[m][n]);
void transposeMatrix(int m, int n, int values[m][n]);
void addMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]);
void multiplyMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]);
int main()
{
int m, n, p, q, A[m][n], B[p][q];
printf("Enter the no. of Rows of the first Matrix : "); …Run Code Online (Sandbox Code Playgroud) 在C99中,灵活的阵列成员(结构)和可变长度数组是标准的强制性部分 - 符合C99的编译器(实现)必须同时支持它们.
在C11中,允许实现定义(§6.10.8.3条件特征宏):
__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改类型.
我没有发现标准中的任何地方规定具有FAM的结构是可变修改类型,因此我认为即使不支持VLA,也需要C11编译器来支持FAM.赞成这种解释的一个项目:具有FAM的结构的大小是固定的; FAM不计入大小的一部分(而VLA的大小不是编译时常量).
c language-lawyer variable-length-array flexible-array-member c11
根据GNU关于可变长度数组的文档,可以使用sizeof运算符来确定传递给函数的可变长度数组的大小:
您还可以使用可变长度数组作为函数的参数:
Run Code Online (Sandbox Code Playgroud)struct entry tester (int len, char data[len][len]) { /* … */ }分配存储时计算一次数组的长度,并在您访问数组时记住该数组的范围
sizeof.
但是,当使用下面的完整代码示例尝试此示例时,sizeof运算符将返回指针的大小,而不是基于上面的GNU代码段所预期的分配的vla的大小.
我知道在C中传递数组类似于将指针传递给数组的第一个元素,但由于我们在函数签名中指定了这种情况下的大小,我希望在使用sizeof范围时我可以模仿行为.声明数组的位置.
我也意识到我可以使用这个len参数来计算出尺寸; 但为了方便和理解GNU的实现,我仍然认为这是一个有趣的(如果不是很重要的)问题.
提前感谢任何能够深入了解此事的人!
// file: vla.c
#include <stdio.h>
void foo(int len, char data[len][len]) {
printf("sizeof \"foo\" data: %lu\n", sizeof(data));
}
int main(int argc, char * argv[]) {
char data[argc][argc];
printf("sizeof \"main\" data: %lu\n", sizeof(data));
foo(argc, data);
}
Run Code Online (Sandbox Code Playgroud)
编译使用:
gcc vla.c -o vla -std=c11
Run Code Online (Sandbox Code Playgroud)
叫做使用:
./vla 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof …Run Code Online (Sandbox Code Playgroud) 文件扩展名:.cpp
我有以下代码:
int main() {
int N; cin >> N;
int myArray[N];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我输入N为1,000,000,那么当我尝试运行该程序时,我会收到错误.但是,当我设置myArray[N]时myArray[1000000],它没有.为什么会这样?