Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93

VB6. Лимиты на статические и нестатические переменные

11.07.2006, 19:20. Показов 2537. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проект в ВБ6. Многое вырезано, оставлена суть, помогите плз разобраться.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
 
Public Declare Sub FillMsgFromParams Lib "gsup.dll" (struct As MESSAGE, ByVal msgtype As Long, ByVal nver As Single, ByVal Lang As Long, ByVal name As String, ByVal Hash As Long, ByVal gameN As Long, ByVal Y As Long, ByVal move As String, ByVal map As String, ByVal text As String)
Public Declare Sub FillMsgFromString Lib "gsup.dll" (struct As MESSAGE, ByVal buff As String)
Public Declare Sub FillStringFromMsg Lib "gsup.dll" (ByVal buff As String, struct As MESSAGE)
 
Public Declare Sub EnterCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
Public Declare Sub LeaveCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
Public Declare Sub InitializeCriticalSection Lib "kernel32" (lpCriticalSection As CRITICAL_SECTION)
 
Public Type CRITICAL_SECTION
     dummy As Long
     ' BYTE8 move[4 Kb];
     map As String * 16384 '/* 09 */ UBYTE8 map[16 Kb];
     text As String * 8192 '/* 10 */ BYTE8 text[8 Kb];
     tmp1 As String * 16 '/* 11 */ sockaddr_in addr;
     time As Long 'UINT32 time;
     tmp3 As Long 'MESSAGE *prev;
     tmp4 As Long 'MESSAGE *next;
     End Type
 
Public Sub SendMsg(ByVal msgtype As Long, ByVal nver As Single, ByVal Lang As Long, ByVal name As String, ByVal Hash As Long, ByVal gameN As Long, ByVal Y As Long, ByVal move As String, ByVal map As String, ByVal text As String)
On Error Resume Next
Dim m(1) As MESSAGE
Dim b As String
b = String(64000, 0)
If (name = "") Then
     name = ES
End If
m(1).time = GetTickCount()
Call FillStringFromMsg(b, m(1)) '(#1#)
Call EnterCriticalSection(CS)
moutlist.Add b
Call LeaveCriticalSection(CS)
End Sub
Место, где отмечено (#1#), то есть там, где второй раз вызывается функция длл, которой передаётся структура, вызывает ошибку: Too many local, nonstatic variables. То есть, типа, превышен лимит на локальные переменные в 32К.
Я уже задрался, почему только один вызов проходит? Если первый вызов отклонировать, то тогда затык на копии.
И статиком я структуру (static m as MESSAGE) специально не объявляю, потому как надо со структурой во многих функах, а статикам разрешено занять тока 64К. Что это за дурацкие ограничения в 32К и 64К?! Дурость какая-то. Это моё скудоумие или разработчиков компилятора?
Струкутра пробита жёстко, потому как это формат сообщения для обмена с сервером. Васиковский – это я клиентский код привёл. Сервер у меня написан на плюсах и проблем нет. То есть, по моему разумению удобно получить такое сообщение и распаковать его в Васину структуру (я сжимаю сообщения, ессно, но тут в примере это не приводится). Но получается, что работать со структурами в ВБ совершенно невозможно и крайне неудобно. Какое его Васино собачье дело, какого размера у меня структура?

ХЭЛП!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2006, 19:20
Ответы с готовыми решениями:

Лимиты на статические и нестатические...
Проект в ВБ6. Многое вырезано, оставлена суть, помогите плз разобраться. Option Explicit Public Declare Sub FillMsgFromParams Lib...

Статические и нестатические переменные и методы.
Что такое статические и нестатические переменные и методы? Объясните плизз доходчиво.

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

9
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
11.07.2006, 19:37
Zerq1,
Otvet zdes':
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q179/1/40.ASP&NoWebContent=1" target=_blank><FONT color=#606420>http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q179/1/40.ASP&NoWebContent=1
VladConn
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
11.07.2006, 20:48  [ТС]
Спасибо, добрый человек!
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
12.07.2006, 01:01  [ТС]
Потыркался,Ю оценил трезво, тык скыть, оказалось шиш на кумыш сменял. Проблема не решилась. Да, на сайте есть типа солюшн, но он - ошибочен! Микрота признала баг компилера. Как я понял он заключается в том, что при попытке передать в длл ссылку на юзертайп объект компилятор выделяет для своих временных нужд столько памяти, сколько этот самый объект занимает. А в ВБ6 есть ограничение, что внутри функции все нестатические переменные и вся память, выделенная компилером для своих временных нужд в отношении этих переменных не должна превышать 32К. Идиотизм какой-то.

В солюшене предложено решение, которое кратко сводится к тому, что мол надо заменить спрособ передачи ссылки на вашу структуру в длл. А именно, скопировать сначала эту структуру в массив байт с помощью копимемори, потом передать в длл ссылку на первый байт массива (соответственно в прототипе в Васе параметр описывается не как struct as USER_STRUCT, а как struct as Byte), а после модификации длл вашего массива опять скопировать его в струтуру с помощью копимемори.

Наивные ребята. Дело в том, что копимемори это абсолютно точно такая же функция длл как и моя самописная, а посему глюк остаётся.

У них в примере структура длиной 4К. Да, при такой длине можно почти 8 раз вызывать копимемори. А у меня структура 29К!!! И потому второй же вызов копимемори опять ставит раком программу.



Пока пойду пробовать способ извращённый. Суть кратко в следующем. А что если попробовать передать адрес структуры через лонг?! То есть вызываем длл с адресом и смотрим какой лонг вернут, а потом его в рабочих функциях пихаем. Главное, чтобы моя плюснутая длл однозначно преобразовывала адрес->лонг->адрес.

Попробую.

Млин, такие косяки, я в осадке...
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
12.07.2006, 01:26
A zachem peredavat' imenno strukturu? DLL vi pisali? Poprobujte, esli ona primet odnu stroku, razdelennuyu dopustim znakom "#", a DLL ee budet parsit'. No ideal'no peredavat' ssilku na ob"ekt, v kotorom svojstvami budut polya UDT.
Ya davno izbegayu UDT - vse starayus' delat' v klassax.
Kstati, "solution" i est' "reshenie". I chto takoe "кумыш"? Tol'ko ne posilajte menya na moyu zhe ssilku ;0)
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
12.07.2006, 01:35  [ТС]
длл моя, но я ничего не собираюсь парсить! У меня не 3 поля, а сильно больше десятка!!! Если сервер и клиент обмениваются сообщениями одного формата, то я вправе хотеть, чтобы на стороне васёвского клиента принять сжатое сообщение, передать в мою же плюснутую длл и адрес структуры. Распаковщик в длл расжимает и всё мечет на адрес васькиной структуры. Вуаля, всё само распарсилось. Неправда ли, карасиво?

Если бы влиент был плюснутый, то всё бес проблем, однако настолько изнасиловать свой мозг, чтобы писать на мфси - я не могу. А в бэйсике получается, что его разработчики на структуры просто забили, раз в компилере ТАКИЕ так и не исправленные косяки.

Итак, проблема так и не решена до сих пор, надо всё таки испытать передачу адреса через лонг, заработает ли?
0
6 / 6 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
12.07.2006, 01:37
Kstati, eti API:
Visual Basic
1
2
3
Declare Function CpyStr2Udt Lib "Kernel32" Alias "lstrcpyn" (lpString1 As Any, ByVal lpString2 As String, ByVal cChars As Integer) As Integer
 
Declare Function CpyUdt2Udt Lib "Kernel32" Alias "lstrcpyn" (lpString1 As Any, lpString2 As Any, ByVal cChars As Integer) As Integer
kopiruyut UDT v stroku i odin UDT v drugoj UDT. Poprobuj pozhonglirovat' imi v svoem DLL, peredavaya stroku, a ne UDT.
Kak ideya?
VladConn
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
12.07.2006, 01:49  [ТС]
Вроде есть надежда, вот прога на си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <stdio.h>
#include <mem.h>
 
//////////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
char s[100], *ptr;
long i;
strcpy(s, "aaa");
ptr = s;
printf("ptr=%d", ptr);
i = (long)ptr;
printf(" i =%d", i);
ptr = NULL;
ptr = (char *) i;
printf("ptr=%d", ptr);
ptr[1]++;
puts(s);
return(0);
}
//////////////////////////////////////////////////////////////////////////////
вывод программы:

ptr=1244952

i =1244952

ptr=1244952

aba

итого, если один раз вызвать длл с адресом структуры в качестве параметра, и эта функа вернёт лонг, то потом можно рабочие функи звать с лонгом, а они сами будут из него делать адрес! Таким образом мы передаём UDT в параметрах один раз!

Вот это имхо и есть идея! Каково?
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
12.07.2006, 14:30  [ТС]
Мистика какая-то.
Короче, зачем лонг таскать - неясно. Проще хранить адрес в самой длл.
Написал функцию длл SetUDTadr(struct as MESSAGE) для запоминания адреса в длл.
А рабочие функи длл работы с этой структурой теперь вызываю без адреса структуры в параметрах. НО нихера не работает. Караул. Я устал уже. Причём самое смешное, что при вызове SetUDTadr в длл действительно приходит реальный адрес тсруктуры, все её изменения отражаются в ней и это проверяется из бейсика. А при вызове рабочих функций длл, которые берут сохранённый тот же самый адрес, создаётся впечатление, что они пишут куда-то в космос, а не по этому адресу.
Структура у меня объявлена в функции как массив из одного элемента, чтобы вася не вопил, что слишком много нестатических переменных. Неужели между вызовом функи установки адреса в длл и вызовом рабочей функи вася куда-то перераспределяет структуру в памяти?
Причём если установку не вызывать, а вызвать рабочую функу с передачей адреса, то код рабочей функи длл работает! Но стоит отрезать передачу адреса и сделать его предварительную установку в длл - всё перестаёт работать.
сил моих нет...
0
2 / 2 / 0
Регистрация: 04.05.2010
Сообщений: 93
13.07.2006, 04:32  [ТС]
Решение есть. За основу берем то, что предложили на сайте поддержки микроты, однако, важный момент, необходимо написать обёртку для копимемори! И вуаля! Длл-функи зовём когда хотим и копимемори тоже, так как адрес структуры в длл передаётся в одной только обёртке и один раз!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2006, 04:32
Помогаю со студенческими работами здесь

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

Что такое статические и нестатические функции, и чем они различаются?
Тема:Объектно-ориентированное программирование. Ребят, кто может точно сказать что такое статические и нестатические функции и чем они...

Статические переменные
В чем польза использовать статические переменные вместо обыкновенных публичных в определении класса. К примеру: class record { ...

Статические переменные
Добрый день! AS только начал изучать, и есть одна проблемка с баннером: Баннер должен растягивать фон в зависимости от размера...

Статические переменные
Здравствуйте, искал инфу в интернете про статические переменные. Люди говорят разные вещи про разные типы статических переменных. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru