Duda al compilar C

44

Muy buenas tardes a todos. Tengo entre manos una práctica de programación en C y estoy liado de cojones xD. No se ya ke meterle o kitarle pero nunca lo limpio de errores.

Se trata de un programa ke pide el número de escaños a repartir, el número votos del partido A y el de B, y despues reparte los escaños introducidos entre ambos segun la ley de Hont. Me dispongo a pegar el tocho:

#include <stdio.h>
#include <limits.h>


int votosA;
int votosB;
int escanostotal;
int esc1;
int esc2;

int escf;
int vofa;
int vofb;


int escanosmain;
int votosAmain;
int votosBmain;
int escanos;
int voA;
int voB;
int escanosA;
int escanosB;

int FuncionEscanos (int escf)
{
while (escf <= 0)
{
printf ("Numero de escanos introducidos incorrecto, vuelva a introducir escanos: ");
scanf ("%d" , &escf);
}
while (escf > INT_MAX)
{
printf ("Numero de escanos introducidos incorrecto, vuelva a introducir escanos: ");
scanf ("%d" , &escf);
}
return (escf);
}


int Funciona (int vofa)
{
while (vofa <= 0)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &vofa);
}
while (vofa > INT_MAX)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &vofa);
}
return (vofa);
}


int Funcionb (int vofb)
{
while (vofb <= 0)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &vofb);
}
while (vofb > INT_MAX)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &vofb);
}
return (vofb);
}


void Hont (int votosA, int votosB, int escanostotal, int &esc1, int &esc2)
{
int HontA;
int HontB;
int escHA;
int escHB;


escHA = 0;
escHB = 0;

[b]*esc1 = escHA;	
*esc2 = escHB;[/b]

if ((votosA == 0) && (votosB > 0))
	escHB = escanostotal;
else	
	if ((votosB == 0) && (votosA > 0))
		escHA = escanostotal;
	else
		if ((votosA > 0) && (votosB > 0))	
				while ((escHA + escHB) > escanostotal)
				{
					HontA = ( (float)votosA ) / (escHA + 1);
					HontB = ( (float)votosB ) / (escHB + 1);
					
					if (HontA > HontB)
					{
						escHA++;
					}
					else
					{	
						escHB++;
					}
				}					

}

int main (void)
{

printf ("Introduzca el numero total de escanos:" );
scanf ("%d", &escanosmain);
escanos = FuncionEscanos (escf);

printf ("Introduzca el numero de votos del partido A:" );
scanf ("%d",  &votosAmain);
voA = Funciona (vofa);

printf ("Introduzca el numero de votos del partido B:" );
scanf ("%d",  &votosBmain);
voB = Funcionb (vofb);

Hont (voA, voB, escanos, &escanosA, &escanosB);
printf ("Los escanos pertenecientes al partido A son: %d", escanosA);
printf ("Los escanos pertenecientes al partido B son: %d", escanosB);

}[/i]

El compilador que uso es el GCC, y los errores y warnings de los ke me informa son los siguientes:

In Function 'FuncionEscanos':
warning: will never be executed
In Function 'Funciona':
warning: will never be executed
In Function 'Funcionb':
warning: will never be executed

At top level:
parse error before '&' token
In function Hont:
invalid type argument of 'unary *'
invalid type argument of 'unary *'

La linea de los errores marcados en la lista anterior en negrita están, asimismo, marcados en negrita en el código y en orden de aparición.

Ahora me tengo ke ir, volveré en una hora o así. A ver si podéis echarme un cable en lo ke veais erróneo ^. Muchas gracias

44

a ver si sube esto ^!

maRc

Dos cosas:
-Si pones la línea en la que falla, mejor.
-Si pones dos posts seguidos, el thread no sube en la página :P.

dr_Rouman

Me parece que en C no se puede usar el ampersand (&) así...

También estaría bien que pusieses como compilas (los parámetros del gcc)

EDIT:
Lo he copiado y lo he compilado así:

gcc main.c -o main

y sólo me da un parse error:

main.c:73: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token

Línea 73:

void Hont (int votosA, int votosB, int escanostotal, int &esc1, int &esc2)

Insisto que creo que eso no se puede hacer en C. Tienes que pasarle directamente un puntero o una dirección de memoria, no un int y luego sacársela.

B

pon la linea dl parse error

pd: y el int main() ?

IAF

void Hont (int votosA, int votosB, int escanostotal, int &esc1, int &esc2)

claro, el & solo va cuando llamas la funcion para enviarle la variable por referencia, no?
supongo q quitando esos & delante de esc1 i esc2 funcionaria

gF

Yo te digo el error:

En la función main tu llamas a la función Hont de la siguiente manera:

Hont (voA, voB, escanos, &escanosA, &escanosB);

Lo cual es correcto, sin embargo tienes mal la declaración de la función puesto que si tu pasas direcciones de enteros (&escanosA, &escanosB), en la declaración de la función tienes que poner punteros a enteros, es decir:

void Hont (int votosA, int votosB, int escanostotal, int *esc1, int *esc2)

en vez de:

void Hont (int votosA, int votosB, int escanostotal, int &esc1, int &esc2)

#4 y #6 se han acercao xD

44

xDDDDD

muchas gracias a todos, al final tras mucho puteo lo he conseguido arreglar sta mañana temprano.

por si os interesa os lo dejo resuelto. thx de nuevo =)
#include <stdio.h>
#include <limits.h>



int escanos;
int votosA;
int votosB;
int escanosA;
int escanosB;




int FuncionEscanos (int escanos)
{
printf ("Introduzca el numero total de escanos:" );
scanf ( "%d", &escanos);
while (escanos < 0)
{
printf ("Numero de escanos introducidos incorrecto, vuelva a introducir escanos: ");
scanf ("%d" , &escanos);
}
while (escanos > INT_MAX)
{
printf ("Numero de escanos introducidos incorrecto, vuelva a introducir escanos: ");
scanf ("%d" , &escanos);
}
return (escanos);
}


int a (int votosA)
{
printf ("Introduzca el numero de votos del partido A:" );
scanf ("%d", &votosA);
while (votosA < 0)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &votosA);
}
while (votosA > INT_MAX)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &votosA);
}
return (votosA);
}


int b (int votosB)
{
printf ("Introduzca el numero de votos del partido B:" );
scanf ("%d", &votosB);
while (votosB < 0)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &votosB);
}
while (votosB > INT_MAX)
{
printf ("Numero de votos introducidos incorrecto, vuelva a introducir votos:");
scanf ("%d", &votosB);
}
return (votosB);
}

void Hont (int escanos, int votosA, int votosB, int *escanosA, int *escanosB)
{
float HontA;
float HontB;


if ((votosA == 0) && (votosB > 0))
{
	*escanosB = escanos;
}	
if ((votosB == 0) && (votosA > 0))

{

	*escanosA = escanos;
}

else
		if ((votosA > 0) && (votosB > 0))	
		{	
			while ((*escanosA + *escanosB) < escanos)
				{
				HontA = ((float) votosA) / (*escanosA + 1);
				HontB = ((float) votosB) / (*escanosB + 1);
					if (HontA > HontB)
					{
						(*escanosA)++;
						
					}
					else
					{
						(*escanosB)++;
					}
				}	
		}	

}

int main (void)
{
int escanos;
int votosA;
int votosB;

escanosA = 0;
escanosB = 0;



escanos = FuncionEscanos (escanos);


votosA = a (votosA);



votosB = b (votosB);


Hont (escanos, votosA, votosB, &escanosA, &escanosB);
printf ("\nLos escanos pertenecientes al partido A son: %d\n", escanosA);
printf ("\nLos escanos pertenecientes al partido B son: %d\n", escanosB);

return 0;

}[/i]

_CheTe_

#9 pasar parametros por referencia? nose nose, ske lo e dao hoy y kreo k es eso.

javithelong

#11
void Hont (int votosA, int votosB, int escanostotal, int &esc1, int &esc2)

Esto esta mal escrito, sería asi:

void Hont (int votosA, int votosB, int escanostotal, int *esc1, int *esc2)

Que serían 3 variables enteras, y 2 punteros a enteros (un puntero no es mas que una direccion de memoria donde se encuentra la variable)

Usuarios habituales