Zorko писал(а):
А экспорт константных массивов предстоит сделать нам. Меня только смущает вот что. Как быть с отображением таких массивов при просмотре интерфейса? Показывать ли все данные экспортированного массива? Для небольших массивов это вроде бы и полезно. А вот если массивы будут огромные, то может получиться мега-простыня из цифр. Олежек, интересует твоё мнение.
Я всё ещё плохо представляю механизм экспорта. Может быть можно сделать так, чтобы небольшие массивы выводились прямо, а у больших выводить только структуру и ссылку, по которой открывался бы просмотр элементов в отдельном окне?
Zorko писал(а):
Я не поленился и написал о проблеме сообществу разработчиков SDCC. Посмотрим, что ответят.
Там уже кое-что ответили. Philipp Krause
предложил использовать конструкцию, наподобие такой
Код: "C"
const char Msg[3][7] =
{{72,101,108,108,111,33,0},
{69,114,114,111,114,0,0},
{84,114,121,0,0,0,0}};
Действительно, если внести такие изменения в С-исходник, то генерируется код
Код: "ASM"
_Msg:
.db #0x48 ; 72 'H'
.db #0x65 ; 101 'e'
.db #0x6C ; 108 'l'
.db #0x6C ; 108 'l'
.db #0x6F ; 111 'o'
.db #0x21 ; 33
.db #0x00 ; 0
.db #0x45 ; 69 'E'
.db #0x72 ; 114 'r'
.db #0x72 ; 114 'r'
.db #0x6F ; 111 'o'
.db #0x72 ; 114 'r'
.db #0x00 ; 0
.db #0x00 ; 0
.db #0x54 ; 84 'T'
.db #0x72 ; 114 'r'
.db #0x79 ; 121 'y'
.db #0x00 ; 0
.db #0x00 ; 0
.db #0x00 ; 0
.db #0x00 ; 0
без всяких инициализаций. Это, в принципе, то, что нам и нужно (?).
Аналогичный результат получается ,если написать
Код: "C"
typedef
CHAR const MsgStr[3][7];
MsgStr Msg =
{{72,101,108,108,111,33,0},
{69,114,114,111,114,0,0},
{84,114,121,0,0,0,0}};
Можно было бы переделать кодогенерацию. Но здесь есть сложность - придется вставлять слово const внутрь typedef. Можно завести для этого два разных типа
Код: "C"
typedef
CHAR MsgStr[3][7];/* для обычных массивов */
typedef
CHAR const _const_MsgStr[3][7];/* для константных массивов */
А может даже лучше употреблять модификатор const два раза:
Код: "C"
typedef
CHAR const MsgStr[3][7];
const MsgStr Msg =
{{72,101,108,108,111,33,0},
{69,114,114,111,114,0,0},
{84,114,121,0,0,0,0}};
чтобы
1)идентификатор Msg всегда указывал на одну и ту же область памяти (адрес, связанный с идентификатором Msg, - константа)
2)сами значения в этой области нельзя было изменить.
Вот, только вопрос, будет ли при этом совместимость по присваиванию и прочее, ведь константные массивы в Оберон-коде у нас толкуются как IN-параметры.
Впрочем, разработчики SDCC
признали наличие ошибки, так что немного подождем. Возможно, SDCC и для первоначального варианта (с __CONSTARR) будет генерировать правильный ASM-код.