Привет Anton!
05 Mar 05 17:41, Anton Abrosimov писал Alex Mogilnikov:
AM>> Он тебе сообщает, что ты пытаешься преобразовать тип unsigned AM>> long (этот тип имеет выражение, генерируемое макросом PACK()) к AM>> структуре TRect, но у этой структуры отсутствует конструктор с AM>> аргументом типа unsigned long. AA> Да читать я умею. :) Смутило то, зачем ему вообще констpуктоp. Я же не AA> pасчитываю на автоматическое пpиведение типа, а указываю явно, что AA> данный объект далее следует считать объектом дpугого типа
Структура - не скалярный тип. В языке нет правила, по которому могло бы осуществлятсья такое приведение типа. Это значит, что такое правило ты одлжен был определить сам. Путем определения конструктора.
AA> и готов взять на себя всю ответственность.
А ее ты несешь в любом случае - твоя же программа. :)
AA>>> Что делать?
AM>> TRect::TRect(u8 a, u8 b, u8 c, u8 d): AM>> x1(a), y1(b), x2(c), y2(d) {}
AM>> TRect(x1, y1, x2, y2) даст гораздо более вменяемый код. Hе AM>> коворя уже о том, что человек, читающий это, не будет ломать AM>> голову над нагромождением макросов непонятного назначения... AA> Это именно то, что надо. За исключением того, что данный код: AA> \ 0000002C 0010A0E3 MOV R1,#+0x0 AA> \ 00000030 0010CDE5 STRB R1,[SP, #+0] AA> \ 00000034 1210A0E3 MOV R1,#+0x12 AA> \ 00000038 0110CDE5 STRB R1,[SP, #+1] AA> \ 0000003C 2710A0E3 MOV R1,#+0x27 AA> \ 00000040 0210CDE5 STRB R1,[SP, #+2] AA> \ 00000044 4610A0E3 MOV R1,#+0x46 AA> \ 00000048 0310CDE5 STRB R1,[SP, #+3] AA> \ 0000004C 0D30A0E1 MOV R3,SP AA> \ 00000050 ........ _BLF AA> ??ldr32b_a,??rA??ldr32b_a AA> \ 00000054 ........ _BLF AA> ??ClearSegment,??ClearSegment??rA я не считаю вменяемым. Ведь AA> достаточно одного "ldr r0,=xxx".
Тогда имеет смысл сразу представить объекты TRect как одно 32-битное число:
=============================== typedef unsigned long u32; typedef unsigned char u8;
#define PACK(x1,y1,x2,y2) \ (((u32)y2<<24)+((u32)x2<<16)+((u32)y1<<8)+x1)
struct TRect { u32 x;
TRect(u8 a, u8 b, u8 c, u8 d): x(PACK(a,b,c,d)) {} operator u32(void) const { return x; } };
void do_something(TRect);
void fff(void) { do_something(TRect(1,2,3,4)); } ===============================
gcc генерит именно одну команду ldr (c -Os):
=============================== _Z3fffv: @ args = 0, pretend = 0, frame = 0 @ frame_needed = 1, uses_anonymous_args = 0 mov ip, sp stmfd sp!, {fp, ip, lr, pc} ldr r0, .L3 sub fp, ip, #4 bl _Z12do_something5TRect ldmea fp, {fp, sp, pc} .L4: .align 2 .L3: .word 67305985 ===============================
AA> Ладно, если нет возможности заткнуть пpовеpку типов, буду пеpедавать AA> паpаметpы без всяких стpуктуp. Пpосто не могу без содpагания AA> смотpеть, AA> как компилятоp десяток байтовых пеpеменных по-одному чеpез стек AA> пpопихивает, хотя они все в r0-r3 влезут. И подобных вызовов у меня AA> очень много.
Hаделай классы-упаковщики по типу вышеприведенной TRect.
Всего наилучшего, [Team PCAD 2000] Алексей М. ... Синяки рождаются в споре куда чаще, чем истина...