我必须制作一维一维的细胞自动机并在C中实现其任何规则。
在进入C之前(不是我说实话),我只使用固定数组在python中编码,只使用for和while循环(使其直接进入端口)。我的问题是,在Python中,我有这个代码:
def bin(n):
aux = 7
bin = ''
while aux>=0:
if 2**aux <= n:
n-=2**aux
bin += '1'
else:
bin+='0'
aux-=1
return list(bin)
regla = bin(30)
print regla
ancho = 8
alto = 8
vector = []
valores_regla = ['111','110','101','100','011','010','001','000']
for i in range(ancho):
vector.append('0')
vector[ancho/2]='1'
archivo = open('Imagen.pbm','w')
archivo.write('P1 '+str(ancho)+ ' ' + str(alto)+'\n')
aux = []
for y in range(alto):
for x in range(len(vector)):
i=x-1
c=x
d=x+1
if x == 0:
i=len(vector)-1
if x == len(vector)-1:
d=0
for z in range(8):
if vector[i]+vector[c]+vector[d] == valores_regla[z]:
aux.append(regla[z])
archivo.write( ''.join(aux) + '\n')
vector = aux
aux = []
print 'Terminado'
archivo.close()
基本上,我将我的整数转换为1字节字符串二进制,然后将其规则分配给一个数组(Valores_Regla,基本上,以二进制计数到0到7);然后我继续迭代向量,如果找到匹配规则,将它附加到空数组(Aux),将该数组写入文件,然后使我的旧vector = Aux。
此代码完美地工作,并在n = alto迭代中生成细胞自动机的.pbm图像。现在在C中,我几乎逐行移植了这段代码,而几乎就可以了。
我的问题是当我尝试将新值“附加”到数组时。我也创建了一个Aux数组,填充0.然后我做了相同的循环,检查规则,如果匹配,那么我将新值分配给aux数组中的等效x位置。在此之前,它完美地运作:
#include <stdio.h>
#include <string.h>
char bufer[3];
bufer[0] =array[l];
bufer[1] = array[c];
bufer[2] = array[r];
bufer[3] = '\0';
当我尝试将Aux数组的内容复制到Array数组时,会出现问题。它搞砸了。
我对代码进行了双重和三重检查,但我看不到任何错误。我甚至没有分配内存,我正在使用静态数组。我很无能为力。任何帮助表示赞赏。
答案 0 :(得分:4)
您至少有一个缓冲区溢出:
char bufer[3];
bufer[3] = '\0';
bufer
需要大小为4。
答案 1 :(得分:3)
strncpy()
将在第一个nul字节(值0)或n
个字节(在这种情况下为ancho
)之后停止。它可能首先击中了nul。请改用memcpy()
。