FAQ Поиск Пользователи Группы ФотоАльбом  Регистрация Войти и проверить личные сообщения Вход
c/c++/g++ динамические массивы [?]

 
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел
Предыдущая тема :: Следующая тема  
Автор Сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Вт Июл 22, 2008 11:28 pm    Заголовок сообщения: c/c++/g++ динамические массивы [?] Ответить с цитатой

Помогите пожалуйста с работай с массивами на си.
Почитав инфу в интернете нашёл несколько вариантов кода:

Код:

// объявлнене
int *arr;

// инициализация
arr = malloc(n * sizeof(int));

// доступ к i-ому элементу
a = arr;
a = a + i * sizeof(int);
*a = 8;

// высвобождение памяти
free(arr);


Использовал компилятор g++. Сказал, что не может присвоить указателю на целое указатель на void

Посмотрел cpp вариант

Код:

// объявлнене
int *arr;

// инициализация
arr = new int[n];

// доступ к i-ому элементу
arr[i] = 8;

// высвобождение памяти
delete[] arr;


не работает участок arr[i]...
ISO C++ forbids assignment of arrays
ещё всё осложняется тем, что элемент массива структура, в паскале это выглядело бы так:
arr[i].name := tt;
а в СИ?

Чем отличаются все эти компиляторы g++, c++ и т.д.
Какой лучше использовать, если критична скорость выполнения

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Rumata
Мл. Лейтенант


Репутация: 44    

Зарегистрирован: 09.08.2007
Сообщения: 357


СообщениеДобавлено: Ср Июл 23, 2008 2:43 am    Заголовок сообщения: Ответить с цитатой

Код:

  const int n = 32;

  int * arr = NULL;
  arr = (int*)malloc(n * sizeof(int));

  arr[0] = 0;
  arr[31] = 0xffffffff;

  std::cout << arr[31] << std::endl;

  free(arr);

  return 0;

возвращаемое значение malloc'а надо приводить к типу данных массива
Код:
arr = (int*)malloc(n * sizeof(int));



Код:

  const int n = 32;

  int * arr = NULL;
  arr = new int[n];

  arr[0] = 0;
  arr[31] = 0xffffffff;

  std::cout << arr[31] << std::endl;

  delete[] arr;

  return 0;


Код:

#include <iostream>

struct tStruct
{
  int intVal;
  bool fSomeFlag;
};

std::ostream& operator<<(std::ostream & ostream, tStruct & tStructVal)
{
  ostream << tStructVal.intVal << '[' << tStructVal.fSomeFlag << ']';
  return ostream;
}


int main()
{
  const int n = 32;

  tStruct * arr = NULL;
  arr = new tStruct[n];

  arr[0].intVal = 0;
  arr[0].fSomeFlag = false;
  arr[31].intVal = 0xffffffff;
  arr[31].fSomeFlag = true;

  std::cout << arr[31] << std::endl;

  delete[] arr;

  return 0;

}


g++ 4.2.1
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Ср Июл 23, 2008 12:57 pm    Заголовок сообщения: Ответить с цитатой

Rumata, благодарю!
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Ср Окт 21, 2009 4:23 pm    Заголовок сообщения: Ответить с цитатой

А если я хочу переопределить длину массива?

В СИ есть realloc -
в паскале - SetLength()
а в C++ ?

Как узнать длинну динамического массива? Насколько я почитал из интернета - никак. сайзоф вернёт четыре - размер указателя в байтах

Почему разработчики си не сделали нормальный и интуитивно понятный код подобный паскалевскому:
Код:

// объявляем
a : array of integer;

// выделяем память под Н элементов
SetLength(a, N);

// переопределяем длину под М элементов
//(при этом если M > N в конец добавляются нулевые элементы,
//а если меньше - лишние элементы массива удаляются)
SetLength(a, M);

// работа с i-ым элементом
a[i] = 5;

// высвобождение памяти
SetLength(a, 0);

????

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ant_man
Майор


Репутация: 28    

Зарегистрирован: 08.03.2003
Сообщения: 1187
Откуда: с ВИЗа

СообщениеДобавлено: Ср Окт 21, 2009 10:26 pm    Заголовок сообщения: Ответить с цитатой

продолжай пользовать malloc/realloc, они в с++ не запрещены.

просто нельзя было, видимо, идеологически корректно сделать что-то наподобие renew, потому что не все типы объектов обязаны поддерживать перемещение себя в памяти.

_________________
Надо же... живу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Чт Окт 22, 2009 6:12 pm    Заголовок сообщения: Ответить с цитатой

ant_man, т.е. мне нужно где-то отдельно хранить длинну массива
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ant_man
Майор


Репутация: 28    

Зарегистрирован: 08.03.2003
Сообщения: 1187
Откуда: с ВИЗа

СообщениеДобавлено: Чт Окт 22, 2009 7:23 pm    Заголовок сообщения: Ответить с цитатой

ну она ведь так или иначе где-то должна храниться? си просто не скрывает этого факта.

хотя никто не мешает заточить его под свои предпочтения

Код:
template <class T> class ilp //i-like-pascal class
{
   unsigned int size;
   T* _array;
public:
   ilp(){size=0;_array=0;}
   ilp (unsigned int s)
   {
      _array = (T*)malloc(s*sizeof(T));
      size = s;
   }
   void setl(unsigned int s)
   {
      _array = (T*)realloc(_array, s*sizeof(T));
      size = s;
   }
   T& operator[] (int i)
   {
      /*
      if(i>=size)
      {
      Просят то, чего нет...
      }
      */
      return _array[i];
   }
   unsigned int getl() {return size;}

   ~ilp() {free(_array);}
};


а потом можно

Код:
int _tmain(int argc, _TCHAR* argv[])
{
   ilp<int> a; //аляпаскаль массив интов
   printf("size of a = %d items\n", a.getl());
   a.setl(5);
   printf("size of a = %d items\n", a.getl());
   a[4]=16;
   printf("a[4] = %d\n", a[4]);
   return 0;
}


добавить по вкусу обработку нехватки памяти.

_________________
Надо же... живу...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Wizard RAA
Генерал


Репутация: 41    

Зарегистрирован: 17.03.2005
Сообщения: 3010
Откуда: из Ордена Полуночи, 248 сегмент

СообщениеДобавлено: Чт Окт 22, 2009 7:38 pm    Заголовок сообщения: Ответить с цитатой

ant_man, ну я подозреваю, что объявление класса добавит накладных расходов. Ладно, буду делать на сишный манер, спасибо.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему       Список форумов Forum.profintel.ru -> Программерский раздел Часовой пояс: GMT + 6
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы