2

私の疑問は:なぜこのコードで:

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

constのような行列変数を宣言せずにコンパイルすることはできません。また、ベクトルでコンパイルできます...なぜこの動作が発生するのですか?私の英語が悪いとすみません、私はスペイン語を話します。私はあなたの答えにとても感謝します。

4

2 に答える 2

0

この件については本当に混乱があります。const int**次のような混乱が生じる可能性があるため、 のような間接ポインタには定数修飾子を使用しないでください。

  1. int **値を変更できないということですか?

  2. それとも、のポインタ(または配列)const int *ですか?

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

したがって、上記とまったく同じではないため、コンパイラ (gccおよび を試したclang) が について不平を言う (警告が表示されますが、機能する)理由がわかりません。しかし、一般的に、この種の問題はコンパイラによって異なる方法で解決されると言えるかもしれません(および) 。const T[][x]gccclangconst 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 );

このようにして、関数はより動的で移植性が高くなります。

于 2013-02-20T20:37:13.647 に答える
0

const を削除

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

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

あなたのコードは動作します。

于 2013-02-20T16:38:52.587 に答える