Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > В функции класса невижу указатель.


Автор: JAnty 17.4.2007, 13:33
Код

TImage *m_pFIG[33];
/*
***
*/
m_pFIG[1]=Forma1->Image1;


После запуска проги вылетает...

Автор: SenkraD 17.4.2007, 13:40
Не знаю у мя такой код работает
Код

TImage *mm[33];
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    mm[0] = Image1;
}

Автор: _hunter 17.4.2007, 13:41
где вылытает? как вылетает? что при этом отладчик показывает?

Автор: JAnty 17.4.2007, 14:14
user posted image

Хотя при этом FrmDoska->Caption = "qweqweqwe"; работает, но не в конструкторе, может вообще так нельзя делать в конструкторе?

Автор: Vyacheslav 17.4.2007, 14:18
Уважаемый, но у Вас там же светится FrmDoska == NULL.
Чего Вы  хотите от бедной доски, когда ее еще нет

Автор: JAnty 17.4.2007, 14:23
Это всё конструктор виновот негодяй, придётся без конструктора жить. :(


ЗЫ и почему нет тогого смайла :( !!!???

Автор: Vyacheslav 17.4.2007, 17:18
Да причем тут конструктор?
Насколько я понял, Вы пытаетесь сделать присвоение в конструкторе этого же FrmDoska.
Ну так кто же мешает написать просто в теле конструтора  ?
Код

m_pFIG[1]= Image1;

Автор: JAnty 17.4.2007, 17:52
с_doska::c_doska(void)
{
 // тут формы не выдно...
}

конструктор класса не формы, а в моей функции с_doska_constructor заработало. smile

Автор: Klin 17.4.2007, 17:56
Цитата(SenkraD @  17.4.2007,  14:40 Найти цитируемый пост)
mm[0] = Image1;

Насколько я знаю, массив с индексом 0 использовать нельзя. Там адресация происходит или что-то в этом роде...
Насколько я знаю, массивы  с VCL делаються так:
Код

TImage *Pic[1];  // объявляем массив типа TImage
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Pic[4] = new TImage(Form1); // инициализируем 
 Pic[4]->Parent = Form1; // указваем родителя
 Pic[4]->Picture = Image1->Picture; // "создаем" рисунок
}


Добавлено через 1 минуту и 5 секунд
Из постов не понял, то хоть написал?

Автор: SenkraD 17.4.2007, 18:03
Сколько пишу ни разу ошибок и даже варнингов не было + в таком случае должен работать код
(иначе будем иметь массив не с 33 элементов а с 32 ;-))
Код

TImage *pImgs[33];
pImgs[33] = Image1;

а он у мя ерор выдаёт
А на счёт индексации, то я знаю, что в String'e в нулевом элементе размер лежит.

Автор: Klin 17.4.2007, 18:06
Цитата(SenkraD @  17.4.2007,  19:03 Найти цитируемый пост)
а он у мя ерор выдаёт

Весь код выложи
Цитата(SenkraD @  17.4.2007,  19:03 Найти цитируемый пост)
(иначе будем иметь массив не с 33 элементов а с 32 ;-))

Он динамически выделяет память, до тысячи с чем-то

Автор: SenkraD 17.4.2007, 18:16
Klin,  код я обычно не так пишу.
Но вообще странно. (Только что проверил для случая с 33 34 элемент добавить можно выше маты гнёт)

не подскажеш где можно почитать о таких приколах Buildera'a

Автор: Klin 17.4.2007, 18:27
Не знаю, почем он ругается, может в настройках че не так  smile 
Цитата(SenkraD @  17.4.2007,  19:16 Найти цитируемый пост)
не подскажеш где можно почитать о таких приколах Buildera'a

Блин, не знаю, я сам методом тыка пол компьютера изучил smile

Автор: Vyacheslav 17.4.2007, 18:30
Цитата(SenkraD @  17.4.2007,  18:16 Найти цитируемый пост)
не подскажеш где можно почитать о таких приколах Buildera'a

Модератор:Еще раз про приколы Builder и получите штраф.  Нечего кривизну рук валить на продукт 
Особо грамотным. Массивы в С++ (Builder)  начинаются с нуля. Если Вы краем уха слышали, что отсчет символов в классе AnsiString начинается с 1 , то причем тут массивы. В своем классе я тоже могу переопределить оператор [] и задать  ему начало, ну, например, с 13. И что?

Автор: Klin 17.4.2007, 18:31
Блин, сории до тыщи он конечно тянет, объявлять побольше надо. В процессе работы все ништяг, но по завершению действительно сквернословит  smile ъ


p.s TImage *m[] = {new TImage(Form1)}; если так объявить, то без ошибок. Но не знаю, правильный ли он "грамотически"

Автор: SenkraD 17.4.2007, 18:39
Vyacheslav,  я знаю что массивы в С++ начинаются с нуля и никогда не нарушаю правила С++ по работе с массивами. Я часто создаю двумерные массивы конторов в рантайме (интерфейсы в базах лежат), но просто пост Klin меня взбудоражил и я нарошно проверил и код
Код

    TImage *mm[33];
    mm[34] = Image1;

работает.
О перегрузке операторов я тоже знаю и пользують + не краем уха а в книгах.

P.S. Мне очень нравится Builder
P.S.P.S. Прошу извениние за оффтоп да и вообще

Автор: Vyacheslav 17.4.2007, 18:49
Ребяты. Запомните раз и навсегда. Классический С++ не проверяет выход за границу массива
Поэтому вот это
Код

   TImage *mm[33];
   mm[33] = Image1; //выход за пределы массива

явлется ошибкой, но компилятор ее не  отловит.  А грохнется или не грохнется программа это одному богу известно. Если за массивом легло что то используемое в программе, а Вы затерли, то соответсвенно получите exception. Если - нет, то все обойдется.  

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