• Martes 14 de Mayo de 2024, 23:00

Autor Tema:  Convoluciones En C++  (Leído 10665 veces)

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Convoluciones En C++
« en: Lunes 12 de Julio de 2004, 21:06 »
0
Estoy tratando de crear un programita para simular convoluciones, solo q al llegar a ciertos espacios en el arreglo en donde estoy guardando los datos, se corrompen, por ejemplo, cuando r=15 y w=15, siendo n=112, se pone un numero incorrecto...
Espero q me puedan ayudar... no se si habra espacios en los arreglos en donde no se puedan guardar ciertos datos...

Estoy utilizando C++ en una maquina sunblade2000 de sun...

GRACIAS...

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #1 en: Lunes 12 de Julio de 2004, 21:38 »
0
Cita de: "PpLopez"
... no se si habra espacios en los arreglos en donde no se puedan guardar ciertos datos...

¿De cual fumaste para escribir eso?  :blink:

Si eres un experto en C++, realmente no se que pudo pasar (no cuentas muchos detalles de tu caso :rolleyes:  ) , pero si eres principiante... (Se nota que eres matemático, sólo los matemáticos le darían nombres tan... a sus variables como r,w y n y encima esperar que todos sepamos de que se trata o que usemos todos EXACTAMENTE la misma nomenclatura). Digamos que C++ no es para principiantes.   :rolleyes:

P.D.

Si los resultados salen algo caóticos e inesperados casi siempre es un bug con la administración de memoria, además recuerda que en programación existen pérdidas de precisión, desbordamientos, etc.

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #2 en: Lunes 12 de Julio de 2004, 21:50 »
0
Lo q pasa q el caso no son las variables, solo las puse de ejemplo, el caso es q al llegar a una posicion en el arreglo, los datos no se presentan como deben, se corrompen, en la posicion [14][111] por ejemplo salen datos q no deben, siendo q el programa esta bien, y es esa posicion la del problema por q le quiero por ejemplo dar un valor directo a esa posicion y se pone uno distinto al q yo quiero...

Perdon si no me pude explicar en el anterior, lo de r,w y n, era solo para ejemplificar, espero q con esto ya quede mas claro y me puedan ayudar, si???

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #3 en: Lunes 12 de Julio de 2004, 21:58 »
0
Definitivamente 1 a 100 que es un bug de memoria, la esencia del algoritmo puede estar perfecta, pero algo falla con la administración de memoria.

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #4 en: Lunes 12 de Julio de 2004, 22:03 »
0
Gracias Amilius, me podrias sugerir q hacer para erradicar este problema??? sera conveniente usar un archivo, o habra algo mas sencillo...??? gracias....

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #5 en: Lunes 12 de Julio de 2004, 22:09 »
0
Usar archivos para nada...

Mejor postea la parte del algoritmo que reserva memoria para el arreglo, la parte que libera la memoria reservada y la parte donde quieres asignar un valor a la posición[14][111]  (sólo esas partes).

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Convoluciones En C++
« Respuesta #6 en: Martes 13 de Julio de 2004, 05:51 »
0
si usas lenguaje c,
casi que puedo jurar que el errore es tuyo, como dice amilus en la administracion de memoria...
puede que no estes usando malloc o que estes haciendo mal uso de el, o que estes haciendo buen uso pero no siempre...

casi que se puede jurar...

dejanos ver tu codigo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #7 en: Martes 13 de Julio de 2004, 18:41 »
0
Hola... gracias por ayudarme... miren, como les decia lo tenia con un arreglo bidimensional, y pues pensando en q quiza aplique mal la formula, lo hice ahora en un arreglo unidimensional, modifique la formula y lo aplique asi, y pasa lo mismo, llega un momento en q los datos se empiezan a corromper...

Lo q me puedan ayudar se los agradeceria, soy un novato en C++ y la vdd q ando bien enredado... }

Ahi les va el codigo.. primero el q tenia con arreglo de dos dimensiones y luego el q he hecho con una sola...

//CON ARREGLO BIDIMENSIONAL:
#include <stdio.h>
#define R 50
#define N 6000

int w;

double a (int r){
   int matriz[R][N];
   int i,j;

   for(i=0;i<R;i++){

      for(j=0;j<N;j++){
         matriz[j]=0;
      }
   }

   for(i=1;i<=w;i++){
      matriz[1]=1;
   }

   for(i=2;i<=r;i++){

      for(j=1;j<=r*w;j++){
         if(j<i || j>i*w){
            matriz[j]=0;
         }
         else{
            matriz[j] = matriz[j-1] + matriz[i-1][j-1] -
matriz[i-1][j-w-1];
         }
      }
   }

   for(i=r;i<=r*w;i++){
      printf("ar(%d)=%d\n",i,matriz[r]);
   }
   return 0;
}

int main(){
   int r;
   printf("r=");scanf("%d",&r);
   printf("w=");scanf("%d",&w);
   a®;
   return 0;
}




//CON ARREGLO UNIDIMENSIONAL

#include <stdio.h>
#define T 1000000
int w;
double m[T];

double a(int r, int n){
   int i,j,p,inicio,fin,ancho,iniant,terant,anchoant;
   p=0;
   inicio=0;
   fin=0;
   iniant=0;
   terant=w-1;
   
   for(i=0;i<T;i++){
      m=0;
   }

   for(i=0;i<w;i++){
      m=1;
   }

   for(j=1;j<r;j++){

      inicio += (((w-1)*j)+1);
      fin = inicio + ((w-1)*(j+1));
      ancho = fin - inicio + 1;
      anchoant = terant - iniant + 1;
   
      for(i=inicio;p!=1;i++){

         if(i==inicio){
            m=1;
         }
         else{
            if(i>inicio){
               m += m[i-1];
            }

            if(i-anchoant>=iniant &&  i-anchoant<=terant){
               m += m[i-anchoant];
            }

            if((i-(ancho+1))>=iniant && (i-(ancho+1))<=terant){
               m -= m[i-ancho-1];
            }
         }
         if(i>=fin){
            p=1;
         }
      }
      terant = fin;
      iniant = inicio;
      p=0;
   }
   return 0;
}


int main(){
   int r,n,i,j,inicio;
   inicio=0;

   printf("r= ");scanf("%d",&r);
   printf("w= ");scanf("%d",&w);
   a(r,r*w);

   for(j=r-1;j>0;j--){
      inicio += (((w-1)*j)+1);
   }

   for(i=r;i<=r*w;i++){
      printf("ar(%d) = %f\n",i,m[inicio-r+i]);
   }
   return 0;
}




MUCHAS GRACIAS....

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #8 en: Martes 13 de Julio de 2004, 21:06 »
0
ME PODRIAN DECIR Q HACER???  :( ... GRACIAS... DE VDD Q SE LOS AGRADECERE... SOY UN NOVATO... :unsure:

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #9 en: Martes 13 de Julio de 2004, 23:27 »
0
Aqui hay un lío: todo ok, pero con [j], no controlas que se salga de los límites del arreglo. en el caso que r*w sea mayor o igual a N escribirás en un sector de memoria "X", posiblemente pisando otras partes del tu mismo arreglo. Aunque en este caso no da problema es mejor controlar esa situación para evitar futuros problemas.

Otro lío es: [j-w-1], j va de 1 a r*w, cuando j sea 3 y teniendo w 15, sacas datos de una posición que sale de tu arreglo (posiciones negativas) y comienza todo a distorcionarse.

Sería bueno que primero pusieras todos los controles de rango de tu arreglo para asegurar que estén dentro de los límites 0..N-1, tanto al momento de asignar un valor y al momento de leer un valor.

Código: Text
  1.  
  2. for(j=1;j&#60;=r*w;j++){
  3. if(j&#60;i || j&#62;i*w){
  4. matriz[i][j]=0;
  5. }
  6. else{
  7. matriz[i][j] = matriz[i][j-1] + matriz[i-1][j-1] -
  8. matriz[i-1][j-w-1];
  9. }
  10. }
  11. }
  12.  
  13.  

PpLopez

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Convoluciones En C++
« Respuesta #10 en: Miércoles 14 de Julio de 2004, 21:35 »
0
Muchas gracias, ya lo solucione... entre otras cosas, ademas de controlar los rangos como me dijo "Amilius", cambie el tipo del arreglo, lo tenia en double, y lo cambie por long double, q en sun maneja un total de 16 bytes, y pues asi no se distorcionaban los datos...

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Convoluciones En C++
« Respuesta #11 en: Domingo 18 de Julio de 2004, 03:12 »
0
Cita de: "PpLopez"
Muchas gracias, ya lo solucione... entre otras cosas, ademas de controlar los rangos como me dijo "Amilius", cambie el tipo del arreglo, lo tenia en double, y lo cambie por long double, q en sun maneja un total de 16 bytes, y pues asi no se distorcionaban los datos...
Precisamente iba a preguntar eso :P. Cuando manejes operaciones con variables cuyo valor irá aumentando sin tener previsiones de su valor final, asegúrate de emplear un tipo de variable que pueda contener tus valores sin problemas. En este caso es mejor emplear el tipo de dato que más bytes te permita almacenar.

Saludos,
José Jorge (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip