matrices - error: argumento de tipo no válido de unario '*' (tiene 'int') *(*(m+r)+c) = s; //guárdalo en la matriz resultante

CorePress2024-01-25  8

int main(void)
{
        int r,c,i,j,k,s;
        printf("Enter the numbers of columns of the matrices: "); //asking the user about the rows and columns
        scanf("%d%d",&r,&c);
        int *arr = (int *)malloc(r * c * sizeof(int));  //dynamically alloting the array 1
        int *a = (int *)malloc(r * c * sizeof(int));    //dyanamically alloting the array 2
        int *m = (int *)malloc(r*c*sizeof(int));        //dynamically alloting the resulting array
        printf("Enter the elements for the first matrix: \n"); //entering the elements of array 1
        for(i=0;i<r;i++)
        {
                for(j=0;j<c;j++)
                {
                        scanf("%d", (*( arr + r ) + c));
                }
                printf("\n");
        }
        printf("Enter the elements for the second matrix: \n"); //entering the elements of array 2
        for(i=0;i<r;i++)
        {
                for(j=0;j<c;j++)
                {
                        scanf("%d", (*( a + r ) + c));
                }
                printf("\n");
        }
        for(i=0;i<r;i++)  //multiplying the matrices
        {
                for(j=0;j<c;j++)
                {
                s=0;  //alloting an element and it's value as zero
                        for(k=0;k<c;k++)
                        {
                                s += (*(arr+r)+k) * (*(a+k)+ c);
                        }
                *(*(m+r)+c) = s; //save it in the resulting matrix
                }
        }
        printf("The multiplied matrix is: \n"); //printing the multiplied matrix
        for(i=0;i<r;i++)
        {
                for(j=0;j<c;j++)
                        printf("%d ",(*( m + r) + c));
                printf("\n");
        }
        free(arr);
        free(a);
        free(m);
        return 0;

*(*(m+r)+c) Está bastante claro lo que dice el error. *(m+r)+c es un int. Por lo tanto, no se puede desreferenciar.

- kaylum

28/03/2021 a las 10:33

Lo declaré dinámicamente como un puntero int, ¿verdad?

- Surya Tejaswi

28 de marzo de 2021 a las 10:53

m es un puntero int. *(m+r) elimina la referencia al puntero y da como resultado un int. Por lo tanto, no puede desreferenciar ese resultado int como lo está haciendo en *(*(m+r)+c). Dos estrellas significan que es necesario que haya dos punteros. Sólo tienes un puntero.

- kaylum

28 de marzo de 2021 a las 10:58

Ah, muchas gracias por abrir los ojos, lo estaba intentando mucho.para conseguir eso

- Surya Tejaswi

28/03/2021 a las 11:19

@SuryaTejaswi Esta pregunta y sus respuestas hacen un muy buen trabajo al explicar cómo las matrices usan la memoria: asignar correctamente matrices multidimensionales

- Andrew Henle

28/03/2021 a las 13:05



------------------------------------

Hay varios problemas en su código, supongo que se debe a malentendidos sobre cómo funcionan los punteros y las matrices.

En primer lugar, ustedNecesitas aprender que para cualquier puntero (o matriz) my índice r, la expresión *(m + r) es exactamente igual a m[r]. Si hacemos esta sustitución en tu expresión *(*(m + r) + c) entonces sería *(m[r] + c) que parece que quieres que sea m[r][c].

Tiene al menos tres problemas:

La primera es que m[r] es un int, por lo que m[r] + c también es un int, y no se puede hacer referencia a eso.

La segunda es que utilizas los tamaños de matriz en tu expresión, no las posiciones i y j.

El tercer problema es que si bien los conjuntos de conjuntos se pueden emular usando un conjunto de una sola dimensión, no funcionan como punteros a punteros, y la aritmética para obtener un elemento en ellos no funciona usando solo la suma simple.

Si bien los dos primeros puntos deberían ser bastante fáciles de entender, elEl último podría ser un poco más difícil. Primero es necesario saber cómo se distribuye una matriz de matrices en la memoria, así que tomemos una matriz simple:

int m[2][3];

Esto se verá así en la memoria:


+---------+---------+---------+---------+---------+---------+
| m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] |
+---------+---------+---------+---------+---------+---------+

Para llegar a m[i][j] no podemos simplemente sumar i y j para obtener el desplazamiento. Por ejemplo, tomemos el caso de i == 0 y j == 1, entonces i + j sería 1. Esto choca con i == 1 y j == 0 donde nuevamente la suma de i + j también sería 1. Entonces ambos casos (i == 0 && j == 1 and i == 1 && j == 0) usarían el mismo elemento, lo cual no queremos.

En su lugar, necesitamos usar la multiplicación para la "fila" número (i en este caso) y suma para la columna (j). Y necesitamos multiplicar con el tamaño de fila 2. Entonces, para obtener m[i][j] usaríamos m + (i * 2) + j (usando la matriz de ejemplo demultado anteriormente).

Por lo tanto, en su código, siempre que intente utilizar una sola celda en la "matriz" necesitas usar m[i * r + j].

5

¿Puedes ayudarme a asignar s al producto de los elementos de la matriz? Parece que tengo un problema con eso

- Surya Tejaswi

28/03/2021 a las 11:35

@SuryaTejaswi ¿No está funcionando m[i * r + j] = s?

Un tipo programador.

28 de marzo de 2021 a las 12:46

Sí, pero no encuentro la alternativa para s += (*(arr+r)+k) * (*(a+k)+ c);

- Surya Tejaswi

29 de marzo de 2021 a las 2:30

@SuryaTejaswi Primero tienes que decidir cuál de las variables de índice i, j o ​​k necesitas usar y dónde.

Un tipo programador.

29 de marzo de 2021 a las 5:27

Entendido, muchas gracias

- Surya Tejaswi

29 de marzo de 2021 a las 9:47



------------------------------------

El puntero arr (y otros punteros en su programa) declarados como

 int *arr = (int *)malloc(r * c * sizeof(int));

tiene el tipo int *. Entonces, desreferenciando el puntero

scanf("%d", (*( arr + r ) + c));

obtienes un objeto del tipo int mientras que la función scanf espera un puntero...

Además en estos bucles

    for(i=0;i<r;i++)
    {
            for(j=0;j<c;j++)
            {
                    scanf("%d", (*( arr + r ) + c));
            }
            printf("\n");
    }

la expresiónla sesión (*( arr + r ) + c) no depende ni de i ni de j.

Deberías escribir al menos me gusta

    for(i=0;i<r;i++)
    {
            for(j=0;j<c;j++)
            {
                    scanf("%d", arr + i * c + j );
            }
            printf("\n");
    }

Otro enfoque consiste en asignar una matriz bidimensional de longitud variable como

 int ( *arr )[c] = (int *)malloc( sizeof( int[r][c] ) );

y utilizar dos índices para acceder a los elementos de la matriz.

Preste atención a que las matrices tienen dimensiones incorrectas para la operación de multiplicación. Es decir, si la primera matriz tiene dimensiones r y c, entonces la segunda matriz debería tener dimensiones cy r y la matriz resultante tendrá dimensiones r y r.

0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare