2012-10-01 39 views
6

estoy tratando de escribir el matricopy función que debe copiar una matriz pero el compilador se queja:¿Cómo copiar la matriz en C?

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

¿Puede ayudarme a entender?

+2

Puede copiar la matriz con memcpy, puede ser un poco más barato que esos bucles. – Benj

+0

http://stackoverflow.com/questions/16004668/c-allocating-a-matrix-in-a-function/27366086#27366086 Por encima de usted encontrará un programa que he hecho con funciones de asignación y manipulación de matrices en cualquier forma posible para C (gcc C11/C99). Tal vez sea útil 4u ... – 42n4

Respuesta

8

Usted puede simplemente utilizar memcpy

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

El destmat y srcmat deben tener el mismo tamaño.

esta función permite copiar solo la matriz completa.

esta función no puede copiar una matriz secundaria de la matriz madre.

ejemplo: Si tengo una matriz con 7 columnas y 7 filas. No puedo copiar con la función anterior una matriz secundaria (4 filas y 4 columnas) de la matriz madre.Para hacerlo, tenemos que hacer una copia de celda por celda

+2

para evitar advertencias simplemente cambie 'int *' por 'void *'. respuesta actualizada – MOHAMED

3

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

Por supuesto, a continuación, NúmeroDeColumnas es redundante.

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

+7

Incorrecto. A 'T [] []' no decae a 'int **'. – Puppy

-1

En matriscopy, su variable destmat es un puntero entero. Eso significa que el tipo de destmat[i] es un número entero. Como no puede indexar en un número entero, no puede tener destmat[i][j]. Probablemente desee que destmat sea del tipo int** y no int*.

+2

A 'T [] []' no * decae a 'T **'. – Puppy

0

Pruebe 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 allows variable length arrays(VLA) since c99 standard.

+1

alguna razón sobre por qué -1? – Marcus

+0

+ 1. Voy a probar este código, aunque es difícil de entender. Usar memcpy podría ser más simple si está permitido. –

-1

El destmat y srcmat se supone que los punteros dobles. Como int **destmat,int **srcmat Como en realidad está tratando de acceder a una matriz de punteros enteros que apuntan a algunos objetos enteros. Como un [i] [j] es que conoce el objeto en j'th collumn de i-ésima fila. Así que cuando defines int ** p; es como p es una matriz de punteros, cada uno apuntando a un objeto entero. Luego puedes acceder a él como p [i] [j]. Marque esto como respuesta si resolvió su problema.

+0

No. Un array 'array [i] [j]' NO decae en un 'int **' –

1

La declaración correcta para su 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 toda una gama multidimensinal axcept la primera dimensión debe fijarse en el argumento de la función.

Cuestiones relacionadas