r2 - 26 Feb 2005 - 11:19:00 - PhilKYou are here: TWiki >  OPENTS Web > ЧаВО > МассивЫ

В настоящее время в т-системе поддерживается два вида массивов:

Массив неготовых значений

Каждый элемент массивов данного вида имеет флаг готовности. Объявление массивов данного типа выглядит следующим образом:

tval int arr[10];

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


tfun int calculate(int n, tval int value){
  // используем value
  return 1;
}

int main(int argc, char *argv[]){
  tval int arr[10];

  // Инициализация arr[10]

  for (int i=0; i<10; i++){
    calculate(i, arr[i]);
  }
}

Следует заметить, что нельзя передать функции массив неготовых значений полностью.

Extra Size переменные

В текущей версии т-системы имеется возможность связывать с т-переменными дополнительную область памяти определенного размера. Для этого, перед объявлением переменной необходимо указать конструкцию вида:

tct(extraSize(NUM * sizeof(TYPE)))

Данная конструкция указывает на необходимость связать с т-переменной дополнительную область памяти, объем которой, равен объему необходимому для хранения NUM элементов типа TYPE Такой подход может использоваться для создания еще одного типа массивов. Отличие данного типа массивов от предыдущего заключается в том, что статус готовности распространяется на весь массив целиком, а не на каждый его элемент. Кроме того, такие массивы передаются в качестве аргумента функции полностью. Следующий пример иллюстрирует это:

tfun int calculate(int n, tval int value){
  // используем value
  return 1;
}

int main(int argc, char *argv[]){
  tct(extraSize(10*sizeof(int)));
  tval int arr;

  // Инициализация arr

  for (int i=0; i<10; i++){
    calculate(i, arr);
  }
}

Для доступа к элементам такого массива существует несколько способов:

  tct(extraSize(10*sizeof(int)));
  tval int arr;

  (&(int&)arr)[2] = 7;

При этом следует помнить, что нумерация элементов идет от 1. Потому, что нулевым элементом является сама переменная arr.

  tct(extraSize(10*sizeof(int)));
  tval int arr;
  int *p_arr;
  p_arr = (&(int&)arr) + 1;

  p_arr[2] = 7;

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

tfun int init(tout int arr){
  tct(extraSize(10*sizeof(int)));
  tval int res;

  for(int i=1, i<=10; i++){ 
     (&(int&)res)[i] = i-1;
  }

  arr = (int&)res;
  return 0;
}

tfun int calculate(tval int arr, tout int res){
  int *p_arr;
  p_arr = (&(int&)arr) + 1;  

  int sum=0;
  for (int i=0; i<10; i++){
    sum += p_arr[i];
  }

  res = sum;
  return 1;
}

int main(int argc, char *argv[]){
  tct(extraSize(10*sizeof(int)));
  tval int arr;
  tval int result;

  init(arr);
  calculate(arr, result);
}

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

tfun int init(tout int arr){
  for(int i=1, i<=10; i++){ 
     (&(int&)arr)[i] = i-1;
  }
  return 0;
}

Более подробно об этом будет рассказано в разделе "готовим неготовые значения".

-- PhilK - 26 Feb 2005

Show attachmentsHide attachments
Topic attachments
I Attachment Action Size Date Who Comment
pngpng tsys_arrs.png manage 7.1 K 25 Feb 2005 - 15:42 PhilK Массив неготовых значений
pngpng tsys_arrs2.png manage 4.8 K 25 Feb 2005 - 16:07 PhilK Extra Size переменная
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r2 < r1 | More topic actions
 
Powered by TWiki

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback