Поиск:

Ответ в темуСоздание новой темы Создание опроса
> опубликование переменных для всех форм 
:(
    Опции темы
Mpak
Дата 15.1.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



Пишу в Unit1.h файле:
Код

class TFMain : public TForm
{
__published:    // IDE-managed Components
//...
private:    // User declarations
public:         // User declarations
//...
String nn;    //определяю переменную
};


Во второй форме подключаю Unit1.h
А он мне пишет Undefined simbol 'nn' smile


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
_hunter
Дата 15.1.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



ясен пень: -- nn член класса. и в общем пространстве имен ты его не найдеш.
выноси String nn; за пределы класса...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Mpak
Дата 15.1.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



То есть, что-то на подобии:
Код

class TFMain : public TForm
{
__published:    // IDE-managed Components
//...
private:    // User declarations
public:         // User declarations
//...
};

String nn;    //определяю переменную



--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Mpak
Дата 15.1.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



_hunter, Спасибо получилось ;)
уже +3 через 6 постов smile


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Vyacheslav
Дата 15.1.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Mpak @  15.1.2007,  19:51 Найти цитируемый пост)
 То есть, что-то на подобии:

То есть это уже не ООП


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


FMain1-> nn ="qwerty";


Добавлено @ 23:24 
Цитата(_hunter @  15.1.2007,  19:43 Найти цитируемый пост)
выноси String nn; за пределы класса... 

И это решит проблему? 
А не кажется ли Вам, что в результате будем иметь две переменные, вместо одной
Под первую память выделится при компиляции первой формы, а под втрорую -соответсвенно при второй. А линкер тихо предупредит о дублированнии переменных smile

Тогда уж надо было объявить хотябы так
Код

extern __declspec(selectany) String nn;
 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Mpak
Дата 15.1.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



Vyacheslav, Вы правы, Линкер предупреждал, но я не понял, что он хотел...

Добавлено @ 23:43 
Цитата(Vyacheslav @  16.1.2007,  02:16 Найти цитируемый пост)
Код

extern __declspec(selectany) String nn;

Он мне ошибку выдает...smile


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Vyacheslav
Дата 15.1.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну что бы ничегл не менять. объявите как я показал. Хотя это и расширение стандарта но удобно.
По стандарту, если уж так хочется иметь свободную переменную
в хидере пишите 
Код

extern  String nn;

и в одном из cpp
Код

String nn;


Добавлено @ 23:46 
Цитата(Mpak @  15.1.2007,  23:41 Найти цитируемый пост)
Он мне ошибку выдает

Какую?
У меня Билдера нет, пишу по памяти.
Посмотрите в хелпе, как правильно пользоваться __declspec(selectany). Возможно я напутал с порядком объявлений

Добавлено @ 23:50 
Нет не напутал
В Вашем варианте должно быть
Код

extern __declspec(selectany) String nn = "";



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Mpak
Дата 15.1.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



Vyacheslav, Ура! работает!!! Спасибо большое!
Зато Вы первый кому я повышу репутацию smile

А если не сложно, не могли бы вы мне принцип объяснить (в кратце, конечно) как работает extern и где его еще можно применять?

Добавлено @ 23:54 
Чем extern отличается от extern __declspec(selectany) и почему на второе мне выдалась ошибка...


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Mpak @  15.1.2007,  23:52 Найти цитируемый пост)
Чем extern отличается от extern __declspec(selectany) и почему на второе мне выдалась ошибка... 

Принцип такой - в хидере только объявление переменной, само выделение памяти при объявлении в cpp.
Поэтому в хидере extern , то есть мы сообщаем компилятору, что просто объявляем переменную для всеобщего обозрения, в cpp - без уже extern - это уже для инициализации.  То есть фактически должны "объявить" переменную дважды.
extern __declspec(selectany) как раз позволяет не утруждать себя "двойным" объявлением. Можно объявить один раз в хидере и компилятор все правильно поймет. К тому же здесь же в хидере можно проинициализировать переменную.
Почему ошибка? Не знаю. Вы же так и не дали текста сообщения



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Mpak
Дата 16.1.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



Еще раз спасибо ;)


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Bima
Дата 16.1.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



попробовал объявить методом
Код

extern __declspec(selectany) String tempp="";


выдает ошибку:
[C++ Error] Kod.h(67): E2092 Storage class 'extern' is not allowed here
[C++ Error] Kod.h(67): E2233 Cannot initialize a class member here



--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
megabist
Дата 16.1.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Mart Slaaf
**


Профиль
Группа: Участник
Сообщений: 455
Регистрация: 3.4.2006
Где: Мск

Репутация: нет
Всего: 31



дык нет обьявлять то надо как просто экстерном я так помню отсюда.....


--------------------
Don't panic!

Жди, и Фатум тебя приведёт...
PM MAIL ICQ Skype GTalk   Вверх
Bima
Дата 16.1.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

дык нет обьявлять то надо как просто экстерном я так помню отсюда..... 

Читайте выше. Если объявлять просто екстерном, то потом ее еще раз придеться инициализировать в срр, а этот метод позволяет создать переменную за один раз.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Vyacheslav
Дата 16.1.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(Bima @  16.1.2007,  10:38 Найти цитируемый пост)
C++ Error] Kod.h(67): E2092 Storage class 'extern' is not allowed here
[C++ Error] Kod.h(67): E2233 Cannot initialize a class member here

Так это для глобальных переменных, а Вы его в члены класса оформили. 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Bima
Дата 16.1.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



прогнал, извиняюсь. 
Объявил вне класса, заработало smile


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.