Features of compiler GCC. / Особенности компилятора GCC.

Everything you can't fit into other forums
  • For example, this way:

    Code: Select all

    #define __stdcall __attribute__((stdcall))
    extern "C" int __stdcall my_func_name(int first_param, char *second_param);
    in code we trust
  • Кто-нибудь знает, Mingw может создавать файлы в формате elf32 или там pe-i386 намертво зашито ?
  • Спасибо mike.dld .Твой совет мне помог.Для Linux версии gcc это выглядит так:
    Thank mike.dld.Your advice has helped me.For Linux versions gcc it looks so:

    Code: Select all

    #define stdcall __attribute__ ((stdcall))
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Столкнулся со случаем, когда GCC добавляет в код ошибку, неприемлемую для работы.

    Значит так. Имеем структуру, которая заполняется значениями. Справа я написал правильные смещения полей структуры.

    Code: Select all

    typedef unsigned int 		dword;
    typedef unsigned short int 	word;
    typedef unsigned char		byte;
    
    typedef struct InfoForButton
    {
     byte  type;		//0
     byte  flag;		//1
     word  x;		//2
     word  y;		//4
     word  width;		//6
     word  height;		//8
     dword image;		//10 <----Here GCC make mistake (12 but not 10)
     word  imageX;		//14
     word  imageY;		//16
     word  imageSizeX;	//18
     word  imageSizeY;	//20
     dword transparentColor;//24
     dword text;		//28
     word  textX;		//32
     word  textY;		//34
     dword textcolor;	//36
     dword color1;		//40
     dword color2;
     word  mouseX;
     word  mouseY;
    };
    
    InfoButton1->type=0x91;
      InfoButton1->flag=0;
      InfoButton1->x=50;
      InfoButton1->y=10;
      InfoButton1->width=70;
      InfoButton1->height=30;
      InfoButton1->image=1;
      InfoButton1->imageX=2;
      InfoButton1->imageY=3;
      InfoButton1->imageSizeX=4;
      InfoButton1->imageSizeY=5;
      InfoButton1->transparentColor=6;
      InfoButton1->text=TextForButton1;
      InfoButton1->textX=8;
      InfoButton1->textY=9;
      InfoButton1->textcolor=0;
      InfoButton1->color1=0xaabbcc;
    
    После компиляции в коде некоторые поля имеют неправильные смещения.

    Code: Select all

    	movl	-44(%ebp), %eax
    	movb	$-111, (%eax)
    	movl	-44(%ebp), %eax
    	movb	$0, 1(%eax)
    	movl	-44(%ebp), %eax
    	movw	$50, 2(%eax)
    	movl	-44(%ebp), %eax
    	movw	$10, 4(%eax)
    	movl	-44(%ebp), %eax
    	movw	$70, 6(%eax)
    	movl	-44(%ebp), %eax
    	movw	$30, 8(%eax)
    	movl	-44(%ebp), %eax
    	movl	$1, 12(%eax)		//<---- MISTAKE!!! 12 but not 10
    	movl	-44(%ebp), %eax
    	movw	$2, 16(%eax)
    	movl	-44(%ebp), %eax
    	movw	$3, 18(%eax)
    	movl	-44(%ebp), %eax
    	movw	$4, 20(%eax)
    	movl	-44(%ebp), %eax
    	movw	$5, 22(%eax)
    	movl	-44(%ebp), %eax
    	movl	$6, 24(%eax)
    	movl	-44(%ebp), %eax
    	movl	$0, 28(%eax)
    	movl	-44(%ebp), %eax
    	movw	$8, 32(%eax)
    	movl	-44(%ebp), %eax
    	movw	$9, 34(%eax)
    	movl	-44(%ebp), %eax
    	movl	$0, 36(%eax)
    	movl	-44(%ebp), %eax
    	movl	$11189196, 40(%eax)
    
    Существуют ли варианты обойти такие ошибки ? Или только через ассемблер...
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Попробуй варианты с typedef struct {...} __attribute__((packed));
  • andrew_programmer

    Это не ошибка. Компилятор старается выравнивать данные на адрес кратный размеру. Это ускоряет доступ к ним. Кроме __attribute__((packed)) есть #pragma pack() или опция -fpack-struct[=<n>] где n-выравнивание. Другой вариант - забить на экономию памяти и выравнивать данные так как это делает компилятор.
  • diamond и Serge

    Спасибо за советы. Они мне помогли справиться с проблемой.
    Это я писал тестовую программу для работы с libGUI из C. Программа отлично работает.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • У меня вопрос не по GCC, но связан с программированием на C. Мне нужно заполнить часть полей структуры однотипными значениями(например int ) и иметь доступ к ним как к элементам массива. Это необходимо для того, чтобы в цикле заполнить эти поля значениями. Значений довольно много, поэтому я и пытаюсь найти способ заполнения части структуры в цикле. Если в структуре просто указать массив нужного размера, то это не срабатывает, так как в структуру заноситься указатель на массив, а не сам массив.
    Существуют ли методы решения этой проблемы ?
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Если все элементы (ну или N первых) однотипные(имеют одинаковый размер), тогда преобразование типов тебе поможет, преабразуй например к (int*).
  • Ghost

    В том то и проблема, что большие участки однотипных данных чередуются с участками, где содержаться данные разного типа. При создании компонента Bookmark надо в структуру заносить указатели на информацию о дочерних контролах, которые будут созданы. У меня на 6 закладках содержиться много однотипных контролов Text и Number. Прописывать вручную информацию о всех этих контролах - дело муторное(раньше вручную прописывал - много времени на это уходит).
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • ну попробуй для однотипных участков так:

    typedef struct mystruct{
    dword a, b, c, d;
    byte e;
    word f;
    }ms;

    for(int i = 0; i < 4; i++)
    (dword*)(ms.a) = 0;

    ну или что то типа того.
  • Решил преобразовать структуру к одному типу данных и не мучаться, а разнотипные данные вверху будут.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Who is online

    Users browsing this forum: No registered users and 1 guest