Автор Тема: Да му се не види значи!  (Прочетена 1534 пъти)

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Да му се не види значи!
« -: 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 и нещата загрубяха доста - супер странни проблеми, странни опити да се алокират терабайти памет и тем подобни глупости. Красота. Тъп съм знам.

Знам че сам съм си виновен (сега имам да преправям сума ти код) ама ще им таковам таковата на тези гадове :(
« Последна редакция: Aug 26, 2011, 22:59 от gat3way »
Активен

"Knowledge is power" - France is Bacon

plandz

  • Напреднали
  • *****
  • Публикации: 535
  • Distribution: Debian Testing
  • Window Manager: KDE
    • Профил
Re: Да му се не види значи!
« Отговор #1 -: Aug 26, 2011, 23:16 »
[quote

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

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

Ако се чувствате добре,не се тревожете.Ще ви мине. - Murphy's Laws

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Да му се не види значи!
« Отговор #2 -: Aug 26, 2011, 23:33 »
Мразим gcc задето не ме оставиха да продължа да правя простотии, с две думи. Мразим и да правим простотии.
Активен

"Knowledge is power" - France is Bacon

spec1

  • Напреднали
  • *****
  • Публикации: 230
    • Профил
Re: Да му се не види значи!
« Отговор #3 -: Aug 27, 2011, 12:28 »
   Не би трябвало да ти е проблем да си сложиш проверка в самия
С/С++ код какъв компилатор се използва така,че да работи
коректно ,например:
        if (sizeof(int)==4){ //   32-bit code
 ....................
« Последна редакция: Aug 27, 2011, 12:39 от spec1 »
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Да му се не види значи!
« Отговор #4 -: Aug 27, 2011, 13:16 »
И утре когато има 128 битови системи ще има:
 if (sizeof(int)==16){ //   128-bit code
Активен

mobilio - професионални мобилни приложения

spec1

  • Напреднали
  • *****
  • Публикации: 230
    • Профил
Re: Да му се не види значи!
« Отговор #5 -: Aug 27, 2011, 13:27 »
  Защо  не ?!
 Все пак всеки сам си избира стила на програмиране.
 Пък и  говорим за  С/С++   ...
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Да му се не види значи!
« Отговор #6 -: Aug 27, 2011, 13:29 »
  Защо  не ?!
 Все пак всеки сам си избира стила на програмиране.
 Пък и  говорим за  С/С++   ...

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

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: Да му се не види значи!
« Отговор #7 -: Aug 27, 2011, 13:58 »
На 128-битова система може и да няма проблеми, стига int да е със същия размер като size_t., което обаче твърде вероятно няма да бъде така.Всъщност твърде вероятно единствено на 32-битови системи int и size_t са еднакво големи и е много лоша идея човек да свикне с този факт и да разчита на това. Единствено ми е интересно защо с по-стари версии на gcc нямаше проблем - не мога да си представя какво точно е правил gcc за да спести мъките. Вероятно някак си добавя някакъв код който увеличава указателя с 4, ама пак ми изглежда доста странно.
Активен

"Knowledge is power" - France is Bacon

spec1

  • Напреднали
  • *****
  • Публикации: 230
    • Профил
Re: Да му се не види значи!
« Отговор #8 -: Aug 27, 2011, 13:59 »
  Написал е че има някои проблеми с указатели ,в зависимост
от  компилатора и т.н. , и аз дадох едно възможно решение.
 Разбира се, може да има и други решения на проблема.
 Стана ли ти ясно сега ?
(отговора е към т.нар.  backtolife  )
« Последна редакция: Aug 27, 2011, 14:01 от spec1 »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Да му се не види значи!
« Отговор #9 -: Aug 27, 2011, 14:04 »
//off
  Написал е че има някои проблеми с указатели ,в зависимост
от  компилатора и т.н. , и аз дадох едно възможно решение.
 Разбира се, може да има и други решения на проблема.
 Стана ли ти ясно сега ?
(отговора е към т.нар.  backtolife  )

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

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше