将问题与 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 文件,该函数似乎表现不佳。
包含后一切正常...
谢谢俄罗斯雇员
我有一个很大的源代码,我想分成一些模块(.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 文件,该函数似乎表现不佳。
包含后一切正常...
谢谢俄罗斯雇员