C инициализируют массив в структуре

Да существует Поставщик SqlLite Linq , как упомянуто компактным SQL-сервером Выезда CMS

, и он работает хорошо с Linq

существует другой поток на ПОЭТОМУ, который необходимо проверить

22
задан 13 October 2009 в 03:14
поделиться

5 ответов

Вы можете заставить эту работу работать в gcc, сделав структуру либо статической , либо глобальной, но оказывается, что инициализация гибких элементов массива не соответствует требованиям, и поэтому вероятно не работать, кроме как с gcc. Вот способ сделать это, просто используя функции, соответствующие C99 ...

#include <stdlib.h>
#include <stdarg.h>

typedef struct Grid {
  int rows;
  int cols;
  int grid[];
} *Grid;

Grid newGrid(int, int, ...);

Grid newGrid(int rows, int cols, ...)
{
Grid g;
va_list ap;
int i, n = rows * cols;

  if((g = malloc(sizeof(struct Grid) + rows * cols * sizeof(int))) == NULL)
    return NULL;
  g->rows = rows;
  g->cols = cols;
  va_start(ap, cols);
  for(i = 0; i < n; ++i)
    g->grid[i] = va_arg(ap, int);
  va_end(ap);
  return g;
}
.
.
.
Grid g1, g2, g3;
g1 = newGrid(1, 1, 123);
g2 = newGrid(2, 3, 1, 1, 1,
                   2, 2, 2);
g3 = newGrid(4, 5, 1,  2,  3,  4,  5,
                   6,  7,  8,  9, 10,
                  11, 12, 13, 14, 15,
                  16, 17, 18, 19, 20);
12
ответ дан 29 November 2019 в 04:40
поделиться

Вот моя версия:

#include <stdio.h> 

struct matrix {
  int rows;
  int cols;
  int **val;
} a = {        .rows=3,  .cols=1,
        .val = (int*[3]){ (int[1]){1},
                          (int[1]){2},
                          (int[1]){3} } },

  b = {        .rows=3,  .cols=4,
        .val = (int*[3]){ (int[4]){1, 2, 3, 4},
                          (int[4]){5, 6, 7, 8},
                          (int[4]){9,10,11,12} } };

void print_matrix( char *name, struct matrix *m ){
  for( int row=0;row<m->rows;row++ )
    for( int col=0;col<m->cols;col++ )
      printf( "%s[%i][%i]: %i\n", name, row, col, m->val[row][col] );
  puts("");
}

int main(){
  print_matrix( "a", &a );
  print_matrix( "b", &b );
}
27
ответ дан 29 November 2019 в 04:40
поделиться

У вас нет массива переменной длины (VLA) в вашей структуре. То, что у вас есть в вашей структуре, называется гибким элементом массива . Гибкий член массива не имеет абсолютно никакого отношения к VLA. Гибкие элементы массива в C существуют для легализации и поддержки старой доброй идиомы «взлома структуры», которая основана на динамическом выделении памяти для структурных объектов с конечными массивами разного размера.

Гибкие элементы массива не могут быть инициализированы с помощью агрегатных инициализаторов , что вы, кажется, пытаетесь сделать в своем коде. То, что вы здесь пытаетесь сделать, просто невозможно. В C. нет такой возможности.

Между тем, текст сообщения об ошибке, сгенерированный вашим компилятором, похоже, предполагает, что он поддерживает что-то подобное как расширение. Это может быть правдой,

3
ответ дан 29 November 2019 в 04:40
поделиться

Я не верю, что это возможно или поддерживается. Как указывает DigitalRoss , вы можете инициализировать с помощью литерала в случае статических массивов ... хотя я до сих пор не уверен, включен ли он в стандарт или просто расширение. Кажется, я не могу найти в Стандарте пункт, поддерживающий буквальную инициализацию гибких массивов, хотя я вижу, что gcc явно поддерживает его .

1
ответ дан 29 November 2019 в 04:40
поделиться

Версия, использующая malloc:

#include <stdio.h>
#include <stdlib.h>

typedef struct Grid {
  int rows;
  int cols;
  int *grid;
} Grid;

/* Should validate params */
Grid
buildGrid(int rows, int cols, int vec[]) {

    Grid grid;
    grid.rows = rows;
    grid.cols = cols;
    int i;

    if ( (grid.grid = malloc(sizeof(vec))) == NULL ) {
        /* do something.*/
    }

    for(i = 0; i < sizeof(vec) ; i++ ) {
        grid.grid[i] = vec[i];
    }

    return grid;
}
-1
ответ дан 29 November 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: