2013-02-20 132 views
2

我無疑是一個矩陣是:爲什麼在這個代碼:我爲什麼不能編譯不聲明類似於const

/*Asignacion de valores en arreglos bidimensionales*/ 
#include <stdio.h> 

/*Prototipos de funciones*/ 
void imprimir_arreglo(const int a[2][3]); 

/*Inicia la ejecucion del programa*/ 
int main() 
{ 
    int arreglo1[2][3] = { { 1, 2, 3 }, 
        { 4, 5, 6 } };       
    int arreglo2[2][3] = { 1, 2, 3, 4, 5 }; 
    int arreglo3[2][3] = { { 1, 2 }, { 4 } }; 

    printf("Los valores en el arreglo 1 de 2 filas y 3 columnas son:\n"); 
    imprimir_arreglo(arreglo1); 

    printf("Los valores en el arreglo 2 de 2 filas y 3 columnas son:\n"); 
    imprimir_arreglo(arreglo2); 

    printf("Los valores en el arreglo 3 de 2 filas y 3 columnas son:\n"); 
    imprimir_arreglo(arreglo3); 

    return 0; 
} /*Fin de main*/ 

/*Definiciones de funciones*/ 
void imprimir_arreglo(const int a[2][3]) 
{ 
    int i; /*Contador filas*/ 
    int j; /*Contador columnas*/ 

    for (i = 0; i <=1; i++) 
    { 
    for (j = 0; j <= 2; j++) 
    { 
     printf("%d ", a[i][j]); 
    } 

    printf("\n"); 
    } 
} /*Fin de funcion imprime_arreglo*/ 

我不能編譯不宣而像常量的矩陣變量,並在一個向量我可以...爲什麼會發生這種行爲?對不起,如果我的英語不好,我說西班牙語。我會非常感謝你的回答。從

void imprimir_arreglo(const int a[2][3]); 

void imprimir_arreglo(const int a[2][3]) 
{ 

和你的代碼

+0

什麼?你的意思是函數參數?我認爲你可以,錯誤是什麼? – MatheusOl 2013-02-20 16:36:38

+0

我的編譯器告訴我,我必須修改數組的類型,但這種行爲只發生在矩陣,而不是在向量中,我想知道爲什麼? – 2013-02-20 19:24:37

回答

0

這個問題有一個真正的混亂。你不應該使用恆定的改性劑間接指針,如const int**,因爲有可能是一個爛攤子,像:

  1. 它是一個int **該值不能被修改?

  2. 或者,它是const int *的指針(甚至數組)嗎?

有一個topic about it on C-faq

例子:

const int a = 10; 
int *b; 
const int **c = &b; /* should not be possible, gcc throw warning only */ 
*c = &a; 
*b = 11;   /* changing the value of `a`! */ 
printf("%d\n", a); 

它不應該允許改變a的價值,gcc確實允許,並clang運行與警告,但並不會改變價值。

因此,我不知道爲什麼編譯器(與gccclang試過)抱怨(有警告,但工程)約const T[][x],因爲它是不準確與上述相同。但是,一般來說,我可能會說根據你的編譯器不同的方式解決了這種問題(如gccclang),所以從來沒有使用const T[][x]

最好的選擇,在我看來,就是用一個直接指針:

void imprimir_arreglo(const int *a, int nrows, int ncols) 
{ 
    int i; /*Contador filas*/ 
    int j; /*Contador columnas*/ 

    for (i = 0; i < nrows; i++) 
    { 
    for (j = 0; j < ncols; j++) 
    { 
     printf("%d ", *(a + i * ncols + j)); 
    } 

    printf("\n"); 
    } 
} 

,並呼籲:

imprimir_arreglo(arreglo1[0], 2, 3); 

這樣,你的功能更具活力,更加便於攜帶。

+0

好的謝謝你的答案,但我想知道爲什麼會發生這種行爲? – 2013-02-21 04:51:12

+0

@ChristianCisneros,我試圖用膚淺的方式解釋,但也許我不能。嘗試閱讀關於GCC的bugzilla [here](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20230)和[here](http://gcc.gnu.org/bugzilla/)的相同討論show_bug.cgi?ID = 16895)。 – MatheusOl 2013-02-21 11:49:38

+0

好的@MatheusOI謝謝你的出色答案,我會閱讀討論。 – 2013-02-21 15:28:06

0

刪除常量將正常工作。

+0

我知道@Armin,但我的疑惑是爲什麼這種行爲只發生在矩陣中,而不是在向量中? – 2013-02-20 19:23:01

+0

@ChristianCisneros據我所知[c]沒有矢量。如果你使用一個特殊的圖書館,你應該提及它。 – 2013-02-20 20:22:36

+0

向量是一個只有一個子索引的數組,矩陣是多個子索引的數組,據我所知 – 2013-02-21 04:49:43

相關問題