elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Qué me falla?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Qué me falla?  (Leído 3,157 veces)
Xenomorfo77

Desconectado Desconectado

Mensajes: 61


Ver Perfil
¿Qué me falla?
« en: 17 Octubre 2013, 00:22 am »

Lo que quiero hacer es crear un array de 2 dimensiones para guardar varias notas por cada alumno.
Creo que la reserva de memoria está bien lo que me falla es al intentar cambiar un valor y nose porque.
He probado haciendo  m[j]=0;
Lo que quiero es hacer un scanf("%f",m[j]);


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void reserva(float **w,int filas,int columnas) {
  5.     int i,j;
  6.     w = (float**) calloc(filas,sizeof(float *));
  7.     for(i=0;i<columnas;i++) {
  8.        w[i] = (float *) calloc(columnas,sizeof(float));
  9.        }
  10.  
  11. }
  12.  
  13.  
  14. int main()
  15. {
  16.    int numeroalumnos;
  17.    int numeronotas;
  18.    float **m;
  19.    int i,j;
  20.    printf("Cuantos alumnos?: ");
  21.    scanf("%d",&numeroalumnos);
  22.    printf("Cuantas notas por alumno?: ");
  23.    scanf("%d",&numeronotas);
  24.  
  25.    reserva(m,numeroalumnos,numeronotas);
  26.  
  27.    for(i=0;i<numeroalumnos;i++)
  28.    {
  29.        printf("Alumno %d\n",i+1);
  30.        for(j=0;j<numeronotas;j++) {
  31.            printf("\tNota %d: ",j+1);
  32.            m[i][j]=0; //Esto me falla
  33.        }
  34.        printf("\n");
  35.    }
  36.  
  37.  
  38.    return 0;
  39.  
  40. }
  41.  


« Última modificación: 17 Octubre 2013, 00:24 am por Xenomorfo77 » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #1 en: 17 Octubre 2013, 00:39 am »

en "reserva" pasas una copia de la variable de tipo puntero a puntero asi que el puntero a la memroia reservada en el parametro es eliminada cuando se retorna la funcion, debes de pasar un puntero a puntero que apunta a otro puntero ( float***) pasando la direccion de la variable por supuesto o pasarla por referencia.

ademas reservar un array dinamico de esa manera no es lo mismo que declarar uno dinamico asi que esto:
Código:
m[i][j]=0;
esta incorrecto, esto es más usado en tiempo de diseño ya que el compilador resuelve el tamaño de la primera dimension, asi que debe ser:

Código:
(m[i])[j] = 0;


En línea

Xenomorfo77

Desconectado Desconectado

Mensajes: 61


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #2 en: 17 Octubre 2013, 00:46 am »

en "reserva" pasas una copia de la variable de tipo puntero a puntero asi que el puntero a la memroia reservada en el parametro es eliminada cuando se retorna la funcion, debes de pasar un puntero a puntero que apunta a otro puntero ( float***) pasando la direccion de la variable por supuesto o pasarla por referencia.

ademas reservar un array dinamico de esa manera no es lo mismo que declarar uno dinamico asi que esto:
Código:
m[i][j]=0;
esta incorrecto, esto es más usado en tiempo de diseño ya que el compilador resuelve el tamaño de la primera dimension, asi que debe ser:

Código:
(m[i])[j] = 0;

thx por la respuesta pero como se pasa por argumento eso?
sería correcto esto?

float ***m2 = &m1;

reserva(m2,,,);

« Última modificación: 17 Octubre 2013, 00:47 am por Xenomorfo77 » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #3 en: 17 Octubre 2013, 00:48 am »

thx por la respuesta pero como se pasa por argumento eso?


Se pasa la direccion de la variable usando & ( C ) o se declara el parametro como referencia siempre usando & (C++).
En línea

Xenomorfo77

Desconectado Desconectado

Mensajes: 61


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #4 en: 17 Octubre 2013, 00:50 am »

Se pasa la direccion de la variable usando & ( C ) o se declara el parametro como referencia siempre usando & (C++).

Ok thx de nuevo, he probado y hace el primer loop bien pero en alumno2 el programa crashea
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #5 en: 17 Octubre 2013, 00:53 am »

Ok thx de nuevo, he probado y hace el primer loop bien pero en alumno2 el programa crashea

C++:
linea 4:
Código:
void reserva(float** &w,int filas,int columnas) 

linea 32:
Código:
(m[i])[j]=0;

del src en el post #1
« Última modificación: 17 Octubre 2013, 00:54 am por x64Core » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ¿Qué me falla?
« Respuesta #6 en: 17 Octubre 2013, 03:06 am »

he probado y hace el primer loop bien pero en alumno2 el programa crashea
Cuando actualices un programa por favor no respondas de esa forma ya que no hay manera de ayudarte a solventar el error, en su lugar publica el código fuente completo y actualizado. También indica el lenguaje de programación ya que C y C++ tienen diferencias como en este caso con el paso por referencia.

En la función tienes otro error:
Código
  1. w = (float**) calloc(filas,sizeof(float *));
  2. for(i=0;i<columnas;i++) {
  3.   w[i] = (float *) calloc(columnas,sizeof(float));
  4. }
Después de reservar el bloque principal debes reservar el bloque para cada fila utilizando como limite del bucle el numero de filas pero tu utilizas el numero de columnas.

----

Si el lenguaje es C ...

Para solucionar los problemas primero debes cambiar la función indicando que su primer argumento sera de tipo "float ***", dentro de la función aplicas indirección para acceder al objeto apuntado (la variable "m" de la función main):
Código
  1. void reserva(float ***w,int filas,int columnas)
  2. {
  3.   int i;
  4.  
  5.   *w = calloc(filas, sizeof **w);
  6.   for (i = 0; i < filas; i++)
  7.      (*w)[i] = calloc(columnas, sizeof *(*w)[i]);
  8. }

Y cuando llames a la función pasas como primer argumento la dirección de la variable "m" utilizando el operador "dirección de" (el '&'):
Código
  1. reserva(&m, numeroalumnos, numeronotas);

Un saludo
« Última modificación: 17 Octubre 2013, 03:08 am por rir3760 » En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que falla en mi RO?
Juegos y Consolas
Bline 4 3,342 Último mensaje 27 Agosto 2005, 01:26 am
por MinusFour
Me falla el avi
Multimedia
cvatacho 5 2,712 Último mensaje 18 Enero 2007, 22:30 pm
por -Elkiot-
Disco duro falla aleatoriamente. ¿Posible falla en el motor? :P
Hardware
Ariath 3 5,027 Último mensaje 23 Junio 2010, 22:05 pm
por Aprendiz-Oscuro
Falla en televisor Aiwa cntext400 posible falla en el vertical imagen
Electrónica
Anonymous250 8 11,518 Último mensaje 1 Febrero 2013, 12:46 pm
por Anonymous250
[Bash] Alguien me dice donde falla donde me falla este codigo?
Scripting
legolas266 5 4,136 Último mensaje 4 Julio 2013, 15:01 pm
por MineHitex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines