Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Visual C++. Проблема с глобальным массивом.


Автор: spleaner 5.6.2007, 12:50
Добрый день!
Мучаюсь с небольшой (но довольно срочной:( ) проблемой..

Имею проект test в visual C++ 8 (windows forms)
имеются, как всегда, файлы test.h и test.cpp .

в test.cpp находятся несколькой функций, глобальных переменыых и (!) нужный мне глобальный массив..
объявляю его (до написания всех функций и до #include "test.h") так:
Код

int abc[1024]

пробывал и так:
Код

int* abc = new int[1024];


но в любом случае, при вызове первой функции и попытке его обнулить 
(хотя бы тупо перебором в цикле)
Код

for (k=0;k<=1023;k++) 
        abc[k]=0;

ничего не происходит:(
В нем как были, так и остаются "левые" значения... (типа 11191934, 11191940, 0, 0, 20 и т.п.)

А мне нужно, чтобы была возможность изменять его и из test.cpp и из test.h (ну и считывать, разумеется)

Подскажите пожалуйтся, как его правильно объявить и как правильно к нему обращаться :(

Автор: zkv 5.6.2007, 13:28
честно говоря, не очень понял, что тебе нужно, может это: 
в одном (и только одном) из cpp файлов определяем массив глобально (те вне тел функций):
Код

int abc[1024];

затем в других файлах, где хотим увидеть этот массив предварительно объявляем его (можно делать сколько угодно раз):
Код

extern int abc[1024];


помогло? smile

Автор: spleaner 5.6.2007, 14:07
нет :( не помогло:(
чтобы было понятней - напишу подробней..

вот код файла noti.cpp (собственно проблемы лезут отсюда)..
p.s. все лишнее - убрал.. чтобы не засорять

Код

// на это месте инклюды библиотек

// Глобальные переменные:
int abc[1024];
//int* abc = new int[1024];

// Объявления функций

BOOL                InitServer();
// ну тут еще неск. функций - не суть

BOOL InitServer()
{
    // пробывал сюда вставить extern int abc[1024]; - не помогло..
    int k;
    for (k=0;k<=1023;k++) 
        abc[k]=0;

            // тут тело самой функции - к массиву отношения не имеет..
    return TRUE;
}

#include "Form1.h"
using namespace noti;

[STAThreadAttribute]

int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it
    Application::Run(gcnew Form1());
    return 0;
}


во время исполнения цикла включаю пошаговый режим и там четко видно, что элементы массива не изменятся:(
вот скрин:
user posted image

т.е. он пытается присвоить значение abc[k] , но там все равно остается "19878028" (ну в каждом элементе массива по-разному)..

Автор: zkv 5.6.2007, 14:13
spleaner, так ты смотришь на значение ячейки ДО того как она обнулена, там просто мусор валяется.
Цитата(spleaner @  5.6.2007,  14:07 Найти цитируемый пост)
    for (k=0;k<=1023;k++) 

как то больше принято 
Код

for (k=0;k < 1024;k++)

глаз режет smile

Автор: spleaner 5.6.2007, 14:20
наверно просто скриншот не удачныйsmile

вот так:
user posted image

ниодним элемент не обнулился.. 
(с 10го по 34ый элемент - нолики, т.к. он изначально такой создается.. после 34 опять фигня всякая)

Автор: Fazil6 5.6.2007, 14:24
Цитата(spleaner @  5.6.2007,  14:20 Найти цитируемый пост)
ниодним элемент не обнулился.. 

у тебя случаем точки с запятой нет в строке?
Код

for (k=0;k<=1023;k++) ;


и еще нет ли объявления 
Код

int abc[1024];

в test.h ?

Автор: spleaner 5.6.2007, 14:37
Цитата(Fazil6 @  5.6.2007,  14:24 Найти цитируемый пост)
у тебя случаем точки с запятой нет в строке?


нет конечноsmile
чуть выже же висит код файла..


Цитата(Fazil6 @  5.6.2007,  14:24 Найти цитируемый пост)
и еще нет ли объявления 
int abc[1024];


нету.. а даже если бы и было - я ведь смотрю watch'ем в прям времени этот цикл пощагово.. и ничего не происходит..

Автор: zkv 5.6.2007, 14:41
spleaner, если я скажу, что так не бывает, тебе это поможет? smile 
попробуй на всякий случай повыводить элементы куда нить (в файл например) чтобы убедится, что watcher не врет smile Хотя, скорее всего, что то у себя упустил ты.

Автор: spleaner 5.6.2007, 14:45
zkv
за 3 минуты то того, как обновил страницу поступил аналогично - и не поверил watcher'у...

Сделал еще один цикл.
Забил в строку символов все значения массива (в массиве было 2,2,2,0,4,3 и дальше нули) хоть вотчер и показывал всякую фигню - в строке оказалось то, что нужно...

Видимо то, что показывал watcher - это не значения, а что-то типа адресов переменных (хотя утверждать не берусь - сам в этом, как видно, не силен)

Тогда вопрос - а как же следить за массивом в пошаговом режиме?   smile 
(хотя сейчас лично мне это не актуально)

Всем совет - не верьте вотчеру  smile , проверяйте все сами...  smile 

Автор: Rapalex 5.6.2007, 14:50
spleaner, смотрю я на это:
Цитата(spleaner @  5.6.2007,  14:07 Найти цитируемый пост)
[STAThreadAttribute]int main(array<System::String ^> ^args)

И понимаю что ты не на сях пишеш а на C++/CLR, ты малость разделом ошибся идиты на .NET.

В шарпе есть Gaebage Collector, а что в этом ужазним си, я если честно не знаю. Может он и есть, может он тебе массив и удаляет, незнаю.

Поидее в .нет все переменные в классах должны быть обявлениы, там даже функций глобальных нет!!! да и классы все по пространствам имён раскиданы.

Да и вообще!!!! нафиг тебе глобальные переменные, во всех книгах написано что так делать НЕ желательно!!!

Автор: spleaner 5.6.2007, 15:02
Rapalex

если честно, я сам не фанат Си++, уже давно пишу на #..  Но с преподами по "Визуальным системам программирования" не поспоришь..
Вот и приходится мучатся..

Не задумывался на тему что принято и что нет, делаю для того, чтобы отвзались.. 

Но столкнувшись с такой проблемой был удивлен и решил разузнать что да как.. 

Всем спасибо за помощьsmile

Автор: SenkraD 5.6.2007, 15:13
[offtop]
spleaner,  программа использующая .NET Framework гараздо медленее любой проги на С++ с использованием MFC или иной GUI библиотеки по определению. И если ты пишеш на C# то мог бы и этот массив в класс запихнуть бы это было бы более правильно, да и более привычно для тебя
[/offtop]

Автор: Rapalex 5.6.2007, 15:37
Цитата(SenkraD @  5.6.2007,  15:13 Найти цитируемый пост)
 мог бы и этот массив в класс запихнуть

Согласен на все 100.

Цитата(spleaner @  5.6.2007,  15:02 Найти цитируемый пост)
Но с преподами по "Визуальным системам программирования" не поспоришь..

Что ты такое сказал!!! Разница между тем си на котором ты пишеш и шапом - СИНТАКСИС.
Всёравно получается сборка а не экзешник, и без фреймворка не потянет.
Всёравно что кнопки да/нет/отмена заменить пофиг/нефиг/нафиг, и сказать что это что этоновая ось.  smile 

Автор: nerezus 5.6.2007, 17:22
Цитата

spleaner,  программа использующая .NET Framework гараздо медленее любой проги на С++ с использованием MFC или иной GUI библиотеки по определению.
 Почему "гораздо"?
Разница порядка десятка-двух процентов.

Автор: SenkraD 5.6.2007, 18:05
[offtop]
nerezus,  когда мы работали со скинированиям это процент почти до половины дорос, хотя мы ускоряли как могли. Мы думали, что это мы дураки, но когда поискали по инету, то нашли кучу вопросов о том как ускорить когда работу проги когда у тебя за 100 контролов и ещё, не дай бог, скины ибо начинались такие тормоза с прорисовкой, что мама не горюй. В итоге всю визуальную часть переписали на Builder, а не визуальную (сервисы и всё в этом духе) на VC. Щас прога летает (гдето 130 кнопок со скинами, реклама - фильмы, гифки, флеш, и ещё куча скинированных контролов), ни одного подтормахивание, в то время когда на шарпе мы видели как кнопка одна за одной рисуется и, ещё раз повторю, не одни мы такой фигню наблюдали
[/offtop]

P.S. Всё завязываем эти религиозные войни в отдете WinAPI

Автор: nerezus 5.6.2007, 18:15
SenkraD, я сравнивал на 3Д графике питон и С++. Разница была примерно 10-15%.

для дотнета, говорят, еще меньше, не проверял, но склонен верить, т.к. дотнет будет все же немного быстрее питона.

Добавлено через 2 минуты и 49 секунд
P.S. питон: на дохлой видюхе(какой-то сапфир) при 800*600*32 выдавал под 2.5К FPS на 40k полигонах

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)