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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Programa en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Programa en C  (Leído 2,324 veces)
GatitoCai93

Desconectado Desconectado

Mensajes: 1


Ver Perfil
[Ayuda] Programa en C
« en: 24 Julio 2014, 16:04 pm »

Hola estaba programando en C unas cosas que tengo que presentar y como soy nuevo en C no se usar bien el dev c++. Acabo de hacer este algoritmo y me salta un error de "se ha producido una violacion de acceso a memoria" usando arreglos. Hace un tiempo el profesor me dijo algo sobre los arreglos diciendo que hay que usarlos de otra manera, porque de la manera que estaba en el teorico que dio habia que usarlo con puntero, y en C a puntero no lo vimos, si alguien me puede decir cual es el error de este codigo, le estaria muy agradecido! muchas gracias!

P/D: creo que el error esta en la funcion carga!

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <math.h>
  5.  
  6. /* Problema : Corazón = Cáscara: Dada una Matriz de [n x m] de enteros, con n >= 3 y m >=3, determinar si la
  7. sumatoria de las celdas límites (cáscara) es igual que la sumatoria las celdas del interior (todas menos las
  8. límites). Por ejemplo, para la siguiente matriz de (4x4) */
  9.  
  10. using namespace std;
  11.  
  12. const int N = 3;
  13. const int M = 3;
  14. int carga (int x);
  15. int carga (int x) /* Funcion que permite cargar toda la matriz*/
  16. {
  17.  int register k,l;
  18.  for (k=0;k<N;k++)
  19.  {
  20.    for (l=0;l<M;l++)
  21.    {
  22.      printf ("Ingrese un numero ");
  23.      scanf ("%f",x);
  24.    }
  25.  }
  26. }
  27.  
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.    bool b;
  32.    int arr[N][M];
  33.    int cascara, corazon;
  34.    int num;
  35.    int c,d;
  36.    int register i,j ;
  37.    cascara = 0;
  38.    corazon = 0;
  39.    carga (num);
  40.    for (i=0; i<N; i+1)
  41.    {
  42.      for (j=0; j<M; j+1)
  43.      {
  44.        cascara = (cascara + arr[i][j]);
  45.        if ((i>0 && i<N-1)&&(j>0)&&(j<M-1))
  46.        {
  47.          corazon = (corazon + arr[i][j]);
  48.        }
  49.      }
  50.    }
  51.    cascara = (cascara - corazon);
  52.    if (cascara == corazon)
  53.    {
  54.      b = 1;
  55.    }
  56.    else
  57.    {
  58.      b = 0;
  59.    }
  60.  
  61.    system("PAUSE");
  62.    return EXIT_SUCCESS;
  63. }


« Última modificación: 24 Julio 2014, 16:26 pm por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [Ayuda] Programa en C
« Respuesta #1 en: 24 Julio 2014, 16:27 pm »

Compilandolo con VC++ tenes estas advertencias y/o errores:

(40) : warning C4552: '+' : operator has no effect; expected operator with side-effect
(42) : warning C4552: '+' : operator has no effect; expected operator with side-effect
(26) : error C4716: 'carga' : must return a value
(39) : warning C4700: uninitialized local variable 'num' used


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Ayuda] Programa en C
« Respuesta #2 en: 24 Julio 2014, 16:35 pm »

Nota inicial: Para el código, usa las etiquetas GeSHi, gracias.

Código
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <stdio.h>
  4. #include <math.h>

Si estás cargando las librerías cstdlib e iostream, estás programando en C++, no en C. Los includes de la librería estándar de C tienen TODOS el ".h"... en el caso de la librería de C++, NO hay includes con ".h". Te lo comento para que luego no te lleves sustos.

Código
  1. using namespace std;

Los espacios de nombre son también un elemento propio de C++... deberías quitarlo y, si te aparecen errores por ello, es porque estás haciendo uso de utilidades propias de C++.

Código
  1. int carga (int x);
  2. int carga (int x) /* Funcion que permite cargar toda la matriz*/
  3. {
  4. }

Las declaraciones de funciones ( en tu caso la primera línea del código que te he puesto ) sólo son necesarias cuando aparecen llamadas a la función antes que su implementación. Un ejemplo:

Código
  1.  
  2. void func3( void );
  3.  
  4. void func1( void )
  5. {  puts( "Hola\n" ); }
  6.  
  7. int main( void )
  8. {
  9.  func1( ); // Ok, su uso es posterior a su implementacion
  10.  func2( ); // Error, esta funcion no esta definida todavia
  11.  func3( ); // Ok, no esta implementada pero si definida
  12. }
  13.  
  14. void func2( void )
  15. { puts( "---\n" ); }
  16.  
  17. void func3( void )
  18. { puts( "Adios\n" ); }

Más cosas...

Código
  1. int carga (int x) /* Funcion que permite cargar toda la matriz*/
  2. {
  3.  int register k,l;
  4.  for (k=0;k<N;k++)
  5.  {
  6.    for (l=0;l<M;l++)
  7.    {
  8.      printf ("Ingrese un numero ");
  9.      scanf ("%f",x);
  10.    }
  11.  }
  12. }

La llamada a "scanf" esta mal por tres razones:

1. %f se usa para números con decimales (float, double)... x es de tipo entero (int)
2. scanf necesita un puntero a la variable donde debe almacenar los valores que introduzca el usuario... 'x' se está pasando por valor
3. 'carga' está recibiendo 'x' por valor, es decir, todos los cambios que se hagan en 'x' se van a perder una vez el código sale de la función 'carga'.

Ah si... segun la firma actual, 'carga' debería tener un return y devolver un entero... si una función no ha de devolver nada debe ir precedida de 'void'.

La función debería estar más bien así:

Código
  1. void carga (int* x) /* Funcion que permite cargar toda la matriz*/
  2. {
  3.  int register k,l;
  4.  for (k=0;k<N;k++)
  5.  {
  6.    for (l=0;l<M;l++)
  7.    {
  8.      printf ("Ingrese un numero ");
  9.      scanf ("%d",x);
  10.    }
  11.  }
  12. }

Ahora, 'x' es un puntero, por lo que, por un lado, scanf podrá almacenar el valor en la variable apuntada por 'x' sin problemas y, por otro, los cambios en 'x' se reflejarán fuera de la función.

Debido al cambio de la firma de "carga", también hay que cambiar ahora sus llamadas. "carga" ahora necesita un puntero:

Código
  1. int main(int argc, char *argv[])
  2. {
  3.    int num;
  4.    carga (&num);
  5. }

Más cosas...

Código
  1. int arr[N][M];
  2. int cascara;
  3. int i, j;
  4. for (i=0; i<N; i+1)
  5. {
  6.  for (j=0; j<M; j+1)
  7.  {
  8.    cascara = (cascara + arr[j]);
  9.  }
  10. }

'arr' es un arreglo bidimensional, luego para acceder a sus valores necesitas pasarle dos índices... tu estás pasando sólamente uno. Esto tendría que quedar más o menos así:

Código
  1. int arr[N][M];
  2. int cascara;
  3. int i, j;
  4. for (i=0; i<N; i+1)
  5. {
  6.  for (j=0; j<M; j+1)
  7.  {
  8.    cascara = (cascara + arr[i][j]);
  9.  }
  10. }

Además, 'arr' está definda tal que 'arr[N][M]'... no tiene sentido que le pases como primer índice 'j', que está definida en el rango '0..M'; necesitas un índice definido en el rango '0..N' y ese índice es 'i'... no 'j'.

Por otro lado, no has asignado valores a los elementos contenidos en 'arr', así como tampoco has asignado valores a 'cascara' (ni a otras tantas variables)... los resultados finales de las operaciones que tienes puestas ahí van a ser totalmente incoherentes, ya que estás leyendo basura:

Código
  1. int main( )
  2. {
  3.  int numero;
  4.  printf( "%d\n", numero );
  5. }

¿Qué imprime el código anterior? ¿tu lo sabes? yo lo único que se es que la salida del programa puede cambiar en diferentes ejecuciones. Sin embargo:

Código
  1. int main( )
  2. {
  3.  int numero = 10;
  4.  printf( "%d\n", numero );
  5. }

Estoy totalmente seguro que la salida de esta segunda versión será siempre '10'.

Más cosas... podría seguir pero creo que ya es bastante ayuda.

Moraleja: Estudia unos cuantos tutoriales o manuales de C antes de meterte en estos jardines... aprenderá más, será más satisfactorio para tí y aprenderás más ( lo pongo dos veces para darle énfasis... es importante).
« Última modificación: 24 Julio 2014, 16:37 pm por eferion » En línea

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: [Ayuda] Programa en C
« Respuesta #3 en: 24 Julio 2014, 17:35 pm »

bueno aquí va el mio que hace tiempo no venia, si quieres puedes revisar estos links para consulta sobre paso de matrices como referencia a funciones.

http://www.zator.com/Cpp/E4_3_8.htm
http://cryptomex.org/Tutorial-LengC/arreglos-parametros.html
http://casicodigo.blogspot.com/2012/09/como-pasar-una-matriz-o-arreglo-como.html


EI: Codigo borrado, no se hacen tareas.


no es el mejor código, pero funciona bien o eso creo, de todas maneras una cosa más: DEV-C++ APESTA
« Última modificación: 24 Julio 2014, 18:17 pm por Eternal Idol » En línea


leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: [Ayuda] Programa en C
« Respuesta #4 en: 24 Julio 2014, 18:25 pm »

bueno aquí va el mio que hace tiempo no venia................


EI: Codigo borrado, no se hacen tareas.


no es el mejor código, pero funciona bien o eso creo, de todas maneras una cosa más: DEV-C++ APESTA

Creo que te sobra, y a GatitoCai93 también:

Código
  1. cascara = cascara - corazon;

¡¡¡¡ Saluditos! ..... !!!!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA CON PROGRAMA
Diseño Gráfico
Luisango 1 2,449 Último mensaje 17 Abril 2005, 13:25 pm
por Sub_Cero
ayuda con mi programa
Programación Visual Basic
nitrox 2 2,349 Último mensaje 31 Julio 2005, 00:48 am
por Slasher-K
ayuda programa!!
Programación C/C++
rodrigo_103 4 3,365 Último mensaje 16 Septiembre 2012, 21:58 pm
por rodrigo_103
[Ayuda] ¿Cómo ejecutar otro programa desde mi programa de C#?
.NET (C#, VB.NET, ASP)
Zodiak98 1 6,139 Último mensaje 8 Diciembre 2013, 01:51 am
por Eleкtro
[AYUDA] Ayuda con NETCAT o cualquier otro programa similar
Dudas Generales
Noxware 0 2,180 Último mensaje 16 Junio 2014, 18:13 pm
por Noxware
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines