将问题与libMathEval链接起来

时间:2015-08-23 02:32:05

标签: c++ c linker libraries

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

让我们进入问题:

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

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

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

- 要运行我使用:

./run2sec ./fparameters.txt

- konsole中的结果是:

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

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

但是我想在不同的模块中分离那个大的源文件...所以我开始使用大文件的一个函数,所以现在我有两个文件(三个带标题):

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

entrada.c(标题为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中函数的分离,我还没有触及任何更多...

希望有人可以帮助我 谢谢大家提前 曼努埃尔。

2 个答案:

答案 0 :(得分:1)

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

问题出在你说初始化不好的时候。

#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将字符串转换为float,如果你不包含stdlib.h文件,这个函数似乎表现不好。

包括它之后一切正常......

感谢受雇俄语

答案 1 :(得分:0)

此链接:

  

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

等同于原始版本。为了使它完全等效,请尝试:

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

链接行does matter上的对象和库的顺序。

我不确定这会解决你的问题,但这是我能看到的直接差异。

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