Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Динамическая память



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Указатели часть 2 | Все обучалки раздела | Строковые функции

Описание

После разбора этой обучалки, вы сможете создавать память во время выполнения программы.

Программа создает массив, выделяя для него память динамически, заполняет его, выводит на экран и освобождает память.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

/* Done by TheTutor -- 7/11/01

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

      Динамическое выделение памяти - это то, что вы будете часто делать в процессе программирования.
      
      Каждый раз когда появляется надпись "Loading...", прежде всего освобождается вся использовавшаяся
      ранее память (RAM). Затем компьютер выделяет достаточный объем памяти для хранения всех
      текстур, счета и т.д. которые будут использованы в следующем уровне игры.

      Если бы было нужно загружать ВСЕ в память сразу, вам бы понадобилось 20 гигабайт памяти чтобы
      играть в среднюю игру.

      Итак, в этом примере мы собираемся сделать кое-что простое.

      Мы запросим число. Затем мы выделим в памяти количество целочисленных переменных, 
      равных введенному числу. Когда мы создадим наш "динамический массив", мы заполним его,
      и выведем на экран, после чего освободим память.
*/

#include <stdio.h>
#include <stdlib.h> // определяет EXIT_FAILURE и EXIT_SUCCESS
#include <malloc.h>

int main()
{
      int *num_list = NULL; // Указатель на адрес, по которому мы выделим память.

      int max_num = 0; // Это число будет вводиться пользователем -- Оно указывает, для скольких переменных
                            // мы выделим память.

      int count = 0; // Эта переменная будет использоваться как счетчик.


      printf("Enter the number of allocations: "); // "Введите число переменных"

      scanf("%d",&max_num); // Читаем максимальное число переменных

      // ВЫДЕЛЯЕМ ПАМЯТЬ
      num_list = (int*)malloc(max_num * sizeof(int));

                  /* Шаг за шагом:
                        
                        (int*) это преобразование типов. Это означает, что мы выделяем память под тип int.
                        malloc() (memory allocation) - это функция, которая используется для выделения памяти.
                        "max_num" это число переменных, которые мы хотим создать. Итак, вкратце, если вы
                        хотите динамически создать массив из 10 элементов, вы напишете:

                        array_of_ints = (int*)malloc(10 * sizeof(int));
                  
                        Функция sizeof() возвращает число байтов, занимаемое тем, что передается в эту функцию.
                        Например целые числа типа int для 32-битных процессоров Intel (Win95 и выше), занимают
                        4 байта. Поэтому sizeof(int) = 4.

                        То, что делает функция malloc() - она выделяет определенное количество байтов, которое
                        вы запрашиваете, а затем передает эту память тому, чему вы ее присвоите. Когда вы
                        выделяете память, ничто (внутри или вне программы) не имеет к ней доступа, пока вы ее
                        не освободите. 
                  */

      // Всегда полезно проверять, удался ли вызов malloc() -- В случае неудачи malloc() возвращает NULL
      if(num_list == NULL)
      {
            printf("\nmalloc() failed\n");
                  return EXIT_FAILURE;
      }

      // Если мы добрались досюда, malloc() сработала!
      // Заполним нашу свежесозданную память

      for(count = 0; count < max_num; count++)
            num_list[count] = count + 1; 
      
      /*      Первый элемент массива заполнится числом "1"
            Второй элемент заполнится "2".
            Если не знаете, что такое массив, обратитесь к обучалке по массивам. :)      */

      printf("\n\n"); // Два пробела
            
      // Напечатаем массив на экран - Без форматирования это будет плохо смотреться

      for(count = 0; count < max_num; count++)
            printf("%d ",num_list[count]);

      // И напоследок, мы должны освободить память

      free(num_list);
      num_list = NULL; 
      
      /*      Неплохая идея сбрасывать указатель, который использовался для хранения памяти в значение NULL
            при завершении работы. Часто функции проверяют, равен ли указатель значению NULL, чтобы 
            определить указывает ли он на "действительную память". Если просто освободить память, он будет
            указывать на адрес памяти, но по этому адресу не будет никакой "действительной памяти" */

      printf("\n\n"); 

      return EXIT_SUCCESS; // Программа успешно завершилась

} // конец main()

/* ПРЕДУПРЕЖДЕНИЕ:
      
      При работе с динамической памятью у вас будут ошибки. Я бы даже сказал, что
      динамическая память (память, выделенная во время работы программы) и повреждения
      памяти (например при превышении границ массива) наиболее частые места в программах, 
      где случаются баги или ошибки.

      Так что не расстраивайтесь :)
*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com 

Скачать обучалку (Visual C++ 6)

Указатели часть 2 | Все обучалки раздела | Строковые функции

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

коттеджные поселки. , Заказ кондиционеров, комплектующие для кондиционеров lg, качественное проектирование. , Игры java 240x320 и игры java для сотовых телефонов nokia, siemens, motorola, alcatel