Vectores dinamicos

Iniciado por latinoalfredo, 29 Octubre 2012, 22:31 PM

0 Miembros y 2 Visitantes están viendo este tema.

latinoalfredo

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));

flony

podrías poner el código así lo vemos... ;)
si un problema no tiene solucion entonces no es un problema...es algo inevitable

xiruko

no se si habra sido un error escribiendo aqui, pero por si acaso no te has fijado:

Citarentonces 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.

CitarPosdata: 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!

latinoalfredo

aqui os pongo el codigo de la funcion que recibe dos de los vectores y los suma en un tercero.


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.

leosansan

Cita de: latinoalfredo en 29 Octubre 2012, 22:31 PM

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



rir3760

El problema lo tienes al realizar la aritmética de punteros, tu la realizas en la forma:
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:
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:
*(p + i) /* Objeto en la posicion "i" del array */

/* O bien */

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
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

latinoalfredo

gracias rir3760 tu respuesta soluciono mi problema.