Назначение таблицы значений без изменения имени переменной или создания необычного кода - PullRequest
0 голосов
/ 16 мая 2019

Это пример кода, с которым я имею дело.

switch(n){
  case 1:
      char tcol[4][100]={"Canadian Order","Achat Francais","china"};
      char trow[7][100]={"Item","Price","Qty","Total","Tax","Grand total"};
      Htable(trow,tcol,7,4,"");
      break;
  case 2:
      char tcol[3][100]={"Other column 1","2nd column"};
      char trow[4][100]={"1st row","2nd row","Row 3"};
      Htable(trow,tcol,4,3,"");
      break;
  case n:
  ...
}

По сути, я создаю функцию Htable, которая принимает имена строк и столбцов для таблицы HTML, а 3-й и 4-й аргументыколичество строк и столбцов.

Проблема, с которой я столкнулся, заключается в том, что компилятор считает, что я переопределяю массив, хотя каждое определение доступно только один раз из ветви коммутатора.Вот ошибки:

./html2.c:118: error: redefinition of ‘tcol’                          
./html2.c:110: error: previous definition of ‘tcol’ was here          
./html2.c:119: error: conflicting types for ‘trow’                    
./html2.c:111: error: previous declaration of ‘trow’ was here        

И это происходит для каждого блока кода, который у меня есть.Единственное частичное решение, которое я могу придумать, заключается в следующем:

char tcol[1][4][100]={"Canadian Order","Achat Francais","china"};
char trow[1][7][100]={"Item","Price","Qty","Total","Tax","Grand total"};

char trow[2][4][100]={"1st row","2nd row","Row 3"};
char tcol[2][4][100]={"Other column 1","2nd column"};

switch(n){
  case 1:
      Htable(trow[1],tcol[1],7,4,"");
      break;
  case 2:
      Htable(trow[2],tcol[2],4,3,"");
      break;
  case n:
  ...
}

Есть ли простой способ сделать это, когда компилятор C принимает его, не добавляя причудливый код для разделения строк?

1 Ответ

0 голосов
/ 16 мая 2019

Есть ли простой способ сделать это, когда компилятор C принимает его, не добавляя причудливый код для разделения строк?

Объявление объектов tcol, trow в отдельных подблоках, @ WhozCraig

void foo(int n) {
  switch (n) {
    case 1: { // add {
      char tcol[4][100] = {"Canadian Order", "Achat Francais", "china"};
      char trow[7][100] =
          {"Item", "Price", "Qty", "Total", "Tax", "Grand total"};
      Htable(trow, tcol, 7, 4, "");
      break;
    } // add }
    case 2: { // add {
      char tcol[3][100] = {"Other column 1", "2nd column"};
      char trow[4][100] = {"1st row", "2nd row", "Row 3"};
      Htable(trow, tcol, 4, 3, "");
      break;
    } // add }
  }
}

Обратите внимание, что время жизни tcol относится только к блоку.Заставьте static длиться всегда.Тем не менее, я подозреваю, что в зависимости от более крупного кода может потребоваться новый подход - что-то необычное .


За исключением оптимизации размера: рассмотрите возможность формирования массива указателей на строки.

      // char tcol[4][100] = {"Canadian Order", "Achat Francais", "china"};
      const char *tcol[] = {"Canadian Order", "Achat Francais", "china", NULL};

Также необходимо изменить на Htable().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...