Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (17)


Работа с динамическими массивами

Поиск:
Основная проблема при работе с динамическими массивами данных в С++ это то, что после выделения памяти под массив невозможно узнать его длину. То же самое при работе с двумерными массивами - невозможно простыми средствами устроить массив со строками, содержащими переменное количество столбцов.

Для некоторых выходом из ситуации является использование STL (контейнер vector<T>).

Но ведь можно и без векторов обойтись, если хранить размер массива на 4 байта раньше его начала !!! В Delphi есть очень удобные функции для работы с массивами (GetMem, FreeMem, Copy и пр.), и именно так они и реализованы. Вот переделанный вариант под С++, и пример -- как можно создать и работать с массивом, в котором не известно ни количество строк, ни размер каждой отдельной строки:
Цитата
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//////////////////////////////////////////////////////////////////////////
// удобные функции для работы с памятью -
// GetMem, FreeMem, Copy, Resize, GetLength

template <typename T> void GetMem(T *&ptr, int size)
{
   
int *psize=(int *)malloc(size*sizeof(T)+sizeof(int));
    *
psize = size;
   
ptr = (T*)(psize+1);
   
memset(ptr, 0, size+sizeof(int));
}

template <typename T> void FreeMem(T *&ptr)
{
   
if(!ptr) return;
   
int *psize = ((int *)ptr)-1;
   
free(psize);
   
ptr = NULL;
}

template <typename T> int GetLength(T ptr)
{
   
return ((ptr==NULL)?0: (*((int*)ptr-1)));
}

template <typename T> void Resize(T *&ptr, int size)
{
   
if(size==0)
    {
       
FreeMem(ptr);
       
return;
    }

    T
*old = ptr;
   
GetMem(ptr, size);
   
if(old != NULL)
    {
       
int prev_size = GetLength(old);
       
int len = (prev_size > size)?size:prev_size;
       
if(prev_size) memcpy(ptr, old, size*sizeof(T));
       
FreeMem(old);
    }
}

template <typename T> void Copy(T *&dest, const T *&src)
{
   
SetLength(dest, GetLength(src));
   
memcpy(dest, src, Length(dest)*sizeof(T));
}



//////////////////////////////////////////////////////////////////////////


// выделяет массив высотой в неизвестное кол-во строк,
// в каждой строке - случайное количество элементов

int **RandomAlloc()
{
   
// настраиваем генератор случайных чисел
   
time_t tm; time(&tm); srand(tm);
   
// обычный двумерный массив
   
int **arr = NULL;
   
// выделяем память под rand() строк, 10 - максимум
   
GetMem(arr, rand()%10+1);
   
// задаём случайное количество столбцов в каждой строке
   
for(int y=0; y<GetLength(arr); y++)
       
GetMem(arr[y], rand()%10+1);
   
return arr;
}

// функция, которая работает с полученным массивом
int main(int argc, char* argv[])
{
   
// выделяем массив
   
int **arr = RandomAlloc();
   
   
// изменяем размеры последней строки
   
Resize(arr[GetLength(arr)-1], 10);


    // заполняем его данными
   
for(int y=0; y<GetLength(arr); y++)
       
for(int x=0; x<GetLength(arr[y]); x++)
           
arr[y][x] = y;
       

   
// выводим на экран результирующий массив
   
for(y=0; y<GetLength(arr); y++)
    {
       
printf("\nString %d (%d elements):", y, GetLength(arr[y]));
       
for(int x=0; x<GetLength(arr[y]); x++)
           
printf(" %d", arr[y][x]);
    }

   
// вот и всё
   
printf("\n");

   
return 0;
}
Автор: mr.DUDA
Сайт: http://






Просмотров: 6279

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную