Matriz Multidimensional de inicialización en C

Estoy leyendo el libro “Programación en C” por Kochen y estoy confundido, donde explica la inicialización de la matriz multidimensional

Matriz Multidimensional de inicialización en C

En particular, no entiendo el significado de la siguiente frase tenga en cuenta que, en este caso, el interior de los pares de llaves se requiere que la fuerza de la correcta inicialización. Sin ellos, las dos primeras filas y las dos primeras partes de la 3ª fila hubiera sido inicializado en su lugar. No estoy seguro de qué diablos la frase significa.

OriginalEl autor user2635911 | 2013-08-09

5 respuestas

  1. 7

    Con el interior de la llaves de la matriz se parece a esto:

    10  5 -3  0  0
     9  0  0  0  0
    32 20  1  0  0
     0  0  8  0  0

    Así que en cada línea de los últimos 2 los valores son cero (porque no se establece un valor para ellos.
    Sin el interior llaves de la matriz tendría este aspecto:

    10  5 -3  9  0
     0 32 20  1  0
     0  8  0  0  0
     0  0  0  0  0

    Sólo los 12 primeros elementos que se convertiría los valores dados y el resto será 0.

    ¿Cómo funciona el no-interior-llaves ejemplo equivale a “las dos primeras filas y las dos primeras partes de la 3ª fila hubiera sido inicializado en su lugar”?

    OriginalEl autor Daniel K

  2. 14

    Esto es debido a que el M[4][5] matriz tiene 20 elementos (4 hileras de 5 columnas), y el orden por defecto para la inicialización es la fila por fila si las filas no se especifica explícitamente el uso de pares de interior de tirantes.

    Lo que esto significa es que si se asigna el mismo 12 de valores como una lista lineal simple, sin el interior pares de llaves, a continuación, se asignan valores a las dos primeras filas (2*5 = 10 elementos), además de las 2 primeras columnas de la tercera fila. (Los 8 restantes elementos de la matriz que no explícitamente inicializar automáticamente se establece en 0.)

    El compilador de C es consciente de que cada fila sólo tiene 5 columnas, y se ajustarán automáticamente a la lista de números en la fila de al lado cada vez que el 5-el margen de la columna es alcanzado. Por lo tanto,

    int M[4][5] = {10, 5, -3, 9, 0, 0, 32, 20, 1, 0, 0, 8};

    se entiende

    int M[4][5] =
    {
      {10,  5, -3, 9, 0},
      { 0, 32, 20, 1, 0},
      { 0,  8,  0, 0, 0},
      { 0,  0,  0, 0, 0}
    };

    Puede reemplazar el orden predeterminado mediante el uso de interior llaves para separar el 12 de valores en las filas de su propio gusto (pero, naturalmente, no más de 5 columnas por fila para esta definición de una matriz M).

    Por ejemplo, cuando se utiliza interior de los apoyos para separar el mismo 12 de valores en cuatro grupos de 3, como su página del libro muestra, entonces esas interior de interpretar las llaves para inicializar separar las filas de la matriz multidimensional. Y el resultado será inicializar cuatro filas de la matriz, pero sólo las 3 primeras columnas de los cuatro filas, la configuración de las columnas restantes a cero (dos en blanco los valores cero al final de cada fila).

    Es decir, el compilador de C es consciente de que la matriz M tiene 5 columnas en cada fila, y así va a agregar las columnas que faltan para cada fila, de modo que cada fila tiene 5 columnas, y por lo que la matriz no tendrá un total de 20 valores:

    int M[4][5] =
    {
      {10,  5, -3},
      { 9,  0,  0},
      {32, 20,  1},
      { 0,  0,  8}
    };

    se entiende

    int M[4][5] =
    {
      {10,  5, -3, 0, 0},
      { 9,  0,  0, 0, 0},
      {32, 20,  1, 0, 0},
      { 0,  0,  8, 0, 0}
    };
    Pero, al comparar los dos inicialización de donde eres también la escritura de todos los implícita 0, ¿cómo es que el primero (que representa, al interior de aparatos usados) supone que la segunda (con interior de aparatos usados) con las dos primeras filas y las dos primeras de los elementos de la tercera fila se inicializa? Parece que todos los números son todavía ser inicializado, pero no en los lugares correctos. De hecho, sólo la primera fila está en el lugar correcto.

    OriginalEl autor Joseph Myers

  3. 7

    Desde todas las matrices internamente se comportan como 1d matrices, se tiene que especificar con los soportes que las filas exactamente inicializar.

    Por ejemplo:

    int a[4][5] = {
                  { 1, 2, 3 },  //those are the elements of the first row.
                                //only the first 3 elements are initialized
                  { 1, 2, 3, 4} //those are the elements of the 2nd row.
                                //only the first 4 element are initialized
                  };
                                //everything else will be equal to 0

    mientras

    int a[4][5] = { 1, 2, 3, 1, 2, 3, 4}; //this will initialize first 5 elements 
                                          //of the first row and then continue 
                                          //with the 2nd one making the first 2 
                                          //elements to be 3 and 4 respectivly
                                          //everything else will be equal to 0

    OriginalEl autor Alexandru Barbarosie

  4. 2

    Sería de gran ayuda para ver el ejemplo específico.

    Una matriz multidimensional es un array de arrays. (No es sólo azúcar sintáctico para una larga 1-dimensiones de la matriz.)

    En un archivo de inicialización, es legal omitir trailing elementos (que implícitamente se inicializa a cero) y el interior de llaves.

    :

    int arr[2][2];

    una inicialización completa aspecto:

    int arr[2][2] = { { 10, 20 }, { 30, 40 } };

    Usted puede (pero en mi humilde opinión no debería) omitir el interior de llaves:

    int arr[2][2] = { 10, 20, 30, 40 };

    y el compilador mapa los elementos de la inicialización de los elementos de arr.

    Si se omite trailing elementos:

    int arr[2][2] = { { 10, 20 } };

    a continuación, la segunda fila es implícitamente inicializado a { 0, 0 }.

    O usted podría escribir:

    int arr[2][2] = { { 10 }, { 20 } };

    que sería asignar los valores 10 y 20 para el primer elemento de cada fila, no a la primera fila.

    De nuevo, es difícil decir exactamente lo que el autor estaba hablando sin ver un ejemplo, pero un interior con llave le dice al compilador para iniciar una nueva fila, incluso si la primera fila es incompleta.

    Si el suministro de inicializadores para todos los 4 elementos (o, más generalmente, todos X * Y elementos), el interior de los apoyos no son estrictamente necesarias; el orden de los elementos es el mismo de cualquier manera.

    Personalmente, me parece mucho más clara para incluir a todo el interior de llaves de todos modos, debido a que reflejan la estructura real se está inicializando.

    (¿Cuál es la diferencia entre un 1-dimensiones de la matriz y una de 2 dimensiones de la matriz, además de azúcar sintáctico? Dada la anterior declaración de arr, si se tratara de la misma como un 1-dimensiones de la matriz, a continuación, arr[0][2] sería el mismo que arr[1][0], con el segundo índice se convierte en la segunda fila. Y se puede trabajar de esa manera, en la práctica, pero en realidad arr[0][2] tiene un comportamiento indefinido. Esto tiene consecuencias prácticas; un compilador de optimización que asumir que todos los límites están dentro del rango, y generar el código que se comporta mal si esa suposición es violado.)

    Ver también esta pregunta.

    OriginalEl autor Keith Thompson

  5. 1

    Multidimensionales los arrays en C son sólo “azúcar sintáctico” para arrays de una dimensión. Cuando se trata de asignar un 4 x 5 int matriz, realmente eres la asignación de espacio para 20 números enteros en una fila en la memoria. Estos enteros se almacenan todos los elementos de la primera fila, a continuación, todos los elementos de la segunda fila, etc.

    Sin el interior de llaves, su inicializador es 1D, y así, indica que desea inicializar los 12 primeros de estos 20 números enteros, es decir, las dos primeras filas y las dos primeras de los elementos de la tercera fila.

    No hay matrices multidimensionales son matrices de matrices. Dada la declaración de int arr[3][3];, refiriéndose a arr[0][3] tiene un comportamiento indefinido, incluso aunque se podría esperar que es equivalente a arr[1][0].
    Me estaba refiriendo a la memoria subyacente de la representación de la matriz, que es lo que es relevante aquí, y no lo que sugiere que el acceso a las matrices se comporta de un modo equivalente. Buen punto, sin embargo.
    El tipo C del sistema es una cosa diferente de la representación subyacente.
    Hm, supongo que no se puede llamar azúcar sintáctico. Es el compilador de C que se requiere para interpretar una 1D inicializador de una matriz 2D como inicializar las dos primeras filas y las dos primeras columnas, como si la matriz 2D se almacenan de forma contigua en la memoria?
    si, en este contexto, es perfectamente pertinente, la frase azúcar sintáctico, es ilustrativo. Y, me hizo sonreír. Gracias.

    OriginalEl autor 1”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *