Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: latinoalfredo en 29 Octubre 2012, 22:31 pm



Título: Vectores dinamicos
Publicado por: latinoalfredo en 29 Octubre 2012, 22:31 pm
hola tengo un preblema a la hora de usar vectores dinamicos en C, os cuento.
primero creo dos vectores:
int *m1,*m2;
m1=(int*)malloc(9*sizeof(int));
m2=(int*)malloc(9*sizeof(int));
les asigno valeros y compruevo que no hay problema, entonces creo un tercer vector
int *m3;
m2=(int*)malloc(9*sizeof(int));
Cuando empece a usarlos me empezaron a dar problemas y descubri un problema.El primer vector y el tercero tenian 4 espacios en comun en la asignacion de la memoria, con lo cual lo que ponia en la posicion 6 del primero de me ponia tambien en la 1 del 3. Como es esto posible si estan bien declarados.
Posdata: para avanzar en un vector uso un buble y avanzo en el vector con (m3+i*sizeof(int));


Título: Re: Vectores dinamicos
Publicado por: flony en 29 Octubre 2012, 23:10 pm
podrías poner el código así lo vemos... ;)


Título: Re: Vectores dinamicos
Publicado por: xiruko en 29 Octubre 2012, 23:11 pm
no se si habra sido un error escribiendo aqui, pero por si acaso no te has fijado:

Citar
entonces creo un tercer vector
int *m3;
m2=(int*)malloc(9*sizeof(int));

si en el codigo no tienes este error, diria que eso no deberia pasar, pues la funcion malloc() devuelve un puntero nulo en el caso de que no haya esa memoria disponible (que para un vector de 9 enteros suele haberla...). lo mejor seria que postearas el trozo de codigo del problema para asi poderlo solucionar sin suposiciones y demas.

Citar
Posdata: para avanzar en un vector uso un buble y avanzo en el vector con (m3+i*sizeof(int));

que es un buble? igualmente, para avanzar puedes hacer simplemente: m3[ i] (el espacio es para que aqui no salga en cursiva).

un saludo!


Título: Re: Vectores dinamicos
Publicado por: latinoalfredo en 30 Octubre 2012, 09:20 am
aqui os pongo el codigo de la funcion que recibe dos de los vectores y los suma en un tercero.

Código:
void sumar(int *m1,int *m2,int fm1,int cm1)
{
    int *m3,i,j,X;
    m3=(int*)malloc(fm1*cm1*sizeof(int));
            for (i=0;i<fm1;i++)
        {
            for (j=0;j<cm1;j++)
            {
                X=*(m1+(i*fm1+j)*sizeof(int))+*(m2+(i*fm1+j)*sizeof(int));
                *(m3+(i*fm1+j)*sizeof(int))=X;
               
            }
        }
        for (i=0;i<fm1;i++)
        {
            for (j=0;j<cm1;j++)
            {
                printf ("%d ",*(m3+(i*fm1+j)*sizeof(int)));
            }
            printf ("\n");
        }
este vector m3 es el que parece que comparte un trozo de memoria con m1, ya que si les digo que imprimar todas sus posiciones el 1 y el 3 tienen 4 iguales.


Título: Re: Vectores dinamicos
Publicado por: leosansan en 30 Octubre 2012, 11:17 am

int *m3;
m2=(int*)malloc(9*sizeof(int));<== aqui deberia ir m3= y no m2=




Título: Re: Vectores dinamicos
Publicado por: rir3760 en 30 Octubre 2012, 16:28 pm
El problema lo tienes al realizar la aritmética de punteros, tu la realizas en la forma:
Código
  1. X = *(m1 + (i * fm1 + j) *sizeof(int)) + *(m2 + (i * fm1 + j) * sizeof(int));
En cada una de las expresiones multiplicas al indice por "sizeof(int)", honestamente no entiendo porque.


En C la aritmética de punteros tiene un ajuste automático en base al tipo apuntado. En buen cristiano significa que:
Código
  1. a + i
Es la dirección en memoria del elemento con indice "i" en el array "a" sin importar el tipo, eso es transparente para el programador.

Y para acceder al objeto apuntado se utiliza:
Código
  1. *(p + i) /* Objeto en la posicion "i" del array */
  2.  
  3. /* O bien */
  4.  
  5. a[ i ]     /* Objeto en la posicion "i" del array */

En cuanto a la función "sumar" primero tienes que indicar que parámetros recibe (los nombres no son descriptivos) y la operación que debe realizar.

Un saludo


Título: Re: Vectores dinamicos
Publicado por: latinoalfredo en 30 Octubre 2012, 22:57 pm
gracias rir3760 tu respuesta soluciono mi problema.