Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2013, 05:53   #1
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию Ошибка при работе с памятью

Всем привет. Столкнулся с проблемой при работе с malloc



Код:
#define H 4
#define V 4

...........

int** GENERATE_FORM()
{
    int key, i, j;
    //Массив SHAPES_TEMP хранит в себе виды возможных фигур
    int SHAPES_TEMP[7][4][4] =
    {
        {
            {1,1,1,1},
            {0,0,0,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {1,1,0,0},
            {1,1,0,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {1,0,0,0},
            {1,1,1,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {0,0,1,0},
            {1,1,1,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {0,1,1,0},
            {1,1,0,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {1,1,0,0},
            {0,1,1,0},
            {0,0,0,0},
            {0,0,0,0}
        },
        {
            {0,1,0,0},
            {1,1,1,0},
            {0,0,0,0},
            {0,0,0,0}
        }
    };
    int **shape;
    shape = (int**)malloc(V * sizeof(int*));
    for(i = 0; i < V; i++)
        *shape = (int*)malloc(H * sizeof(int));
    key = (rand() % 7);

    //На основе случайного числа из массива фигур SHAPES_TEMP копируется двоичная последовательность
    for(i = 0; i < V; i++)                                  //Копировать определенную фигуру из SHAPES_TEMP
    {
        for(j = 0; j < H; j++)
        {
           shape[i][j] = SHAPES_TEMP[key][i][j]
        }
    }
    printf("end\n");

    return shape;
}
Проблема в том, что вместо массива 4*4 выделяется память под массив 2*4. Никак не пойму в чем ошибка. Помогите, пожалуйста.




С ошибкой разобрался, тему можно закрыть

Последний раз редактировалось Joose; 04.07.2013 в 07:27. Причина: Ошибка найдена
Joose вне форума Ответить с цитированием
Старый 04.07.2013, 07:31   #2
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

у мну работает:
Код:
int main() {
	static const size_t V = 4;
	static const size_t H = 4;
	static const size_t M = 7;

	static const int SHAPES_TEMP[M][V][H] = { 
		{
			{1,1,1,1},
			{0,0,0,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{1,1,0,0},
			{1,1,0,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{1,0,0,0},
			{1,1,1,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{0,0,1,0},
			{1,1,1,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{0,1,1,0},
			{1,1,0,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{1,1,0,0},
			{0,1,1,0},
			{0,0,0,0},
			{0,0,0,0}
		},
		{
			{0,1,0,0},
			{1,1,1,0},
			{0,0,0,0},
			{0,0,0,0}
		}
	};

	int** shape;
	shape = new int*[V];
	for (size_t i = 0; i < V; ++i) {
		shape[i] = new int[H];
	}

	const size_t key = rand() % M;
	for (size_t i = 0; i < V; ++i) {
		for (size_t j = 0; j < H; ++j) {
			shape[i][j] = SHAPES_TEMP[key][i][j];
		}
	}

	std::cout << "key = " << key << "\n";
	for (size_t i = 0; i < V; ++i) {
		for (size_t j = 0; j < H; ++j) {
			std::cout << shape[i][j] << "\t";
		}
		std::cout << "\n";
	}
	std::cout << "\n";

	return 0;
}
обратите внимание на статические константы. уберите дефайны. это не очень хорошо. и не забудьте потом удалить shape, а то память потечет. а, и не нужно в программе плодить магические константы типа 4, 7. они должны иметь имя и комментарий - что это. иначе человек, который будет читать вашу программу, будет очень долго чесать репу и думать: почему у него здесь: int SHAPES_TEMP[7][4][4] стоят цифры, а здесь:
Код:
for(i = 0; i < V; i++)                                  //Копировать определенную фигуру из SHAPES_TEMP
    {
        for(j = 0; j < H; j++)
дефайны (константы)
Kukurudza вне форума Ответить с цитированием
Старый 04.07.2013, 12:12   #3
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Спасибо, просто сначала вместо макроконстант были обычные числа, а потом где-то просто забыл заменить. По поводу очищения shape - каким образом можно очистить массив уже после возвращения его в вызывающую функцию?
Joose вне форума Ответить с цитированием
Старый 04.07.2013, 12:42   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
возвращения его в вызывающую функцию?
возвратить В вызывающую функцию?
Igor95 вне форума Ответить с цитированием
Старый 04.07.2013, 14:25   #5
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Код:
	for (size_t i = 0; i < V; ++i) {
		delete [] shape[i];
	}
	delete [] shape;
Kukurudza вне форума Ответить с цитированием
Старый 04.07.2013, 14:53   #6
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
возвратить В вызывающую функцию?
Ну да, функция GENERATE_FORM возвращает указатель на указатель В вызывающую функцию main. Или я что-то делаю не так?
Joose вне форума Ответить с цитированием
Старый 04.07.2013, 14:54   #7
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Kukurudza Посмотреть сообщение
Код:
	for (size_t i = 0; i < V; ++i) {
		delete [] shape[i];
	}
	delete [] shape;
Благодарю.
Joose вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с памятью alexey_kip Общие вопросы C/C++ 2 18.11.2012 10:08
ошибка в работе с динамической памятью thrashkid Общие вопросы C/C++ 8 30.06.2011 00:48
Ошибка при работе с строками в Си papos Помощь студентам 1 23.03.2011 03:50
Странный баг при работе с разделяемой памятью в C mephisto123 Qt и кроссплатформенное программирование С/С++ 2 01.08.2008 18:10
Ошибка при работе с БД malevich БД в Delphi 8 25.11.2007 15:10