Observaciones principales:
1.- No necesitas especificar el nombre del parámetro cuando declaras una función. Por lo tanto, lo puedes hacer así:
void cargarNombreYApellido (char[]);
void crearContrasenia (char[], char[]);
int elegirCantidadDeEmpresas(void); //El "void" indica que esta función no recibe ningún parámetro.
void cargarMatrizAleatoria(int, float[][MESES]);
void mostrarVector(int, float [][MESES]);
2.- La función elegirCantidadDeEmpresas
no necesita de un parámetro, debido a que retorna el número de empresas, con eso basta:
int elegirCantidadDeEmpresas()
{
int cantEmpresas; //--> Variable local.
printf("\n\n\nCon cuantas empresa deseas trabajar? (Menos de tres) \n");
scanf("%d", &cantEmpresas);
return cantEmpresas;
}
3.- Estás desbordando el búfer y esto genera un comportamiento indefinido (puede resultar cualquier cosa en tiempo de ejecución):
cargarMatrizAleatoria(cantEmpresas,empresas[cantEmpresas][MESES]);
La primera dimensión representa el tamaño de filas y solo puede recibir índices de 0
a cantEmpresas - 1
y la segunda dimensión son el tamaño de columnas que va desde 0
a 11
. Entonces no podemos pasarnos de esos límites, de lo contrario, tendrás errores.
Realmente lo que quieres hacer es pasar la dirección de memoria del primer elemento de la matriz para que la función se encargue de rellenar de datos dicha matriz. Por lo tanto, deberías hacer esto:
cargarMatrizAleatoria(cantEmpresas, empresas);
El identificador empresas
no es más que un alias que representa la dirección del primer elemento de la matriz.
4.- Sin embargo, aquí hay otro problema, ya que el segundo parámetro solo puede recibir una "matriz" de tipo float
y usted le está pasando una matriz de tipo int
, ahí estamos mal, tanto el argumento (en este caso el argumento sería el identificador empresas)
como el parámetro (en este caso sería float empresas[][MESES]
) deben ser del mismo tipo.
Así que debemos cambiar la declaración del identificador empresas
a:
float empresas[cantEmpresas][MESES];
5.- Según el estándar la función main
debe ser definida de esta forma:
int main(void) //--> void indica: "NO ACEPTO PARÁMETROS".
{
//... code
return 0;
}
Siguiendo estas observaciones podríamos cambiar el código a esto:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MESES 12
/* Declaraciones: */
void cargarNombreYApellido (char[]);
void crearContrasenia (char[], char[]);
int elegirCantidadDeEmpresas(void); //Esta función NO ACEPTA PARÁMETROS.
void cargarMatrizAleatoria(int, float[][MESES]);
void mostrarVector(int, float [][MESES]);
int main(void)
{
srand(time(NULL));
int cantEmpresas = elegirCantidadDeEmpresas();
float empresas[cantEmpresas][MESES];
cargarMatrizAleatoria(cantEmpresas, empresas);
mostrarVector(cantEmpresas, empresas);
return 0;
}
int elegirCantidadDeEmpresas()
{
int cantEmpresas;
printf("\n\n\nCon cuantas empresa deseas trabajar? (Menos de tres) \n");
scanf("%d", &cantEmpresas);
return cantEmpresas;
}
void cargarMatrizAleatoria(int cantEmpresas, float empresas[][MESES])
{
int i,k;
for (i=0; i<cantEmpresas; i++)
{
for (k = 0; k < MESES; k++)
empresas[i][k]= rand()%11;
}
}
void mostrarVector(int cantEmpresas, float empresas[][MESES])
{
int i;
int k;
for (i=0; i<cantEmpresas; i++)
{
for (k=0; k<MESES; k++)
printf("%f - ", empresas[i][k]);
printf("\n");
}
}
Observaciones extras:
1.- Esta sentencia:
float empresas[cantEmpresas][MESES];
Se denomina VLA (Variable-length-Arrays), que en español significa un arreglo con longitud variable. En el código de arriba la variable cantEmpresas
vendría ser esa longitud variable que se obtiene en tiempo de ejecución.
El problema radica que no todos los compiladores incluyen esta característica, debido a que, es propenso a que ocurra desbordamiento de pila. Así que por cuestión de portabilidad, no se lo debería usar.
2.- La forma segura de hacer esto, sería crear una matriz dinámica. Ahí tocaría crear un array de punteros (representaría las filas) y luego reservar memoria otra vez para asignarle la dirección a cada puntero del array (todo esto representaría las columnas y así formando una especie de array bidimensional). Para más información recomiendo leer este hilo.
EDIT:
Para generar números flotantes aleatorios lo podrías hacer de esta manera:
void cargarMatrizAleatoria(int cantEmpresas, float empresas[][MESES])
{
int i,k;
float n;
for (i=0; i<cantEmpresas; i++)
{
for (k = 0; k < MESES; k++)
{
n = rand() / (float) RAND_MAX; //Genera un rango de (0.0 a 1.0)
empresas[i][k]= (n * 300) - 100; //Genera un rango de (-100 a 200)
}
}
}
Fuente: How to generate random float number in C.