将问题与 libMathEval 联系起来

Linking issues with libMathEval

我有一个很大的源代码,我想分成一些模块(.h 和.c 文件)...因为我有一个 2000 行的唯一源代码文件...

让我们进入问题:

-我正在该代码中使用表达式库 libMathEval...

-我使用以下命令编译大源代码文件:

gcc -DMAX_ESTRELLAS_SELECCIONADAS=1000000 crowd_2cond.c -lmatheval -o run2sec

-至运行 我使用:

./run2sec ./fparameters.txt

-控制台中的结果是:

Tiempo para lectura de ficheros, calculo de expresiones, creacion de estructuras (listas, IndiceAVL y IndiceVector) y liberacion de IndiceAVL: 3.7689 segundos
Tiempo para algoritmo: **68.7716 segundos**
Tiempo para escritura de ficheros y liberacion de memoria: 3.9501 segundos
Tiempo SECUENCIAL total (avl-serializado 2-index 2-cond Optimizado): 76.4906 segundos

程序生成正确的文件输出...

但我想将那个大源文件分离到不同的模块中...所以我从大文件的一个功能开始,所以现在我有两个文件(三个带有 header):

crowd_2cond.c(包含主要函数和所有函数减去移动到下一个文件的函数entrada.c)

entrada.c (header entrada.h): 只包含一个大函数...

因此,为了生成可执行文件,我使用以下命令:

gcc -c entrada.c
gcc -c -DMAX_ESTRELLAS_SELECCIONADAS=1000000 crowd_2cond.c
gcc -o run2sec crowd_2cond.o -lmatheval entrada.o

再次 运行 我使用了:

./run2sec ./fparameters.txt

显示的结果是:

Tiempo para lectura de ficheros, calculo de expresiones, creacion de estructuras (listas, IndiceAVL y IndiceVector) y liberacion de IndiceAVL: 3.7941 segundos
Tiempo para algoritmo: **1.4577 segundos**
Tiempo para escritura de ficheros y liberacion de memoria: 3.6116 segundos
Tiempo SECUENCIAL total (avl-serializado 2-index 2-cond Optimizado): 8.8634 segundos

程序产生的文件输出在这种情况下是不正确的...粗体显示的时间不同...

两次执行的代码差异只是entrada.c中函数的分离,其他的我没接触过...

希望有人能帮助我 提前感谢大家 曼努埃尔.

这 link 行:

gcc -o run2sec crowd_2cond.o -lmatheval entrada.o

等同于原来的。要使其完全等价,试试这个:

gcc -o run2sec crowd_2cond.o entrada.o -lmatheval

对象和库在 link 行的顺序 does matter

我不确定这是否会解决您的问题,但我可以看到这是一个直接的区别。

如果问题仍然存在,可能是您在计算中使用了一些未初始化的值,而您从原始编译中偶然得到的值产生了正确的答案。 运行 您的程序在 valgrind 下以确保没有使用未初始化的值。

你对初始化的建议让我发现了错误。

问题正如你所说的初始化错误。

#ifndef ENTRADA_H
#define ENTRADA_H

#include <stdlib.h> ---This was not in the entrada.h file---
#include <stdio.h>
#include <string.h>

#include "tipos.h"

ParametrosEjecucion leerParametrosEntrada(int nparam, char *argv[], int num_lineas);

#endif

在 "leerParametrosEntrada" 中,我使用 atof 将字符串转换为浮点数,如果不包含 stdlib.h 文件,该函数似乎表现不佳。

包含后一切正常...

谢谢俄罗斯雇员