Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: gat3way в Aug 26, 2011, 22:48



Титла: Да му се не види значи!
Публикувано от: gat3way в Aug 26, 2011, 22:48
Ей скъсах си нервите с това. Изглежда тривиално и просто, ама не - не е.

Разглеждаме този прост случай:

Цитат
gat3way@debian:/tmp$ cat a.c

#include <unistd.h>

void main()
{
    int a=123456;
    size_t *ptr;
   
    ptr=&a;
    printf("%ld\n",*ptr);
}

Сега да компилираме 32-битова версия и да я изпълним:

Цитат
gat3way@debian:/tmp$ gcc -o a a.c -m32
a.c: In function ‘main’:
a.c:9:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
gat3way@debian:/tmp$ ./a
123456
gat3way@debian:/tmp$

Очакван резултат, нали. Айде сега да пробваме да компилираме за 64-битова архитектура и да пробваме:

Цитат
gat3way@debian:/tmp$ gcc -o a a.c
a.c: In function ‘main’:
a.c:8:8: warning: assignment from incompatible pointer type [enabled by default]
a.c:9:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
gat3way@debian:/tmp$ ./a
6644479007238775360
gat3way@debian:/tmp$

Сега никой не е казал че е хубава идея да присвояваме указател към size_t да сочи към int и да очакваме това да работи на различни таргети, обаче gcc до 4.4 някак си автоматично се грижеше за това, защото досега не е възниквало като проблем - и работеше защото вероятно gcc-то имплицитно е правело нещо по въпроса. Всъщност, дори warning не изкарваше тъпия компилатор, освен с -Wall и аз никога не съм се замислял толкова дали е лошо или не. Минах обаче на 4.6 и нещата загрубяха доста - супер странни проблеми, странни опити да се алокират терабайти памет и тем подобни глупости. Красота. Тъп съм знам.

Знам че сам съм си виновен (сега имам да преправям сума ти код) ама ще им таковам таковата на тези гадове :(


Титла: Re: Да му се не види значи!
Публикувано от: plandz в Aug 26, 2011, 23:16
[quote

Знам че сам съм си виновен (сега имам да преправям сума ти код) ама ще им таковам таковата на тези гадове :(
[/quote]

Off/
Е,добре де,ама не разбрах само дали си говориш сам,дали сам ще им таковаш таковата или искаш и ние да им таковаме таковата...като подкрепа за теб...Ние можем де!


Титла: Re: Да му се не види значи!
Публикувано от: gat3way в Aug 26, 2011, 23:33
Мразим gcc задето не ме оставиха да продължа да правя простотии, с две думи. Мразим и да правим простотии.


Титла: Re: Да му се не види значи!
Публикувано от: spec1 в Aug 27, 2011, 12:28
   Не би трябвало да ти е проблем да си сложиш проверка в самия
С/С++ код какъв компилатор се използва така,че да работи
коректно ,например:
        if (sizeof(int)==4){ //   32-bit code
 ....................


Титла: Re: Да му се не види значи!
Публикувано от: n00b в Aug 27, 2011, 13:16
И утре когато има 128 битови системи ще има:
 if (sizeof(int)==16){ //   128-bit code


Титла: Re: Да му се не види значи!
Публикувано от: spec1 в Aug 27, 2011, 13:27
  Защо  не ?!
 Все пак всеки сам си избира стила на програмиране.
 Пък и  говорим за  С/С++   ...


Титла: Re: Да му се не види значи!
Публикувано от: b2l в Aug 27, 2011, 13:29
  Защо  не ?!
 Все пак всеки сам си избира стила на програмиране.
 Пък и  говорим за  С/С++   ...

Ти наясно ли си gat3way какво пише?


Титла: Re: Да му се не види значи!
Публикувано от: gat3way в Aug 27, 2011, 13:58
На 128-битова система може и да няма проблеми, стига int да е със същия размер като size_t., което обаче твърде вероятно няма да бъде така.Всъщност твърде вероятно единствено на 32-битови системи int и size_t са еднакво големи и е много лоша идея човек да свикне с този факт и да разчита на това. Единствено ми е интересно защо с по-стари версии на gcc нямаше проблем - не мога да си представя какво точно е правил gcc за да спести мъките. Вероятно някак си добавя някакъв код който увеличава указателя с 4, ама пак ми изглежда доста странно.


Титла: Re: Да му се не види значи!
Публикувано от: spec1 в Aug 27, 2011, 13:59
  Написал е че има някои проблеми с указатели ,в зависимост
от  компилатора и т.н. , и аз дадох едно възможно решение.
 Разбира се, може да има и други решения на проблема.
 Стана ли ти ясно сега ?
(отговора е към т.нар.  backtolife  )


Титла: Re: Да му се не види значи!
Публикувано от: b2l в Aug 27, 2011, 14:04
//off
  Написал е че има някои проблеми с указатели ,в зависимост
от  компилатора и т.н. , и аз дадох едно възможно решение.
 Разбира се, може да има и други решения на проблема.
 Стана ли ти ясно сега ?
(отговора е към т.нар.  backtolife  )

Абе то на мен ми е ясно защо му отговаряш така, ама на теб не ти е ясен проблема на gat3way.