Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Assembler

Страница: 1 | 2 |

 

  Вопрос: VS2003 и C(без ++) Добавлено: 18.02.06 18:22  

Автор вопроса:  vito | Web-сайт: softvito.narod2.ru
VS2003 и C(без ++)

Вот простой пример создания двумкрного динамического массива на С (без +). Компиляция в С код.

/* --------  создание динамического двумерного массива -------- */

int main(int argc, char* argv[])
{
   int **a;

          int n=3,m=3,i;

          /* --------  распределение памяти -------- */

          a=(int **)calloc(m,sizeof(int *));

          for (i=0; i<=m; i++)

              a[i]=(int *)calloc(n,sizeof(int));

          /* --------- проверка ----------*/

          a[1][0]=5;
          a[1][1]=10;

          printf ( " Calloc  memory : ");
          printf ("%d\n", a[1][1]);
          printf ( " Calloc  memory : ");
          printf ("%d\n", a[1][0]);

          /* --------- освобождение памяти ----------*/

          for (i=0; i<=m; i++)

           free (a[i]);
  /*  Студия глючит в этом месте. Приходится убирать этот оператор.Но где гарантия что память освобождена? */
          free (a);

         /* --------- проверка ----------*/
          printf ( " Free  memory : ");
          printf ("%d\n", a[1][1]);
          printf ( " Free  memory : ");
          printf ("%d\n", a[1][0]);

         scanf("%d",&i);

        return 0;
}
//---------------------------------------------------------------------------


Borland компилит без проблем. Студия, то не может скомпилить, то выкидывает исключение - пользовательский бряк, то вообще ведет себя непонятно.:))

В конечном счете экзешник получается, но что за ерунда?

Если убрать free (a); - то все нормально.

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 18.02.06 22:38
у меня кста двухмерные динамические тоже в студии всегда глючили, и
через malloc, и через new...

Ответить

Номер ответа: 2
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #2
Добавлено: 18.02.06 23:20
Млин, это ,что особенность реализации:))

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 18.02.06 23:52
нафиг эти малоки, цалоки, и прочие новые.
Есть же VirtualAlloc/VirtualFree, что ещё надо для полного счастья?

Ответить

Номер ответа: 4
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #4
Добавлено: 19.02.06 00:02
HOOLIGAN

Ды привык уже, стараюсь где это только возможно не привязываться к API.

 Фиг знает, что MS выкинет, переписывать все что -ли?

Ответить

Номер ответа: 5
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #5
Добавлено: 19.02.06 00:18
Да и потом криво это, стандарт все - таки. Сорцы разные попадаются, и очень древниие тоже.

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 19.02.06 01:04
vito
Какой стандарт? Что есть допустим new? Криво обёрнутый HeapAlloc при малых размерах заказываемой памяти и VirtualAlloc при больших.
К чему тогда нужна кривая оболочка new? Та же хрень с malloc - это вообще глючило ещё то.
crt ведь не работает напрямую с железом, обращается к апи.

Ответить

Номер ответа: 7
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #7
Добавлено: 19.02.06 02:08
HOOLIGAN

Какой стандарт? Что есть допустим new? Криво обёрнутый HeapAlloc при малых размерах заказываемой памяти и VirtualAlloc при больших.


Скорее наоборот, только malloc и calloc, про new молчим.
Кстати new не глючит.
На С все это написано, и осмелюсь предположить, что без маллоков и каллоков не обошлось:)
Хотя хрен их знает:)

А С - стандартизирован, причем давно, и компилятор обязан отвечать стандарту.

З.Ы. Вот сейчас нарыл хорошую, но старую прогу с сорцами (жмет звук). Мне ее что переписывать?
Лучше на борланде проект сделаю???

  

Ответить

Номер ответа: 8
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 19.02.06 02:39
Как-то нарвался на new, с тех пор как отрезало - никаких "С-стандартов". Нахрен!
VirtualAlloc работает безупречно.
От си мне нужен только его компилятор. Либы - в болото!
:)

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 19.02.06 02:59
мя тоже с new глючит, с VirtualAlloc неумею, пример в студию :)

Vito, покаж как у тя через new работает, плз...

Ответить

Номер ответа: 10
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #10
Добавлено: 19.02.06 03:00
HOOLIGAN

Вопрос в том, что это за хрень. Не может такого быть. Может у меня студия глючит?

От си мне нужен только его компилятор. Либы - в болото!


Это вопрос вкуса. Если нет нужды в кроссплатформенности API удобнее(хотя я больше привык с стандарту).

Ответить

Номер ответа: 11
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #11
Добавлено: 19.02.06 04:46
HACKER

Оператор new (С++) не умеет работать с паматью так, как malloc, calloc (C), потому что С++ создавался как "улучшенная", "облегченная" версия С.

Насчет "улучшенная" можно поспорить...

Но С++ совместим с С, поэтому мы можем использовать библиотеку С.

Правда, не во всех случаях, возможна полная совместимость.

Вот переделанный пример.

int main(int argc, char* argv[];)
{

int n=3,m=3,i;


int (*a)[ 3 ] = new int[ n ][ 3 ];

// второе измерение массива может быть только константой


a[1][0]=5;
          a[1][1]=10;
         
  printf ( " Calloc  memory : ";);
          printf ("%d\n", a[1][1];);
  printf ( " Calloc  memory : ";);
  printf ("%d\n", a[1][0];);
         
delete[] a;
        
         printf ( " Free  memory : ";);
         printf ("%d\n", a[1][1];);
printf ( " Free  memory : ";);
printf ("%d\n", a[1][0];);
         
scanf("%d",&i);


return 0;
}

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 19.02.06 21:13
А почему только delete[] a ? Разве ненадо ещё каждый как с free ?


for (i=0; i<=m; i++) free (a[i];);

           

Ответить

Номер ответа: 13
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #13
Добавлено: 19.02.06 22:23
int (*a)[ 3 ] = new int[ n ][ 3 ];


Mы выделяем память оператором new.

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 20.02.06 16:22
Не я понимаю, непонимаю как освобождать нужно когда через new
выделяем. Как через free, типа каждуя ячейку таблицы (двухмерного
массива), а потом и сам массив, или только как ты писал delete [] a
всё остальное освобождается по ходу само что-ли :)

Ответить

Номер ответа: 15
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #15
Добавлено: 20.02.06 17:26
new : delete - это С++.
malloc : free - это С (без ++).

Выделение и освобождение происходит по разному. Из - за совместимости путают два языка.

Впрочем многие.

Главное запомни С это точно не С++ (malloc).
А С++(new) совместим с С(malloc) и может использовать его операторы.

Т.е. не смешивай два языка (хотя это возможно и иногда необходимо). Тогда все должно стать понятнее.

Оператор new проще malloc, и delete тоже проще free.
Когда мы используем new каждую ячейку освобождать не надо. Достаточно delete [] a.

Но как я написал, второе измерение массива в случае с new может быть только константой (ограничение).

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам