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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2009, 16:58   #1
Winston123
Пользователь
 
Регистрация: 17.05.2009
Сообщений: 15
По умолчанию Что не правильно делаю с free();

Доброго времени суток. Пишем на Microsoft Visual C++ 2008

Задача: Дано натуральное число n. Сформировать целочисленный массив IM(2n), элементами которого являются числа
1 2n 2 2n-1 3 2n-2 ... n n+1



Вот код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <conio.h>

int main()
{
int tr;
printf ("vvedite znachenie n: ");
scanf ("%d", &tr);
int *A=(int *)malloc(tr*sizeof(int));

for (int i=0; i<tr; i++)
{
A[2*i]=i+1;
printf("%d ", A[2*i]);
A[2*i+1]=2*tr-i;
printf("%d ", A[2*i+1]);
}

free(A);
getch();

}


Вопрос по free(A);
Дело в том что при компилировании файла вылетает сообщение следующего рода:

ОС Windows инициировала точку останова в 8888.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в 8888.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит 8888.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки.

Неправильно задаю массив? Или синтаксис free неправильно юзаю???

Последний раз редактировалось Winston123; 17.05.2009 в 17:12.
Winston123 вне форума Ответить с цитированием
Старый 17.05.2009, 17:28   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

int *A=(int *)malloc(tr*sizeof(int));
тут надо писать так:
int *A=(int *)malloc(2*tr*sizeof(int));
исходя из вашего же условия задачи)
vvviperrr вне форума Ответить с цитированием
Старый 17.05.2009, 17:28   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Winston123
Неправильно задаю массив? Или синтаксис free неправильно юзаю???
Нет. Все правильно. Программа работает (компилю в MinGW).
Это что-то студия творит...

Кстати, Math и iostream вам здесь ни к чему.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 17.05.2009, 17:34   #4
Winston123
Пользователь
 
Регистрация: 17.05.2009
Сообщений: 15
По умолчанию

Цитата:
Сообщение от vvviperrr Посмотреть сообщение
int *A=(int *)malloc(tr*sizeof(int));
тут надо писать так:
int *A=(int *)malloc(2*tr*sizeof(int));
исходя из вашего же условия задачи)
Да, уже сам усмотрел что память неправильно выделяю...
Всем спасибо, вопрос решён..
Winston123 вне форума Ответить с цитированием
Старый 17.05.2009, 17:34   #5
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Sazary она у тя не всегда будет работать) возвращаемся к теме обращения на недействительный указатель
vvviperrr вне форума Ответить с цитированием
Старый 17.05.2009, 17:44   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

vvviperrr, ТС изменил листинг Там была строчка "razm=en*2;"
Ну а так, да, вы правы )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 08.06.2009, 21:23   #7
Winston123
Пользователь
 
Регистрация: 17.05.2009
Сообщений: 15
По умолчанию

Всё та же программа, код уже претерпел изменения в соответствии с требованиями преподавателя.



/* Контрольная работа №2
Дано натуральное число n. Сформировать целочисленный массив IM(2n), элементами которого являются числа
1 2n 2 2n-1 3 2n-2 ... n n+1


*/



Код:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <conio.h>

void title()
{
printf("Dano naturalnoe chislo n. Sformirovat celochislennyj massiv IM(2n)\n");
printf("1  2n  2  2n-1  3  2n-2  ...  n  n+1\n\n\n");
}

int input()
{
printf ("Vvedite znachenie n (ot 1 do 9999): ");

char str[4];
  for (int i=0;i<4;i++)
  {
        do
        {
            str[i]=getch();
            if (str[i]>=0x30 && str[i]<=0x39) printf("%c", str[i]);
        }
        while (str[i]!=0x0D && !(str[i]>=0x30 && str[i]<=0x39));
        if (str[i]==0x0D) break;
  }
return atoi(str);
}



void mas (int *Z, int y)
{
for (int i=0; i<y; i++)  
  {                          
  Z[2*i]=i+1;
  Z[2*i+1]=2*y-i;
  }
}

void output (int *R, int f)
{
if (f==0) printf("\nNevozmozhno postroit massiv: kolichestvo elementov massiva = 0");
else
{
int razm=2*f;
printf("\nKolichestvo elementov massiva = %d \n\n", razm);
printf("Massiv: \n");
for (int i=0; i<razm; i++)  
printf("%d ", R[i]);
}
printf("\n\n");
}


int main()

{
title();
char r;
do
  {
  int en = input();
  int *IM=(int *)malloc(2*en*sizeof(int));
  mas(IM, en);
  output(IM, en);
  free(IM);
  printf("PRESS <ENTER> TO CONTINUE \nPRESS <ANY KEY> TO EXIT \n");
  r=getch();
  printf("\n\n");
  }
while (r==0x0D);

}

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

Код:
1111 1111 1111 1111 1111 1111 1111 111
1 1111 1111 1111 1111 1111 ...
Подскажете ли, как этого можно избежать????

Последний раз редактировалось Sazary; 08.06.2009 в 21:39.
Winston123 вне форума Ответить с цитированием
Старый 08.06.2009, 21:43   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Измените вот так:
Код:
void output (int *R, int f)
{
if (f==0) printf("\nNevozmozhno postroit massiv: kolichestvo elementov massiva = 0");
else
{
int razm=2*f;
printf("\nKolichestvo elementov massiva = %d \n\n", razm);
printf("Massiv: \n");
for (int i=0; i<razm; i++)
 {
  printf("%d ", R[i]);
  if(i%20==0) printf("\n");
 }
}
printf("\n\n");
}
Через каждые 20 чисел будет переводиться строка.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.06.2009, 18:54   #9
Winston123
Пользователь
 
Регистрация: 17.05.2009
Сообщений: 15
По умолчанию

В принципе поначалу думал то же самое, но.. если мы вводим значение скажем 9999, то элементы массива будут пятизначными - соответственно 20 чисел будут занимать больше чем одну строку... Конечно можно поставить не 20, а меньше..
Опять же если мы введём кол-во элементов скажем 15, то перенос будет слишком ранним..

В общем привязываться хочется не к количеству чисел в строке.. Есть такая идея: сталкивать числа в строку и если длина превышает 80 символов, не добавлять последнего числа, а выводить на экран строку и собирать новую

C реализацией этого на языке - траблы(((
Winston123 вне форума Ответить с цитированием
Старый 09.06.2009, 19:02   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так сделайте:
Код:
void output (int *R, int f)
{
 char str[200],buf[100];
if (f==0) printf("\nNevozmozhno postroit massiv: kolichestvo elementov massiva = 0");
else
{
int razm=2*f;
printf("\nKolichestvo elementov massiva = %d \n\n", razm);
printf("Massiv: \n");
strcpy(str,"");
for (int i=0; i<razm; i++)
 {
  sprintf(buf,"%d",R[i]);
  if(strlen(str)+strlen(buf)>=79)
   {
    printf("%s\n",str);
    strcpy(str,buf);
   }
  else
   {
    strcat(str," ");
    strcat(str,buf);
   }
 }
 printf("%s\n",str);
}
printf("\n\n");
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подскажите пожалуйста что не правильно в скрипте. 6AT9 JavaScript, Ajax 1 25.11.2008 00:21
Visual C++: Что не так делаю? N!ckeL Помощь студентам 8 19.05.2008 11:28
правильно ли я делаю? andrey4623 Общие вопросы Delphi 2 07.03.2008 20:14