Тонкости C/C++

Тема в разделе "LANGS.C", создана пользователем Nafanya, 5 фев 2011.

  1. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    GRRRLPower

    extern - ключевое слово для объявления, показывает компилятору, что определение будет приведено далее в этом файле или в каком либо-другом файле. Можно было в main.c сделать #include "func.h", а в func.h накатать extern int func(); Естественно в func.c тоже сделать #include "func.h". Вот как я подразумевал - связь через h-ник.

    Естественно то был пример в первую очередь ва-листов, а не вычисления факториала:)
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Rel
    Неопределён на этапе компиляции клиента ф-ции, я имею в виду.

    iface.h:
    Код (Text):
    1. int do_something();
    client1.c:
    Код (Text):
    1. #include "iface.h"
    2.  
    3. int client1()
    4. {
    5.     return  do_something();
    6. }
    client2.c:
    Код (Text):
    1. #include "iface.h"
    2.  
    3. int client2()
    4. {
    5.     return  do_something(opt1, opt2, opt3);
    6. }
    impl1.c:
    Код (Text):
    1. #include "iface.h"
    2.  
    3. /*void*/ int do_something()
    4. {
    5.     //...
    6. }
    impl2.c:
    Код (Text):
    1. #include "iface.h"
    2.  
    3. /*void*/ int do_something(int opt1, int opt2)
    4. {
    5.     //...
    6. }
    client2 может линковаться с обоими реализациями, client1 - только с impl1.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    им все равно, главное чтобы вы передали адрес на стеке... как найти адрес - уже другой разговор... для этого можно написать свою кросплатформенную реализацию _AddressOfReturnAddress, например с помощью ассемблера yasm...

    вот вам еще один каверзный вопрос... про ILP32 (x86) и LLP64 (x64)... если разложить аббревиатуру, то ILP32: "int long pointer 32", LLP64: "long long pointer 64"... соответственно int* - 64-разрядный указатель, указывающий на 32-разрядное знаковое число... при прибавлении 1 к указателю на int, значение указателя увеличится на 4, а не на 8... это потенциальный генератор ошибок при переносе на x64 платформу... с адресной арифметикой вообще всегда надо точно знать, что делаешь...

    ЗЫ про LLP64 - касается винды... про другие оси нужно отдельно уточнить, модель может быть другой...

    ясно... у нас было небольшое недопонимание в понятиях... просто на этапе компиляции в вашем примере все же известно, как можно вызывать функцию, это меня смутило)
     
  4. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    green
    Не линкуется ни в одном случае, так как прототип do_something возвращает значение int, а реализация do_something тип void. Компилятор не пропускает чтобы прототип и реализация одной и той же функции возвращали значение разного типа.

    И вообще объявление и определение одной и той же функции должны совпадать между собой.
     
  5. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Момент 2
    В языке Си в определении функции требуется обязательно задавать имена всех аргументов.
    Код (Text):
    1. int func(int a,int b){return 0;}
    В языке Си++ определение функции возможно без имен аргументов
    Код (Text):
    1. int func(int a,int){return(0);}
    Таким образом программист может на будущее зарезервировать неиспользуемый аргумент при этом не получая сообщения о том, что аргумент не используется в теле функции.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Nafanya
    Да, я ошибся - там всюду должно быть или int или void. Исправил.
     
  7. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Каков размер базовых встроенных типов данных в байтах(int, char, float, double)? На RSDN по этому поводу такой горячий спор (но никто точно не говорит), который привел к тому, что некоторые личности не считают, что в байте 8 бит(!!!!)

    Пишут:
    A byte is at least large enough to contain any member of the basic execution character set
    and is composed of a contiguous sequence of bits, the number of which is implementation-defined.
     
  8. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Опытным путем получил размер встроенных типов данных (в байтах) для 32-разрядной аппаратной платформы x86.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    все это именно так, как здесь сказано... более того придраться в этих словах не к чему...

    какой ты молодец! сходи съешь пирожок) и открою тебе секрет - signed и unsigned тип имеют одинаковый размер, мог бы не проверять... по поводу размерности можно написать целую таблицу:
    Код (Text):
    1. ТИП       | LP64 | ILP64 | LLP64 | ILP32 | LP32
    2. char      | 1    | 1     | 1     | 1     | 1
    3. short     | 2    | 2     | 2     | 2     | 2
    4. int       | 4    | 8     | 4     | 4     | 2
    5. long      | 8    | 8     | 4     | 4     | 4
    6. long long | 8    | 8     | 8     | 8     | 8
    7. void*     | 8    | 8     | 8     | 4     | 4
    может где ошибся, не стесняйтесь поправлять)
     
  10. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Rel
    Можно я угадаю почему - в знаковом типе данных просто старший бит отводится под знак.
    Таким образом машине грубо говоря все равно какой диапазон чисел кодировать от 0 до 255 или от -128 до 127. Фишка в том, что байтом можно закодировать 256 чисел, то есть 2^8 различных состояний.

    Модели данных - http://www.viva64.com/ru/t/0012/

    Кстати а Вы могли бы привести пример архитектуры, где байт не является набором из 8-ми бит?
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    старший бит в младшем байте, если вспомнить, как хранятся "несколько-байтовые" числа)

    с википедии, она же первая ссылка в гугле:
     
  12. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Я делаю вывод, что байт - это минимальный адресуемый набор битов. Иначе нет смысла называть 32-бита байтом.
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    теперь эта фраза преобрела смысл?
    могу вас еще больше "шокировать"))) изначально "бит" мог принимать три значения: -1, 0, 1, но от этого пришлось отказаться в пользу двоичной системы счисления, так как очень неудобно представлять десятичные числа в троичной системе счисления...
     
  14. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Так хоть 16... Рассмотрим 32-разрядную шину адреса. Возьмем одну линию из этой шины - всего 32 линии по каждой передаётся один бит информации за такт. Так вот если по этой линии гнать сигнал, который может лишь принимать два фиксированных значения - для примера +3 В и +1 В, то мы кодируем 1 бит, способный принимать два значения(0,1). Если по этой битовой линии гнать сигнал, способный принимать фиксированные 16 различных значений напряжения, то мы закодируем бит, способный принимать 16 значений. То есть по битовой линии АДРЕСНОЙ ШИНЫ будет гнаться за один такт не 1 или 0, а любое 16-ричное число (0,1,2,...C,D,E,F).

    Кстати есть сложный QAM-сигнал (c квадратурной амплитудной модуляцией), в котором можно сразу закодировать 256 фиксированных значений (за счет изменения фазы и амплитуды сигнала), он на биты даже не разменивается, за раз гонит по одному байту.
     
  15. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Rel
    А в двоичной что, удобно что-ли? Неудобно писать в любой системе счисления отличной от десятичной. Привыкать надо долго. А история была чуть более сложной. То ли троичность загнулась в силу неоптимальности, то ли ей просто не повезло.
    И кстати бит никогда не мог принимать больше двух значений. bit -- это сокращение от BInary digiT
    А у кого-нибудь есть ссылка не на википедию, подтверждающая то, что в креях байтом считается 32 бита? Ну или хотя бы, голословная ссылка на свой опыт работы с суперкомпьютерами Cray? Просто мне как-то не верится в это.
     
  16. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    это называется трит а не бит.
     
  17. reversecode

    reversecode Guest

    Публикаций:
    0
    тонкий троллинг
    то были только рассуждения в сторону DNA компьютеров
    и насколько я знаю они остались в теории на бумажке
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    в двоичную вполне нормально... десять целочисленно не делится на три, если это канеш имеет значение... допустим в простом представлении чисел с плавающей точкой, получались бы бесконечные 3 и 6 в периоде)))

    ну а вы как думаете, для чего я слово бит кавычками обвел) главное, не то как я сказал, а то, что вы меня поняли))

    вообще мне этот момент запомнился с первой лекции какого-то предмета еще в университете... может я канеш путаю что-то...

    ЗЫ: http://www.govnokod.ru/5561
     
  19. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    Кто-нибудь может объяснить для чего в Си используется оператор унарный плюс?
    Походу чтобы на собеседованиях можно было спрашивать, как распарсится x+++y (к иксу прибавить префиксный инкремент игрека).

    И еще - некоторые говорят, что в С и С++ нет приоритета операций, в качестве примера приводят
    i = j ? k : l = m; , что выполняется как i = (j ? k : (l = m)). Что Вы думаете по этому поводу.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нет, это бинарный плюс