Foros del Web » Programación para mayores de 30 ;) » C/C++ »

error [Linker error] undefined reference to `mayoritario(float, float)'

Estas en el tema de error [Linker error] undefined reference to `mayoritario(float, float)' en el foro de C/C++ en Foros del Web. Hola, he escrito un programita para comprobar si un vector es mayoritario (si el vector tiene la mayoría de los elementos iguales es mayoritario). Lo ...
  #1 (permalink)  
Antiguo 28/09/2012, 08:18
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
error [Linker error] undefined reference to `mayoritario(float, float)'

Hola, he escrito un programita para comprobar si un vector es mayoritario (si el vector tiene la mayoría de los elementos iguales es mayoritario).
Lo compilo y me da el error:

[Linker error] undefined reference to `mayoritario(float, float)'
ld returned 1 exit status


que no entiendo, yo creo que está todo bien no sé si vosotros veis algo raro.

Gracias.



Código c++:
Ver original
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7. bool mayoritario (float, float);
  8. bool mayoritario (float vector [10], float n)
  9. {
  10.      int suma=0;
  11.      for (int i=0; i<n; i++)
  12.          for (int j=0; j<n && suma<=(n/2); j++)
  13.           if (vector [i]==vector[j])
  14.            suma++;
  15.            
  16.      if (suma>(n/2))
  17.      return true;
  18.      else
  19.      return false;
  20.      
  21.      
  22.    
  23. }
  24.  
  25.                                
  26. int main()
  27. {
  28.     float vector [10],n;
  29.     cout <<"Cuantos elementos?";
  30.     cin>>n;
  31.     cout<<"Escriba los"<<n<<" numeros: ";
  32.     for (int i=0; i<n;i++)
  33.     cin>>vector [i];
  34.    
  35.    
  36.     if (mayoritario (vector [10], n))
  37.     cout<<"El vector es mayoritario"<<endl;
  38.     else
  39.     cout<<"El vector no es mayoritario"<<endl;
  40.        
  41.     system("PAUSE");
  42.     return EXIT_SUCCESS;
  43.  
  44. }
  #2 (permalink)  
Antiguo 28/09/2012, 09:26
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: error [Linker error] undefined reference to `mayoritario(float, float)'

Bueno, el codigo tiene un problema simple, y es que la declaracion de la funcion y esta misma no son iguales:
Código C:
Ver original
  1. bool mayoritario (float, float);
  2. bool mayoritario (float vector [10], float n)
  3. //error no son iguales

Ahora tienes dos soluciones:

Solucion 1: borra la linea
Código C:
Ver original
  1. bool mayoritario (float, float);
Ya que si has escrito la funcion antes del main no es necesario ponerlo otra vez antes.

Solucion 2:

Sustituir
Código C:
Ver original
  1. bool mayoritario (float, float);

por
Código C:
Ver original
  1. bool mayoritario (float vector [10], float n)



Saludos.
  #3 (permalink)  
Antiguo 28/09/2012, 12:30
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: error [Linker error] undefined reference to `mayoritario(float, float)'

ahora me dice esto:

línea 36
cannot convert `float' to `float*' for argument `1' to `bool mayoritario(float*, float)'

que tampoco entiendo, si está todo en float qué hay qeu convertir, he probado poniendo todo a int, cambiando a float también los i y j de los bucles pero nada..

alguna idea? Gracias
  #4 (permalink)  
Antiguo 28/09/2012, 14:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: error [Linker error] undefined reference to `mayoritario(float, float)'

En el prototipo se espera dos floats desreferenciados, en los argumentos de la funcion se espera un float desreferenciado que por defecto será el elemento nº10 (en base a 0) de un supuesto array, y en la implementacion de la funcion se manipula el argumento 'vector' como si realmente fuese un vector; en la llamada a la funcion envias un unico elemento desreferenciado que es el elemento nº10 del array de floats declarado en el main. No ves algo raro en todo esto?

La funcion espera que le envies un array de floats, es decir una referencia a una lista tal como la declaras en el main; esta lista puedes declararla de dos formas: cerrada o abierta; el el codigo que colgaste está cerrada, es una lista de 10 floats, que sería lo mismo que hacer una memoria dinamica para 10 floats y que seguramente en ese caso habrías visto mejor lo que estas manipulando:

Código:
float vector[10];

float *vector = new float[10];
delete []vector;
Ambos casos creas un array de 10 floats (el segundo al ser memoria dinamica tienes que liberarla tu mismo al finalizar el uso). La funcion espera trabajar con el array, por lo que espera usar como minimo float *vector, que es el propio array y se pasa por referencia; entonces el prototipo de tu funcion debe ser

Código:
bool mayoritario (float *, float);
Y la funcion debe estar declarada tal como:

Código:
bool mayoritario (float *vector, float n) {
}
Y ahora seguramente ya ves que es lo que tienes que enviar en la llamada a la funcion:

Código:
mayoritario(vector, n);
Observa que la funcion espera trabajar con una referencia porque el objeto no es unitario (es una lista), el objeto que creas en el main es una lista (tanto si la craste de forma estatica como si no) que por lo tanto ya es una referencia, y por eso puedes enviarlo directamente.

Saludos
vosk
  #5 (permalink)  
Antiguo 28/09/2012, 14:36
 
Fecha de Ingreso: agosto-2012
Ubicación: Alcalá
Mensajes: 37
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: error [Linker error] undefined reference to `mayoritario(float, float)'

Ya me deja compilar, no tenía claro el tema de pasar por referencia el array, volveré a leerme el tema de los arrays...
Lo de la memoria dinámica no lo he entendido, creo que aún no he llegado a ese punto, poco a poco..
Ahora el programita no hace lo que yo quería pero eso ya es otro tema que tendré que mirar..

Gracias.

Etiquetas: int, reference, undefined
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:40.