Ayuda con declaracion de memoria dinamica en funcion

Iniciado por Roga, 26 Junio 2017, 00:32 AM

0 Miembros y 1 Visitante están viendo este tema.

Roga

Hola una duda como le doy memoria dinamica a un parametro en una funcion.
el parametro es una matriz.

mi duda es que valor colocar en la segunda llave de nota.
void imprimir(int cedula_valida[],float nota[][],int total);
int main(){
.
.
.
.
.
printf("\n\nIngrese la cantidad de estudiantes de su clase:");
scanf("%d",&total);
nota=(float **)malloc (total*sizeof(float *));
for(alumno=0;alumno<total;alumno++){
nota[alumno]=(float *)malloc(alumno*sizeof(float));
.
.
.
.
.
}


gracias de antemano :D

MAFUS

Fíjate que lo que estás haciendo en este código es una escalera. La nota alumno tendrá alumno entradas. Lo que lleva al siguiente problema:
nota[0] tendrá 0 bytes (indefinido, lo debe resolver el compilador pero ¿y si no lo hace?).
nota[1] tendrá 4 bytes
nota[2] tendrá 8 bytes
etc.

Supongo que te habrán dicho cuántas asignaturas tendrá cada alumno.

Roga

este es el anunciado

/*Implementar un programa que lea las notas de todos los alumnos de una clase para una asignatura (Validar que las calificaciones estén
comprendidas entre 1 y 20 puntos. Al estudiante que no presentó se le acepta la calificación de cero), calcule:
a. Emitir un listado que muestre el número de cédula de cada estudiante con su respectiva calificación y su valoración cualitativa de
"Aprobado" o "Reprobado" (trabajar el formato numérico para dos dígitos que aparezca el cero a la izquierda, cuando un estudiante posee
nota de cero puntos, en su reemplazo debe aparecer las letras NP, que indican que no presentó).
b. Calcular la media de la materia.
c. Determine cuántos alumnos superan o igualan la media y cuántos están por debajo de la misma.
d. Mostrar que estudiante tiene la nota máxima y cuál la nota mínima.
e. Emitir el % de aprobados y el % de reprobados.
*/

1 asignatura
pero n evaluaciones

MAFUS

Pues en el segundo malloc, el que corresponde al número de evaluaciones, en vez de multiplicar por alumno lo debes hacer por n.

Roga

gracias por esa acotacion y si era un error que no habia visto. pero aun tengo la duda de la funcion

MAFUS

Si has creado los arrays en el main no debes hacerlos de nuevo dentro de una función.
Pero si lo que quieres es pasar un puntero a la función y que ésta lo defina debes pasar un puntero a ese puntero.
Tu duda y el código que has pasado dicen cosas diferentes.

Roga

Emmmm pues cuando es una matriz y haces el prototipo y las variables que quieres pasar no tienes que declarar la memoria que tiene el segundo corchete o  mejor dicho las columnas

void imprimir(int cedula_valida[],float nota[][AQUI!!],int total);

??? tengo por entendido que si y si lo estoy declarando pero es memoria dinamica como hago para introducir la variable alli?.

MAFUS

Usa la notación de punteros.

Para pasar arrays y tablas usa la notación de arrays y tablas. Para pasar punteros usa la notación de punteros.

Roga

seria algo asi?
void imprimir(int cedula_valida[],float **nota[][],int total);

MAFUS

#9
Más bien:
void imprimir(int cedula_valida[],float **nota,size_t numalumnos,size_t numcalificaciones);