[С++ Builder6] Область видимости переменных [проблема]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by nc.STRIEM, 10 May 2008.

  1. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    Вознила необходимасть создать форму, решил делать это под биджером, т.к. проще.
    Столкнулся со следующей проблеммой.
    Создаю файл var.h - в нем обявляю глобальные переменные.
    Создаю 2е формы, и подключаю в них этот файл.
    В первой форме инициализирую глобальную переменную из var.h во второй форме пытаюсь ее вывести. Дак вот значение переменной в первой и второй фоме не совпадают, как будто бы это вобще разные пеерменные
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Да нормально все должно быть, покажи код
     
    _________________________
  3. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    http://taran.su/b.rar
     
  4. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    Скачал я исходник, подумал немного и даже не знаю что сказать =(.
    ЗЫ На Msvc++, этот метод пашет отлично.
     
  5. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    сказать можно одно - билдер хуяня, это не учитывая того сколько раз он зависает и глючит просто с нихуя
     
  6. GlOFF

    GlOFF Elder - Старейшина

    Joined:
    8 May 2006
    Messages:
    689
    Likes Received:
    484
    Reputations:
    4
    nc.STRIEM Согласен. У Borland и MS разные взгляды на работу, к каждой среде нужно привыкнуть и понять её... Что не ожидаешь и должно работать на MS у Borland ведет себя по другому..

    Попробуй переменную обьявить в .cpp первой формы.
     
  7. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    А разве они не разные?
    Вроде после выполнения работы с первой формой содержимое переменной "уничтожается" и поэтому вторая форма думает, что переменная пустая...
    могу и ошибаться...не пинать :)
    или присвоить значение переменной в var.h
     
  8. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    предположим что разные. тогда как сделать та чтоб не уничтожалось?
     
  9. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Страуструп: "Нет гарантированного порядка инициализации глобальных переменных из различных единиц трансляции.". Это не касается переменных, инициализированных константными выражениями, значения которых известны еще на стадии компиляции, и использование которых безопасно. Страуструп: "Существует несколько методов задания порядка инициализации глобальных переменных из отдельных единиц трансляции. Однако ни одна из них не является ни переносимой, ни эффективной. ... Часто функция,возвращающая ссылку, является хорошей альтернативой глобальной переменной. Например:"
    Code:
    int& use_count() {
        static int uc = 0;
        return uc;
    }
    
    Надеюсь, хоть чем-нибудь помог.
     
    1 person likes this.
  10. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    А обязательно значение в cpp-файле присваивать? Нельзя в h-файл это перенести?
     
  11. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    На мой взгляд реакция вполне корректна... У тебя код получается в разных объектных файлах, и чтобы код из одного объектного файла мог получить доступ к переменной другого внешнего файла, тебе нужно эту переменную определить как внешнюю (с помощью ключевого слова extern). А вообще вариант черезпопный, лучше сделай структуру, которая инициализируется при выполнении функции main или WinMain, а в обработчики форм (или куда тебе надо?) передавай указатель на эту структуру, по которому код функций будет получать доступ к полям структуры через операцию разыменования по указателю (->).