Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

VB6 голям масив ?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1799
Страница 1 от 1

Автор:  nickich [ Нед Фев 12, 2006 5:41 pm ]
Заглавие:  VB6 голям масив ?

Как се декларира голям ( 1М елементи) масив във VB6?

Автор:  Nikola Kirov [ Нед Фев 12, 2006 5:52 pm ]
Заглавие: 

И на мен ми е интересно как става работата с много големи масиви в Visual C++ na Microsoft.

Автор:  nickich [ Нед Фев 12, 2006 9:47 pm ]
Заглавие: 

..ако може и някой да ми каже дали има и как се прави #define на VB6 ...

Автор:  Balkana [ Нед Фев 12, 2006 9:55 pm ]
Заглавие: 

На С (и ++ предполагам), като си правиш Windows приложение, неща от вида

Код:
int array[2000000];


си работят съвсем нормално; писал съм и под ДОС extender подобни неща; Грижата остава в операционната система, и ако няма как - гърми и не пуска програмата изобщо.

Автор:  Реконструктор [ Нед Фев 12, 2006 9:59 pm ]
Заглавие:  Re: VB6 голям масив ?

nickich написа:
Как се декларира голям ( 1М елементи) масив във VB6?


Код:

Dim arr(1024 ^ 2) As Long


Автор:  Реконструктор [ Нед Фев 12, 2006 10:01 pm ]
Заглавие: 

Nikola Kirov написа:
И на мен ми е интересно как става работата с много големи масиви в Visual C++ na Microsoft.


Код:
long* pArray = new long[1024*1024];


после задължително не трябва да се забравя да се освободи:

Код:
delete [] pArray;

Автор:  nickich [ Нед Фев 12, 2006 11:03 pm ]
Заглавие: 

Мерси Реконструктор, стана \:D/

Но защо като декларирам:
Код:
Dim intarray((1024 * 128)) As Integer
гърми с: Compile error: Overflow

а като декларирам:
Код:
Dim intarray(131072) As Integer

или както е написал Реконстуктор, си работи нормално ?

.. може да задавам тъп въпрос, но не съм работил много с VB и не се сещам :oops:

а, и трябва ли да се освобождава после масива ?

Автор:  bateAz [ Нед Фев 12, 2006 11:08 pm ]
Заглавие: 

Защото компилаторът ти изчислява 1024 * 128 и се мъчи да го напъха в integer ( max 32767 ). Напиши ((1024 * 128)ul).

Автор:  Реконструктор [ Нед Фев 12, 2006 11:39 pm ]
Заглавие: 

bateAz написа:
Защото компилаторът ти изчислява 1024 * 128 и се мъчи да го напъха в integer ( max 32767 ). Напиши ((1024 * 128)ul).


Точно така бате, но това няма да работи. :) Няма как да се направи по този начин (с формула).

Автор:  nickich [ Пон Фев 13, 2006 10:13 am ]
Заглавие: 

Добре де, като декларирам
Код:
Dim intarray(131072) As Integer

работи, въпреки, че 131072 > 32767.
Тази декларация не означава ли че искам да ми задели 131072 Integer-а ?? Защо трябва размера да се мъчи да го напъха в Integer?
Значи ако му кажа:
Код:
Dim intarray(1024 * 4) As Integer

примерно, също работи.
А
Код:
Dim intarray(1024 * 128) As Long
- неще.

Нещо ми се губи логиката ...

Автор:  bateAz [ Пон Фев 13, 2006 12:24 pm ]
Заглавие: 

Гърми, когато предпроцесорът изчислява. Ако го вземе "сдъвкано" - няма проблем.

Автор:  nickich [ Пон Фев 13, 2006 12:26 pm ]
Заглавие: 

bateAz написа:
Защото компилаторът ти изчислява 1024 * 128 и се мъчи да го напъха в integer ( max 32767 ). Напиши ((1024 * 128)ul).


аааа, сега стоплих :)
мерси! :)

..баси колко съм отвеян :)

Автор:  Реконструктор [ Пон Фев 13, 2006 12:38 pm ]
Заглавие: 

VB е доста тъп език с доста странности. :) Ако искаш хубав RAD, насочи се към на Борланд продуктите, java или C#.
Значи за конкретната странност на VB. Определянето на типа на аргумента в скобите става според стойността му. :lol: Т.е. когато напишеш

Код:
Dim intarray(131072) As Integer


транслатора вижда, че 131072 > 32767 и сътветно пъха това число в променлива тип Long. Ако напишеш

Код:
Dim intarray(131072 * 5) As Integer


понеже отново 131072 > 32767, транслатора го приема за Long и после умножава по 5, като резултата е, че нямаш проблеми. :roll: Ако, обаче, напишеш

Код:
Dim intarray(1024 * 128) As Integer


след като 1024 < 32767, транслатора го приема за Integer, постава 1024 в променлива от тоя тип и после като умножи със 128 се получава препълване на Integer-a.
По повод на горното, че няма решение на проблема, малко поизлъгах, забравил съм тоя език. По принцип за цифровите константи има постфиксни определители на типа. Например, & е определител за Long, а # е определител за Double. Ако напишеш, например

Код:
Dim intarray(1024& * 128) As Integer


Няма да имаш проблеми, защото & force-ва транслатора да приема 1024 за Long, въпреки, че е < 32767. Същото се отнася, ако напишеш (1024# * 128) - в този случай 1024 ще се приеме за Double.

Автор:  nickich [ Пон Фев 13, 2006 12:52 pm ]
Заглавие: 

Е, тва не го знаех!
Мерси, Реконструктор! :)
\:D/

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/