Lego Mindstorms NXT,NXC:替换数组中的元素时出错(无论大小)

Lego Mindstorms NXT,NXC:替换数组中的元素时出错(无论大小),c,arrays,lego,mindstorms,nxc,C,Arrays,Lego,Mindstorms,Nxc,我试图使用Bricx命令中心为乐高头脑风暴NXT模块编写一个简单的15个拼图。但总有同样的问题。数组的元素(无论大小)不会第二次更改 下面是模拟错误的代码。如果您没有NXC块来检查它,程序会输出一个4x4的零网格(没问题),然后程序会在LCD屏幕上显示“File error!”退出,可能是在尝试用1更改数组的第一个零元素时 如果你有任何想法,请告诉我。我认为NXC语言不是为了以这种特殊的方式处理数组而开发的,尽管我觉得它很奇怪 另外,我还尝试使用内置函数ArrayReplace(),但没有成功

我试图使用Bricx命令中心为乐高头脑风暴NXT模块编写一个简单的15个拼图。但总有同样的问题。数组的元素(无论大小)不会第二次更改

下面是模拟错误的代码。如果您没有NXC块来检查它,程序会输出一个4x4的零网格(没问题),然后程序会在LCD屏幕上显示“File error!”退出,可能是在尝试用1更改数组的第一个零元素时

如果你有任何想法,请告诉我。我认为NXC语言不是为了以这种特殊的方式处理数组而开发的,尽管我觉得它很奇怪

另外,我还尝试使用内置函数ArrayReplace(),但没有成功

下面是代码示例:

int count;
int numMatrix[] = {1, 2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 69};
const int xcoord[] = {12, 37, 62, 87};
const int ycoord[] = {56, 40, 24, 8};

void fillGrid(){
     int j, k;
     for (int i = 0; i < 16; i++){
         numMatrix[i] = count;
         if (k == 4){
            k = 0;
            j++;
         }
         NumOut(xcoord[j], ycoord[k], numMatrix[i]);
         Wait(50);
         k++;
         }
     Wait(2000);
     ClearScreen();
}

task main(){
     while (true){
           fillGrid();
           count++;
     }
}
int计数;
int numMatrix[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,69};
const int xcoord[]={12,37,62,87};
const int ycoord[]={56,40,24,8};
void fillGrid(){
int j,k;
对于(int i=0;i<16;i++){
numMatrix[i]=计数;
如果(k==4){
k=0;
j++;
}
努穆特(xcoord[j],ycoord[k],努玛特里克斯[i]);
等待(50);
k++;
}
等待(2000年);
清除屏幕();
}
主要任务(){
while(true){
fillGrid();
计数++;
}
}
好的,这显然是我的错,我应该初始化j和k局部变量,并将它们等于0。现在看看这个情况,我试着对二维数组做同样的处理

#define NROWS    4
#define NCOLUMNS 4

int count;
int numMatrix[NROWS][NCOLUMNS] = {
    { 1,  2,  3,  4},
    { 5,  6,  7,  8},
    { 9, 10, 11, 12},
    {13, 14, 15, 69} };
const int xcoord[] = {12, 37, 62, 87};
const int ycoord[] = {56, 40, 24, 8};

void fillGrid(){
     for (int i = 0; i < NROWS; i++){
         for (int j = 0; j < NCOLUMNS; j++){
             numMatrix[j][i] = count;
             NumOut(xcoord[i], ycoord[j], numMatrix[j][i]);
             Wait(50);
         }
     }
     Wait(2000);
     ClearScreen();
}

task main(){
     while (true){
           fillGrid();
           count++;
     }
}
#定义NROWS 4
#定义N列4
整数计数;
int numMatrix[NROWS][N列]={
{ 1,  2,  3,  4},
{ 5,  6,  7,  8},
{ 9, 10, 11, 12},
{13, 14, 15, 69} };
const int xcoord[]={12,37,62,87};
const int ycoord[]={56,40,24,8};
void fillGrid(){
对于(int i=0;i

任何东西都不会改变,数组的所有元素将保持与初始化时相同(1、2、3…)。现在越来越有趣了

问题是:在C中,local变量在堆栈上分配,默认情况下不为您初始化,您必须自己完成这项工作

int count;               // global: automatically initialized to zero

void fillGrid() {
     int j = 0, k = 0;   // local: NOT automatically initialize - you do it.

     for (int i = 0; i < 16; i++){
         numMatrix[i] = count;
         if (k == 4){
            k = 0;
            j++;
         }
         NumOut(xcoord[j], ycoord[k], numMatrix[i]);
         Wait(50);
         k++;
     }
    ...
}
int count;//全局:自动初始化为零
void fillGrid(){
int j=0,k=0;//local:不自动初始化-您可以这样做。
对于(int i=0;i<16;i++){
numMatrix[i]=计数;
如果(k==4){
k=0;
j++;
}
努穆特(xcoord[j],ycoord[k],努玛特里克斯[i]);
等待(50);
k++;
}
...
}
如果您没有初始化它们,您会得到堆栈上的任意随机垃圾:在我的系统上,
j
恰好为零,但
k
为4195392

我认为NXC语言不是为了以这种特殊的方式与数组一起工作而开发的


这实际上与此无关:库代码(比如说,
NumOut
)从未看到数组,只看到从数组中索引并单独传递到库中的单个值。

第一次通过循环的
j
k
的值是什么?当它们被初始化时,它们都是0。如果它们是像
count
is这样的文件范围,则它们将是零,但是
i
j
是局部的,因此在堆栈上找到任何随机值。显式初始化它们。你完全正确!我的错误。发布的代码将导致一个15 0的矩阵,然后是15 1的矩阵。。。然后是15秒的矩阵,然后是15秒的矩阵。。。。在15个最大整数之前,显示的下一个值未定义。在
main()
中建议行:
count++后跟一行:
count=count%16我已经编辑了问题,您现在可以查看所描述的问题。