PDA

Ver la Versión Completa : mensaje de error UNIT.OBJ


noe
17-07-2006, 20:08:36
saludos a todos los del foro. Estoy haciendo un programa para calcular el metodo de simpson y al compilar me manda el siguiente mensaje de error:


[Linker Error] Unresolved external 'f(float)' referenced from C:\SIMPSON\UNIT1.OBJ

no saben a que se debe esto.... les agradecere cualquier ayuda

saludos y gracias de antemano
atte Noe

nemesio
17-07-2006, 20:27:03
Pues pareciera que te muestra el error por alguna variable declarada tipo float.

saludos.

noe
17-07-2006, 20:59:37
Bueno agradezco tu interes nemesio. Te agradecere si me puedes ayudar un poco ya que yo programo en delphi y no en c++ builder y no le entiendo mucho con lo que respecta a la declaracion de variables. mira el codigo que tengo es el siguiente:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;



//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Btn_CalcularClick(TObject *Sender)
{
float f(float x);
int n,i;
float a,b,h,s,s2,s4,x,ts2,ts4,s13,suma;
char opc;


a=b=h=s=x=s13=suma=0;
a=StrToFloat(Edt_a->Text);
b=StrToFloat(Edt_b->Text);
n=StrToFloat(Edt_Numero->Text);
do
{
if(n%2 !=0)
ShowMessage("el numero debe ser un numero par");
}while(n%2 !=0);

h=(b-a)/n;
s=f(a)+f(b);


Edt_Fa->Text=FloatToStr(f(a));
Edt_Fb->Text=FloatToStr(f(b));
Edt_h->Text=h;
Edt_s->Text=s;
Edt_x->Text=x;



/****************************SIMPSON 1/3**********************************/

//se evaluan los valor de x donde x=x+h en el intervalo (a,b)


x=a+h;

for(int i=1; i<=n-2; i++)
{
f(x);
x+=h;
}


//segun el metodo simpson 1/3 algunos valores seran 2*f(x) o 4*f(x)
x=a+h;

for(i=1; i<=n-1; i++)
{
if(i%2 == 0) //2*f(x)
{
s2=2*f(x);

ts2+=s2;
}
else //4*f(x)
{
s4=4*f(x);

ts4+=s4;
}
x+=h;
}//for
suma = (f(a)+f(b))+(ts2+ts4);
s13=(suma*h)/3;
/*************************************************************************/


Edt_Suma->Text=FloatToStr(suma);
Edt_S13->Text=FloatToStr(s13);


}
//-----------------------------------------------------------


Agradezco toda ayuda.... que variable puede ser :confused:

Bueno creo que el problema es con la funcion:
float f(float x); que declaro debajo del void, pero donde tengo que declarar eso.......

maeyanes
17-07-2006, 21:08:21
Pues a simple vista, no veo donde esté declarada e implementada la función f...

Corrigiendo, ya vi: float f(float x);, aquí estas declarando una función f que recibe un float y devuelve un valor del mismo tipo, pero no existe la implementación de esta función...

Algo así (solo un ejemplo):


float f(float x)
{
/* Calculo de la función en x */
return x * x;
}



Saludos...

noe
18-07-2006, 16:14:07
Gracias por responder... ya hice lo que me dijiste y no funciona.-
Que cosa puede ser mira yo tengo este codigo en c: y lo quiero pasar a c Builder.: que estoy pasando mal en el codigo.......:confused:


/*Este programa implememta el algoritmo de integración de simpson 1/3

//librerias a utilizar
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <math.h>

//definicon de la funcioon
float f(float x);

//programa principal
void main()
{
int n;
float a,b,h,s,s2,s4,x,ts2,ts4,s13,suma;
char opc;
do
{
a=b=h=s=x=s13=suma=0;
clrscr();
gotoxy(27,1);
cout<<"METODO DE SIMPOSON 1/3 \n\n\n";
cout<<"\t\tPrporcione los valores del intervalo [a,b] \n\n";
cout<<"Propocione el valor de a: ";
cin>>a;
cout<<"Propocione el valor de b: ";
cin>>b;
do
{
cout<<"\nPropocione el numero de puntos: ";
cin>>n;
if(n%2 !=0)
cout<<"\n\n!!!! ERROR n DEBE SER UN NUMERO PAR !!!!";
}while(n%2 !=0);

h=(b-a)/n;
s=f(a)+f(b);

cout<<"\n\nPor lo tanto...";
cout<<"\n f(a) = "<<f(a);
cout<<"\n f(b) = "<<f(b);
cout<<"\n h= "<<h;
cout<<"\n s= "<<s;
cout<<"\n x= "<<x;

/****************************SIMPSON 1/3**********************************/

//se evaluan los valor de x donde x=x+h en el intervalo (a,b)
clrscr();
gotoxy(10,1);
cout<<"EVALUACION DE f(x) CON x=x+h en el intervalo abierto
("<<a<<","<<b<<")\n\n";
cout<<"x \t\t\t f(x)\n\n";
x=a+h;
cout<<x<<"\t\t\t"<<f(x)<<"\n";
for(int i=1; i<=n-2; i++)
{
f(x);
x+=h;
cout<<x<<"\t\t\t"<<f(x)<<"\n";
}
getch();

//segun el metodo simpson 1/3 algunos valores seran 2*f(x) o 4*f(x)
clrscr();
x=a+h;
gotoxy(10,1);
cout<<"RESULTADOS DEL PRODUCTO 2*f(x) 0 4*f(x) PARA x=x+h \n\n\n";
cout<<"x\t\t\tf(x)\n\n";
for(i=1; i<=n-1; i++)
{
if(i%2 == 0) //2*f(x)
{
s2=2*f(x);
cout<<x<<"\t\t\t"<<"2*f(x)= "<<s2<<"\n";
ts2+=s2;
}
else //4*f(x)
{
s4=4*f(x);
cout<<x<<"\t\t\t"<<"4*f(x)= "<<s4<<"\n";
ts4+=s4;
}
x+=h;
}//for
suma = (f(a)+f(b))+(ts2+ts4);
s13=(suma*h)/3;
/*************************************************************************/
getch();
clrscr();
gotoxy(30,1);
cout<<"RESULTADOS \n\n\n";
cout<<" SUMA = "<<suma;
cout<<"\n\n SIMPOSON 1/3 = "<<s13;
cout<<"\n\n\n ¨ Desea evaluar la funcion en otro intervalo (s/n)?: ";
cin>>opc;
}while(opc !='n' && opc!='N');
}//main


//funcion
float f(float x)
{
return pow(x,4);
}

Ojala ,me puedas ayudar

Gracias de antemano

OSKR
18-07-2006, 17:34:53
Pues ya como tienes el código corregido no veo el problema, no es necesario declarar el prototipo de la función float f(float x); sino q de una vez puedes poner

float f(float x)
{ return pow(x,4);
} en su lugar, borra el .obj y reconstruye el proyecto con Project->Build All, ya no deberías tener problema alguno.

noe
18-07-2006, 18:21:42
Gracias por contestar.

pero en donde pongo

float f(float x)
{ return pow(x,4);
}

ya que me manda error.....


Mira lo puse asi:


//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;



//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Btn_CalcularClick(TObject *Sender)

{

int n,i;
float a,b,h,s,s2,s4,x,ts2,ts4,s13,suma;
char opc;

float f(float x);
{
return pow(x,4);
}


a=b=h=s=x=s13=suma=0;
a=StrToFloat(Edt_a->Text);
b=StrToFloat(Edt_b->Text);
n=StrToFloat(Edt_Numero->Text);
do
{
if(n%2 !=0)
ShowMessage("el numero debe ser un numero par");
}while(n%2 !=0);

h=(b-a)/n;
s=f(a)+f(b);


Edt_Fa->Text=FloatToStr(f(a));
Edt_Fb->Text=FloatToStr(f(b));
Edt_h->Text=h;
Edt_s->Text=s;
Edt_x->Text=x;



/****************************SIMPSON 1/3**********************************/

//se evaluan los valor de x donde x=x+h en el intervalo (a,b)


x=a+h;

for(int i=1; i<=n-2; i++)
{
f(x);
x+=h;
}


//segun el metodo simpson 1/3 algunos valores seran 2*f(x) o 4*f(x)
x=a+h;

for(i=1; i<=n-1; i++)
{
if(i%2 == 0) //2*f(x)
{
s2=2*f(x);

ts2+=s2;
}
else //4*f(x)
{
s4=4*f(x);

ts4+=s4;
}
x+=h;
}//for
suma = (f(a)+f(b))+(ts2+ts4);
s13=(suma*h)/3;
/*************************************************************************/


Edt_Suma->Text=FloatToStr(suma);
Edt_S13->Text=FloatToStr(s13);



}

//---------------------------------------------------------------------------



Y me manda el siguiente error:

[C++ Error] Unit1.cpp(35): E2467 '_fastcall TForm1::Btn_CalcularClick(TObject *)' cannot return a value

[C++ Warning] Unit1.cpp(39): W8066 Unreachable code

OSKR
19-07-2006, 00:57:22
La función no puedes meterla dentro del evento :confused:, debes colocarla antes q la primera función q la llame, por ejemplo:

#include <vcl.h>
#include <math.h>

#pragma hdrstop
#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
float f(float x);
{ return pow(x,4);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------------------------------------------------------


void __fastcall TForm1::Btn_CalcularClick(TObject *Sender)
{ int n,i;
float a,b,h,s,s2,s4,x,ts2,ts4,s13,suma;
char opc;
.....