- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解决以下问题:
假设我们有一个 8 x 8 的网格(当然它可以是更大的网格)。
我们将正方形的所有外边界点标记为'n',将与它们相邻的点标记为't',所有其他点都标记为'f'。
我想编写一个过程,通过以下规则将所有点转移为“n”(我需要遵循这个规则,因为这个问题是一个更大问题的一部分,而其余部分与我在这里的问题无关):
我需要把所有的't'点按顺序排列,并将第一个元素转移到'n'。然后我需要删除已更改为'n'的第一个元素,并将最后一个元素移动到第一个位置。此外,我需要将与更改点相邻的所有“f”点重新标记为“t”,并将它们放在“t”点序列的末尾。我需要继续这个过程,直到没有 't' 或 'f'。
为此我使用了可变大小的数组,我的代码如下:
int i,j;
char c[n+1][n+1];
int count=0;
int newi[4];
int newj[4];
int ind;
//initialization
for(i=0; i<n+1;i++){
for(j=0;j<n+1;j++){
if(i==0||j==0||i==n||j==n){
c[i][j]='n'; //tagged as newly known
}
else if(i==1||j==1||i==n-1||j==n-1){
c[i][j]='t'; //trial points
}
else{
c[i][j]='f'; //far away points
}
}
}
for(i=0; i<n+1;i++){
for(j=0;j<n+1;j++){
if(c[i][j]=='t'){
count=count+1; //count is number of 't'
}
}
}
int ri[count]; //array that stores the row index of trial points;
int ci[count]; //array that stores the column index of trial points;
int k=0;
for(i=0; i<n+1;i++){
for(j=0;j<n+1;j++){
if(c[i][j]=='t'){
ri[k]=i;
ci[k]=j;
k=k+1;
}
}
}
while(count>0){
int num=0;
i=ri[0];
j=ci[0];
c[i][j]='n';
ri[0]=ri[count-1];
ci[0]=ci[count-1];
count--;
int newcount=0;
if(c[i-1][j]=='f'){
c[i-1][j]='t';
newcount++;
newi[newcount-1]=i-1;
newj[newcount-1]=j;
}
if(c[i+1][j]=='f'){
c[i+1][j]='t';
newcount++;
newi[newcount-1]=i+1;
newj[newcount-1]=j;
}
if(c[i][j-1]=='f'){
c[i][j-1]='t';
newcount++;
newi[newcount-1]=i;
newj[newcount-1]=j-1;
}
if(c[i][j+1]=='f'){
c[i][j+1]='t';
newcount++;
newi[newcount-1]=i;
newj[newcount-1]=j+1;
}
count=count+newcount;
for(ind=count-newcount;ind<count;ind++)/////
{
ri[ind]=newi[ind-count+newcount];
ci[ind]=newj[ind-count+newcount];
}
}
它在开始的几个循环中工作正常。然而,经过我的仔细检查,然后在一个循环中的代码
for(ind=count-newcount;ind<count;ind++)/////
{
ri[ind]=newi[ind-count+newcount];
ci[ind]=newj[ind-count+newcount];
}
不仅在索引数组'ri'和'ci'的末尾添加新元素,而且还更改了'ri'的第一个元素,然后把一切都搞砸了。
我的问题是这是怎么发生的。是不是使用变长数组导致的问题?我应该避免使用可变长度的数组吗?
最佳答案
您似乎误解了 VLA 一词。这并不意味着数组的大小可能会发生变化,而是您可以动态决定数组的大小(但大小是固定一次的)。
您正在向 ri
和 ci
添加更多元素,而没有重新分配它们...我建议你首先使用动态分配:
int *ri = calloc(sizeof(int),count); //array that stores the row index of trial points;
if (ri==NULL) { /* error */ }
int *ci = calloc(sizeof(int),count);
if (ci==NULL) { /* error */ }
然后在有问题的循环之前添加两行:
int *ri2 = realloc(ri,count*sizeof(int));
if (ri2==NULL) { /* error */ }
ri = ri2;
int *ci2 = realloc(ci,count*sizeof(int));
if (ci2==NULL) { /* error */ }
ci = ci2;
在这部分代码之间,count
可能会改变!
--- 编辑 ---
您还需要注意 Alex 的回答...
关于c - 关于 C 中可变大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44681745/
为什么禁用类型像 type t = A of int | B of string * mutable int 虽然允许此类类型: type t = A of int | B of string * i
我正在寻找一种类似结构的数据结构,我可以从中创建多个实例并具有某种类型提示而不是不可变的。 所以我有这样的东西: class ConnectionConfig(NamedTuple): nam
我需要转到引用的结构: class SearchKnot { var isWord : Bool = false var text : String = "" var to
如sec 10.4.3中所述 当控制进入执行时,执行以下步骤 功能对象F(调用者)中包含的功能代码的上下文 提供thisArg,而调用方提供argumentsList: 如
i make a game that start display Activity indicator And activity indicator bottom display UiLable wi
编辑:我在这里不断获得支持。只是为了记录,我认为这不再重要。自从我发布它以来我就不再需要它了。 我想在 Scala 中执行以下操作... def save(srcPath: String, destP
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
如果您在Kotlin中访问List类型的Java值,则将获得(Mutable)List!类型。 例如。: Java代码: public class Example { public stati
我编写了 str 类(内置)的以下扩展,以便执行以下操作:假设我有字符串 "Ciao" ,通过做"Ciao" - "a"我想要的结果是字符串 "Cio" 。这是执行此操作的代码,并且运行良好: cla
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,在借款业务失败时作为财务支持。 我有 3 个表:Loan、Person 和 Company,它们存储明显的信息。
我使用二进制序列化从 C# 类中保存 F# 记录。一切正常: F#: type GameState = { LevelStatus : LevelStatus
import javax.swing.JOptionPane; public class HW { public static void main(String[] args) { Strin
使用 flatbuffer mutable 有多少性能损失? 是否“正确”使用 FlatBuffers 来拥有一个应该可编辑的对象/结构(即游戏状态) 在我的示例中,我现在有以下类: class Ga
std::function create_function (args...) { int x = initial_value (args...); return [x] () mut
我需要在 for 循环中找到用户输入的字符。我通常会这样做 如果(句子[i] == 'e') 但是因为在这里,'e' 将是一个单字母字符变量,我不知道如何获取要比较的值。我不能只输入 if (sent
我有一个这样的算法: let seed: Foo = ... let mut stack: Vec = Vec::new(); stack.push(&seed); while let Some(ne
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
如果我有以下结构: struct MyStruct { tuple: (i32, i32) }; 以及以下函数: // This will not compile fn function(&mut s
我希望在每个 session 的基础上指定列的默认值。下面的脚本不起作用,但描述了我想如何使用它。我目前使用的是 MySQL 5.5.28,但如果需要可以升级。 CREATE TABLE my_tbl
我是一名优秀的程序员,十分优秀!