Estoy tratando de escribir la función matricopy que debe hacer una copia de una matriz, pero el compilador se queja:

/* minmatrix.c - test rows and columns of a matrix
* Copyright abandoned. This file is in the public domain. */
#include <stdio.h>
#define ROWCOUNT (3)
#define COLUMNCOUNT (4)
int imat[ ROWCOUNT ][ COLUMNCOUNT ]; 
char cmat[ ROWCOUNT ][ COLUMNCOUNT ];
double dmat[ ROWCOUNT ][ COLUMNCOUNT ];
int rmat[ ROWCOUNT ][ COLUMNCOUNT ]; 
void matriscopy (int * destmat, int * srcmat, int rowcount, int columncount) 
{
int i, j;
for (i=0; i<rowcount; i=i+1) /* rad-nr */
for (j=0; j<columncount; j=j+1) /* kolumn-nr */
destmat[i][j] = srcmat[i][j];
}
int main()
{
int i; int j;
int * ip; char * cp; double * dp;
for( i = 0; i < ROWCOUNT; i = i + 1 )
for( j = 0; j < COLUMNCOUNT; j = j + 1 )
{
imat[ i ][ j ] = 10000 + 100*i + j;
cmat[ i ][ j ] = 10*i + j;
dmat[ i ][ j ] = 1.0 + i/100.0 + j/10000.0;
rmat[ i ][ j ] = 0;
};
printf( "\n Examining imat:\n" );
for( ip = &imat[ 0 ][ 0 ];
ip <= &imat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
ip = ip + 1 )
printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );
printf( "\n Examining cmat:\n" );
for( cp = &cmat[ 0 ][ 0 ];
cp <= &cmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
cp = cp + 1 )
printf( "memory at: %lx contains value: %d\n", (unsigned long) cp, *cp );
printf( "\n Examining dmat:\n" );
for( dp = &dmat[ 0 ][ 0 ];
dp <= &dmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
dp = dp + 1 )
printf( "memory at: %lx contains value: %f\n", (unsigned long) dp, *dp );
/* Add a statement here to call your matriscopy function. */
printf( "\n Examining rmat:\n" );
for( ip = &rmat[ 0 ][ 0 ];
ip <= &rmat[ ROWCOUNT - 1 ][ COLUMNCOUNT - 1 ];
ip = ip + 1 )
printf( "memory at: %lx contains value: %d\n", (unsigned long) ip, *ip );
return( 0 );
}

Me sale este error:

$ cc minmatrix.c
minmatrix.c: In function matriscopy’:
minmatrix.c:18:17: error: subscripted value is neither array nor pointer nor vector
minmatrix.c:18:32: error: subscripted value is neither array nor pointer nor vector

Me puede ayudar a entender?

  • Usted puede simplemente copiar la matriz con memcpy, podría ser ligeramente más baratos que los bucles.
  • stackoverflow.com/questions/16004668/… por Encima de usted encontrará un programa que he hecho con las funciones de asignación y la manipulación de matrices en cualquier forma posible de C (gcc C11/C99). Tal vez va a ser útil 4u…

6 Comentarios

  1. 9

    Usted puede simplemente utilizar memcpy

    void matriscopy (void * destmat, void * srcmat) 
    {
    memcpy(destmat,srcmat, ROWCOUNT*COLUMNCOUNT*sizeof(int));
    }

    La destmat y srcmat debe tener el mismo tamaño.

    esta función permite copiar sólo la matriz completa.

    esta función no es capaz de copiar un sub de la matriz de la madre de la matriz.

    ejemplo: Si tengo una matriz con 7 columnas y 7 filas. No puedo copiar con la función anterior una sub-matriz de 4 filas y 4 columnas) de la madre de la matriz. Para Hacerlo, tenemos que hacer una copia de la célula por célula

    • para evitar advertencias acaba de cambiar int * por void *. respuesta actualizada
  2. 3

    Su matrixcopy firma de función debería tener este aspecto:

    void matrixcopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount, int columncount) 

    De curso, luego columncount es redundante.

    Alternativamente, usted puede tratar a la matriz como un 1D array de rowcount * columncount enteros. En ese caso, se puede hacer la copia en un solo bucle, o utilizar la función memcpy de la biblioteca estándar.

    • Mal. Un T[][] no decae a un int**.
  3. 1

    La correcta declaración de la función es:

    void matriscopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount) 

    por lo que su función se convierte en

    void matriscopy (int destmat[][COLUMNCOUNT], int srcmat[][COLUMNCOUNT], int rowcount) 
    {
    int i, j;
    for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<COLUMNCOUNT; j=j+1) /* kolumn-nr */
    destmat[i][j] = srcmat[i][j];
    }

    En un multidimensinal matriz de todos axcept la primera dimensión debe ser fijo en el argumento de la función.

  4. 0

    Probar esta versión matriscopy.

    void matriscopy (int * destmat, int * srcmat, int rowcount, int columncount)
    {
    int i, j;
    int (*dst)[columncount];
    int (*src)[columncount];
    dst = (int (*)[columncount])destmat;
    src = (int (*)[columncount])srcmat;
    for (i=0; i<rowcount; i=i+1) /* rad-nr */
    for (j=0; j<columncount; j=j+1) /* kolumn-nr */
    dst[i][j] = src[i][j];
    }

    C permite que la longitud de la variable matrices(VLA) desde el estándar c99.

    • cualquier razón acerca de por qué -1?
    • +1..voy a probar este código, aunque es difícil de entender. El uso de memcpy podría ser más sencillo si está permitido.
  5. -1

    En matriscopy, la variable destmat es un puntero entero. Eso significa que el tipo de destmat[i] es un número entero. Ya que no puedes índice en un entero, usted no puede tener destmat[i][j]. Usted probablemente querrá destmat a ser de tipo int** no int*.

    • Un T[][] no no de la caries a un T**.
  6. -1

    La destmat y srcmat se supone debe ser el doble de los punteros. Como int **destmat,int **srcmat Como está en realidad tratando de acceso a una matriz de enteros de punteros que apuntan a un número entero de objetos.Como un[i][j] es, usted sabe, el objeto en la j-esima collumn de la i-esima fila. Así que cuando usted definir int **p;es como p es una matriz de indicadores,cada uno de los cuales apunta a un objeto entero.A continuación, puede acceder a ella como p[i][j].
    Marca esto como respuesta si se resuelve el problema.

    • No. Una matriz array[i][j] NO decaer en un int**

Dejar respuesta

Please enter your comment!
Please enter your name here