C 调用函数时,某些数据会从指针中消失
[编辑]主要问题是,每次将一些int值更改为float值后,我的进化适应度都返回相同的值。错误的一点是,我重新启动了计算机,它令人惊讶地再次工作 我从main调用函数,当我调试代码时,变量包含数据,但在函数的标题中,当我调试时,数据丢失,内存引用相同(我使用visual Studio 2013编译),这只发生在一些变量中(您可以检查下图中的哪些变量) (初始化,一些相关的是) 我的函数的标题如下:C 调用函数时,某些数据会从指针中消失,c,function,pointers,function-call,C,Function,Pointers,Function Call,[编辑]主要问题是,每次将一些int值更改为float值后,我的进化适应度都返回相同的值。错误的一点是,我重新启动了计算机,它令人惊讶地再次工作 我从main调用函数,当我调试代码时,变量包含数据,但在函数的标题中,当我调试时,数据丢失,内存引用相同(我使用visual Studio 2013编译),这只发生在一些变量中(您可以检查下图中的哪些变量) (初始化,一些相关的是) 我的函数的标题如下: int generacion(int poblacion[NUMCROMOSOMAS][SIZEC
int generacion(int poblacion[NUMCROMOSOMAS][SIZECROMOSOMAS],
float resultados[NUMCROMOSOMAS][CANTIDADMEDICIONES],
int in[CANTIDADMEDICIONES][NUMVAR],
float valoresEsperados[NUMCROMOSOMAS][CANTIDADMEDICIONES],
char gramaticas[NUMCROMOSOMAS][LONGITUDCADENA],
char * mejorIndividuo,
char variableNames[NUMVAR],
float fitness[NUMCROMOSOMAS]){
这是调用前的编译器
这是调用之后的编译器
我做错了什么?当你有这样一个参数声明时
int in[CANTIDADMEDICIONES][NUMVAR]
这并不是编译器真正使用的,而是它转换成的
int (*in)[NUMVAR]
换句话说,中的是指针而不是数组
您在函数中的调试器中看到的是指针,但由于指针指向的数据大小未知,调试器无法直接显示数据。如果在函数中的调试器中显式选中[0]
中的,您将看到数据是正确的
换句话说,这不是代码的问题,而是调试器如何显示(或者更确切地说不显示)数据。到底是什么让你困惑?该程序代表了语法的演变,但令人惊讶的是,我的适应度始终是一样的,这发生在我更改一些变量时,我更改了整数精度。它变成了双精度。我很困惑,因为重新启动机器后,我的程序又能正常工作了。有什么提示吗?调试器显示其他2D数组参数的元素很好,这可能令人惊讶(不仅仅是OP)。poblacion
和中的有什么区别?啊,仔细看看就会发现这个问题。正如您所说的,generacion()的
中的形式参数是指向数组的指针。默认情况下,调试器显示指针后面的数据。它知道如何显示数组:它显示所有元素,每个元素都用大括号表示。对于poblacion
,它是指向128个整数数组的指针。如果我们仔细看的话,它对
中的也是这样<在
中,code>恰好是一个指向1 int(NUMVAR
为1)数组的指针,该数组的值为0。调试器不会在+1
或poblacion+1
中显示的内容(因为这可能是不可访问的内存)。@PeterA.Schneider因此,如果in的大小更大,它可以显示出来?@Kaostias它已经显示出来了(注意值列中的小{0}
)。因为NUMVAR
是1,
中的main
是一个只有一列的二维数组;作为函数的一个参数,它被“调整”为指向第一行的指针,第一行是所述数组,带有一个正确显示的元素0
。如果打开手表窗口,您可以修改要计算的表达式,例如,让手表在[1]
中显示,或在[1][0]
中显示。
int generacion(int poblacion[NUMCROMOSOMAS][SIZECROMOSOMAS],
float resultados[NUMCROMOSOMAS][CANTIDADMEDICIONES],
int in[CANTIDADMEDICIONES][NUMVAR],
float valoresEsperados[NUMCROMOSOMAS][CANTIDADMEDICIONES],
char gramaticas[NUMCROMOSOMAS][LONGITUDCADENA],
char * mejorIndividuo,
char variableNames[NUMVAR],
float fitness[NUMCROMOSOMAS]){
int in[CANTIDADMEDICIONES][NUMVAR]
int (*in)[NUMVAR]