Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Roga en 26 Junio 2017, 00:32 am



Título: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 26 Junio 2017, 00:32 am
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.
Código
  1. void imprimir(int cedula_valida[],float nota[][],int total);
  2. int main(){
  3. .
  4. .
  5. .
  6. .
  7. .
  8. printf("\n\nIngrese la cantidad de estudiantes de su clase:");
  9. scanf("%d",&total);
  10. nota=(float **)malloc (total*sizeof(float *));
  11. for(alumno=0;alumno<total;alumno++){
  12. nota[alumno]=(float *)malloc(alumno*sizeof(float));
  13. .
  14. .
  15. .
  16. .
  17. .
  18. }

gracias de antemano :D


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 26 Junio 2017, 01:09 am
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.


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 26 Junio 2017, 01:22 am
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


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 26 Junio 2017, 01:54 am
Pues en el segundo malloc, el que corresponde al número de evaluaciones, en vez de multiplicar por alumno lo debes hacer por n.


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 26 Junio 2017, 04:19 am
gracias por esa acotacion y si era un error que no habia visto. pero aun tengo la duda de la funcion


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 26 Junio 2017, 09:18 am
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.


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 26 Junio 2017, 22:57 pm
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

Código
  1. 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?.


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 26 Junio 2017, 23:20 pm
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.


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 27 Junio 2017, 01:18 am
seria algo asi?
Código
  1. void imprimir(int cedula_valida[],float **nota[][],int total);


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 27 Junio 2017, 01:44 am
Más bien:
Código
  1. void imprimir(int cedula_valida[],float **nota,size_t numalumnos,size_t numcalificaciones);


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: Roga en 27 Junio 2017, 02:49 am
gracias ya no sale error pero me explicas para que sirve size_t?


Título: Re: Ayuda con declaracion de memoria dinamica en funcion
Publicado por: MAFUS en 27 Junio 2017, 06:51 am
Es un typedef al mayor entero sin signo capaz de usar toda el tamaño de la palabra del procesador.