Форум: Форум C++Разное
Новые темы: 00
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массив
 
 автор: alex19921992   (20.03.2007 в 05:41)   письмо автору
 
 

Надо передать в функцию массив произвольной длины. Но длину, как переменную передавать не хочется. Разве что перед вызовом функции определить длину массива, а не хранить ее постоянно, тогда еще можно длину передать. Возможно ли такое? Элементы массива не изменяются функцией(constанты). Тип элементов - структуры.

  Ответить  
 
 автор: oleg_alexeev   (20.03.2007 в 10:13)   письмо автору
 
   для: alex19921992   (20.03.2007 в 05:41)
 

Вопрос, по-моему, звучит не вполне понятно, но попробую ответить.

Передавать размер массива в качестве параметра функции - вполне нормальное
решение. Это одна из идиом языка Си. Пример:


struct MyStruct
{
  // my data
};

void MyFunc(const MyStruct *array, int size)
{
  for (int i=0; i<size; i++)
  {
    // do something with array[i]
  }
}


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


typedef vector<MyStruct> MyArray;

void MyFunc(MyArray &array)
{
  for (int i=0; i<array.size(); i++)
  {
    // do something with array[i]
  }
}

  Ответить  
 
 автор: alex19921992   (20.03.2007 в 12:27)   письмо автору
 
   для: oleg_alexeev   (20.03.2007 в 10:13)
 

Но я где-то слышал, что можно определять длину как sizeof(массив)/размер_элемента=длина_массива

  Ответить  
 
 автор: oleg_alexeev   (20.03.2007 в 13:10)   письмо автору
 
   для: alex19921992   (20.03.2007 в 12:27)
 

Так делать вполне можно и нужно если компилятор имеет объявление массива

MyFunc()
{
  int array[12];
  for (int i=0; i < sizeof(array)/sizeof(array[0]); i++)
  {
    // do something
  }
}

поскольку оператор sizeof() работает на этапе компиляции, а на этапе выполнения переменная i
будет просто сравнивается с числом 12.

  Ответить  
 
 автор: alex19921992   (20.03.2007 в 16:07)   письмо автору
 
   для: oleg_alexeev   (20.03.2007 в 13:10)
 

То есть с динамическим массивом такой фокус не пройдёт?

  Ответить  
 
 автор: oleg_alexeev   (20.03.2007 в 16:38)   письмо автору
 
   для: alex19921992   (20.03.2007 в 16:07)
 

Так точно.

  Ответить  
 
 автор: alex19921992   (20.03.2007 в 17:52)   письмо автору
 
   для: oleg_alexeev   (20.03.2007 в 16:38)
 

я вот просто пытаюсь сделать 3д движок и хранить объекты буду в очереди динамических массивов... а вот как устроены 3д-файлы Макса, майи или занозы(популярные 3д редакторы), даже не представляю...

  Ответить  
 
 автор: nic   (22.03.2007 в 01:26)   письмо автору
 
   для: alex19921992   (20.03.2007 в 17:52)
 

тож вопрос есть про массивы:
вошем обявляю массив arr[30]
дальше он заполняется значениями, к премеру в его занесется 10 значений.
так вот как мне определить колличество занесенных значений?
sizeof(массив)/размер_элемента=длина_массива - тут не катит т.к возврашает заявленную величину т.е 30
или тут стоит юзать динамические массивы...

  Ответить  
 
 автор: alex19921992   (22.03.2007 в 12:34)   письмо автору
 
   для: nic   (22.03.2007 в 01:26)
 

Вообще, можно делать динамические массивы. Хотя можно и обойтись:
1 вариант: хранить количество занесенных элементов в отдельной переменной, чтобы во время считывания считать столько значений, сколько сказано в этой переменной.
2 вариант: подойдет, если есть такие значения, которые в массиве храниться заведомо не могут. Например, вы знаете, что заносите натуральные числа в массив. Естесственно ноль хранить нельзя. ТОгда заполняете все нулями, потом заносите значения в массив. Чтобы определить, сколько у вас переменных занесено, достаточно либо считывать, пока не получили ноль, либо посчитать сколько ненулевых значений есть в массиве.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования