![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Hagrael |
|
||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Здравствуйте, уважаемые форумчане. Я не так давно начал учить C++ и засел на некоторых вопросах:
1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей) Реально ли сдвинуть на несколько бит? 2) Почему массив сделали константой? И почему вообще стоит использовать константы? 3) Касательно констант, в следующем коде:
под 10 тоже выделяется отдельное место? А в этом:
4) Если говорить "на языке компьютера", то операция &a возвращает указатель, а не адрес? Ведь эта операция возвращает тип type*, присущий указателям. А адрес - это число (типа int) по моему мнению. 5) Каков порядок инициализации массива в следующем коде:
Строка компилятором заменяется на указатель на массив типа char. Значит, инициализация состоит из следующих этапов: узнаем размер массива по правую часть; освобождаем память под этот размер; по очереди копируем ячейки правого массива в соответственные ячейки левого. Так? 6) Странно работает программа:
Я один (!) раз ввожу "12345", а она мне выдает "123"! Я же 2 раза использовал функцию cin.getline! Не могли бы вы объяснить мне, почему мне приходится вводить информацию один раз, и переменной b ничего не присваивается? Заранее благодарен ![]() Это сообщение отредактировал(а) Hagrael - 26.6.2011, 15:00 |
||||||||
|
|||||||||
hawk3500 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
1)
указатель это по сути дела адрес! И здвинуть его модно прибавив (или отняв) нужное вам количество байт. У 99% ПК байтовое адресное пространство. 2) Не ясен вопрос. поясните. 3) выделяется. В разных местах может выделяться. 4) указатель-это и есть число. Всё верно. 5) порядок будет несколько различен от того глобальная это переменная или нет --------------------
воин dzen'a |
|||
|
||||
volatile |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
нет
Размер массива сделали константой. Почему не знаю. В новых версиях это уже не константа. Видимо наследие тяжёлых времен.
Во-первых у вас, это не константа. const int a; <- вот это константа. Выделение памяти - зависит от реализации. По опыту могу сказать, что от формы инициализации не зависит. А зависит есть ли где в программе указатель на эту константу. Если указателя нет, то и память не выделяется, а просто подставляется значение. Если есть указатель, то память будет выделена.
Указатель это и есть адрес. точнее указатель это переменная в которой хранится адрес того, на что он указывает.
Зависит от того в каком месте стоит. Если в функции, и если не статик, то будет примерно так как вы написали. для статик или если это глабальный массив, то выделение будет произведено на этапе компиляции. |
||||||||||||
|
|||||||||||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Здесь вам неправильно ответили. Сдвинуть указатель на целове на несколько байт нельзя! То есть этот код юудет неопределенным согласно стандарту языка. Поэтому приведенный в одном комментарии од, показанный ниже, является некорректным.
Более того на некоторых системах он может привести к аварийному завершению работы, если вы по этому указателю захотите что-то записать. Указатель для типа int должен быть выровнен на границу слова. Тем более нельзя указатель сдвинуть, как вы пишите, на несколько бит, так как минимальная единица адресация - это байт. Что касается массива, то это не константа. Просто нет такой отдельной переменной, как массив, чтобы вы могли изменить значение по адресу этой переменной. То есть, фактически, вам менять нечего! Чтобы было понятно, то, например, указатель на элемент массива - это отделная ячейка памяти. Поэтому указатели можно менять, а с именем массива никакой ячейки памяти не связано. В памяти располагается лишь сам массив, который вы и можете менять. Что касается вашего примера с определением целочисленного значения, то очно целочисленные константы в памяти не хранятся. То есть компилятор, например, в вашем коде может сразу же записать по адресу переменной 'a' значение 10, и не хранить этот литерал 10 отдельно в памяти. Но бывают случаи, когда, например, используются выражения в качестве аргументов функции, когда компилятор хранит отдельно целочисленные литералы в своем пуле литералов. Но в общем случае компилятор оычно непосредственно вставляет в код целочисленные литералы без сохранения их в отдельном участке памяти. Что касается примера то в данном случае компилятор также не хранит строковый литерал в памяти, а лишь использует его для инициализации массива. То есть память выделяется только для массива a[], размер которого определяется как размер строкового литерала плюс один байт по нулевой завершающий символ. В вашем примере для массива будет выделено 6 байтов, и в них будет скопирован строковый литерал, включая завершающий ноль. То есть этот код полностью эквивалентен следующему коду char a[ 6 ] = { 'H', 'e', 'l', 'l', 'o', '\0' }; То есть никаких двух массивов, один - для строкового литерала, а другой - для идентификатора 'a', не создается. Создается лишь один массив для идентификатора 'a'.
Что касается этого примера выше, товы ведялете буфер для ввода строки в 4 байта. Функция считывает все то, что вы ввели до нажатия клавиши Enter, а затем копирует лишь 3 байта, добавляя их четвертым байтом нулевого значения. |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Согласен с тем что код не кошерный, и новичкам такое показывать конечно нестоило. Но строго говорить что Вовсе он не должен. Есть куча стркутур, где DWORD'ы не выровнены на границу слова. И на PC это абсолютно нормально. Хотя повторюсь, так делать, конечно-же не стоит. |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
В вашей структуре может быть целове число не выравнено на границу челого числа, но если вы занесете адрес этого целого числа в указатель, то такое поведение не соответсвует станарту является неопределенным. И то, что у вас где-то это может "проскочить", совершенно не означает, что код корректный. Приведу простой пример. Неокторые делают такое объявление char * p = "12"; А затем менют значение по адресу этого указателя. Например, *p = '3'; При раоте, например, MS-DOS это пройдет, так как память там не защищенная, но тем не менее этот код некорректный согласно стандарту, так как строковые литералы менять запрещается. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Сыроежка, ваш пример, с
*p = '3'; к теме выравнивания int'ов никакого отношения не имеет. Добавлено @ 16:28 Кроме того он и не скомпилится. Но повторю. Жалею что показал это. Так делать нехорошо. Это сообщение отредактировал(а) volatile - 26.6.2011, 16:29 |
|||
|
||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Имеет самое непосредственное отношение! Вы просто не поняли! Я хотел показать, что некоторые некорректные конструкция языка могут проскакивать на той или иной платформе, но тем не менее код является некорректным. Точно также и в случае занесения в указатель на тип int значения, которое не кратно размеру слова, то есть размеру int. Если вы попытаетесь по этому адресу записать целое число, то на многих платформах вы получите аварийное завершение. Н адругих платформах это может проскочить. Но то, что где-то это проскочило, это совершенно не делает код корректным! Стандарт по этому поводу прямо говорит, что такое поведение является неопределенным, то есть вы играетет в рулетку на свой страх и риск. А точнее пишите код, который не является допустимым кодом ни С и ни С++. Добавлено через 8 минут и 45 секунд
Зря вы думаете, что такой код не компилируется! Многие компияторы, особенно на С, спокойно компилируются этот код. Кроме того вы не забывайте, что компилятору бывает очень трудно обнаружить такую ошибку, например, есл такой указатель передается в качестве аргумента какой-нибудь другой функции, а уж в этой функции происходт присвоение по адресу указателя. У вас код не окмпилируется скорей всего по той причине, что вы компилируете как код С++, и компилятор видет это непосредственное изменение. Дело в том, что ест разница между С и С++ в том, како тип имеют строковые литералы. На С++ строковый литерал имеет тип массива производного от типа const char, а в С это массив, производный от типа char. Но тем не менее стандарты и С++ и С строго запрещают менять строковые литералы. |
||||
|
|||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Сыроежка, я уже тыщу раз сказал что пример не хорош, и что я жалею что показал его.
Просто иногда новичку нужно знать (вспоминая себя) и такие вещи. но на вопрос
ответ мой такой.
Спорить дальше не буду ![]() |
||||
|
|||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Как происходит инициализация массива строковым литералом, я вам показал выше в своем комментарии. Но нужно не путать две вещи: инциализацию массива строковым литералом, и инициализацию указателя на char адресом строкового литераа, то есть когда вы пишите char *p = "Hello"; В этом случае компилятор действительно сохраняет символьный строковый литерал в памяти в виде символьного массива, а указателю p присваивает знчение адреса первого элемента этого массива. Причем следует знать важные отличия характеристик строкового итерала в С и в С++. В С строковый литерал имеет тип массива, производного от типа char (массивы называются в стандартах С и С++ производными типами, то есть их тип определяется типом элемента массива). В то время как в С++ строковый литерал имеет тип, произвоный от типа const char. Есть и еще одно важное различие, которые многие программисты не знают. Так, например, следующий код char s[3] = "XYZ"; является корректным в С. В то время как в С++ такой код является некорректным. |
|||
|
||||
hawk3500 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
ИМХО чтобы не было проблем с выравниванием и проблем с выравниванием и разрадностью многих систем порой всё же стоит выходить за пределы C.
Я бы реализовал это просто. void *Point; __asm { mov eax,Point add eax,03h mov Point,eax } Ну а для всех тех кто неприклонно бориться за чистоту языка: void *Point; Point=(void*)((BYTE *)Point)[ 3]. или: Point=(void *)(DWORD(Point)+3) --------------------
воин dzen'a |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я уже написал выше, что этот код некорректный. Вы можете проделывать различные преобразования, но код так и останется не корректным. И это имеет дело не "к чистоте "языка, как вы думаете, а к совершенно некорректному программированию, которое к языку отношения не имеет. Ваши попытки мне напоминают стремление слово "корова" писать через "а". От того, что вы букву "а" напишите, например, прописными буквами, а не строчными, то есть в виде "кАрова", не делает прапвильным правописание этого слова. То есть ваш комментарий ни к С, ни к С++ отношениря не имеет. А имеет отношение лишь к тому, чего не надо делать на С и С++! Если бы автор вопроса интересовался именно этим, то есть тем, как не надо писать на С и С++, то ваш ответ был бы к месту. Добавлено через 3 минуты и 32 секунды
Кстати сказать, хотел бюы отметить, что, во-перваых, в С вообще нет ключевого слова asm ни в каких модификациях (с префиксом в виде знаков подчеркивания или нет), а в С++ есть лишь ключевое слово asm Так что предложенный вами способ имеет отношение лишь к какому-то оригинальному компилятору. |
|||
|
||||
hawk3500 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
void *Point;
__asm { mov eax,Point add eax,03h mov Point,eax } и где же сдесь ошибка?????? --------------------
воин dzen'a |
|||
|
||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
А я не гвоорил, что здесь ошибка! Я говорил, что к исходному вопросу это отношения не имеет. Автор, фактически, спрашивал, может ли указатель иметь значение, не кратное размеру int. Ответ прост: не может! То есть такое поведение неопределенное. Что касается вашего примера, то ваша переменная Point объявлена не как указатель на int, а как указатель на void. Так что к исходному вопросу вообще никакого отношения не имеет. Внутреннее представление указателя на void по крайней мере в соответствии со стандартом С соответствует внутреннему представлению указателя на char. Это сделано для того, чтобы можно было использовать такие функции, как, например, memcpy. Очевидно, что указатель на void может адресовать любой байт. Тем не менее это неверно для указателей на int. Добавлено через 50 секунд Я имел в виду, может ли указатель на int иметь значение не кратное размеру int. Добавлено через 13 минут и 39 секунд
То есть если отвечать на этот исходный вопрос, то сделать это, то есть игнорируя арифметику указателей, нельзя. Так как тогда указатель будет содержать некорректное значение. И примером этого является указатель на int. Естественно, что указатель на char ожет адресовать любой байт, но даже он не игнориует арифметику указателей, то есть сдвиг происходи согласно размеру типа ( в данном случае sizeof( char ) ), на данное которого указатель указывает. Более того могут быть и wchar_t типы символов. Конечно, если использовать тип char * , то вопросов никаких нет, так как sizeof( char ) == 1. Но, как я понимаю, автора не этот вопрос мучал, а мучал вопрос, может ли какой-нибудь указатель хранить значение, которое не удовлетворяет правилам арифметики с указателями. В связи с вышесказанным ваш пример со вставкой ассемблера вообще выглядет абсурдной, так как можно просто перевести указатель на int в указатель на char и ему присвоить любое значение! Зачем такие сложности с ассемблером?!!! |
||||
|
|||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
То есть суть исходного вопроса, касающегосу игнорирования арифметики указателей сводится к следующему вопросу: является ли следующий код корректным?
Ответ: не является! Это сообщение отредактировал(а) Сыроежка - 26.6.2011, 19:14 |
|||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
Сыроежка, приведите выдержку из стандарта про выравнивание, раз вы его тут упоминали
|
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
||||
|
||||
volatile |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
а такой код будет корректным ? ![]()
Еесли Нет, приведите пример машины, операционной системы, да хоть чего-нибудь, где этот код работать не будет. (именно этот код с for) Если Да, то как может в целом корректный код состоять из нескольких некорректных операций? |
||||||
|
|||||||
hawk3500 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 246 Регистрация: 6.2.2009 Репутация: нет Всего: 2 |
Сыроежка вот вы говорили:
Изначально вопрос стоял так:
Игнорировать арифметику указателей-означает прежде всего не привязываться к базовым типам. Если у меня есть указатель на тот или иной участок памяти и задача сдвинуть на несколько байт, то я просто прибавлю к к имеющемуся значению в указателе значение равное сумме того что есть + 3. А вот какой тип данных вы будете использовать мне всё равно. С точки зрения программы адресное пространство масива линейно и применение понятия выравнивания не корректно, разве что быть может это учитываеться в каких нибудь древних системах или при низкоуровневом программировании...но мы о нём речи не ведём. Пришлите скрин отладчика(ОС значения не имеет) под которым мя явно увидим что это приведёт к падению системы..... Это сообщение отредактировал(а) hawk3500 - 26.6.2011, 23:31 --------------------
воин dzen'a |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
hawk3500, на некоторых платформах (микроконтроллеры напр.) действительно нельзя обращаться по указателям не выровненным на слово. К PC (Personal Computer), да и вообще к любым машинам на X86 это не отностися, не важно какая система (win*; dos*; *nix).
Сделаю ударение нельзя именно обращаться. Но здесь никто и не обращается Мы только прибавляем число к указателю. ![]() Это сообщение отредактировал(а) volatile - 27.6.2011, 00:06 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
удалил. не к чему это.
Это сообщение отредактировал(а) volatile - 27.6.2011, 01:54 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
>на некоторых платформах (микроконтроллеры напр .) действительно нельзя обращаться по указателям не выровненным на
слово Мало того, на некоторых компиляторах размер char равен размеру short и равен размеру int - AnalogDevice под какой-то свой процессор (161-й по-моему) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Hagrael |
|
||||||||||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Спасибо всем, кто мне ответил!
Данный код некорректен из-за того, что оператор + может связывать переменную типа type* (любой указатель) только с переменной типа int.
А почему некорректен этот код, мне непонятно. Однако, думаю, что прежде следует понять, почему не работает код, приведенный ниже:
Консоль абсолютно чиста, если не считать статуса завершения программы. Из-за чего?
Массив на самом деле ведь указывает на свою первую ячейку. Однако это не просто указатель, а константа-указатель. Следующий код приводит к ошибке " non-lvalue in assignment ":
А следующий - к ошибке " incompatible types in assignment of `int' to `int[10]' ":
Однако я заметил, что обычные константы нельзя копировать в др. переменные без префикса constant, однако массив можно. Т. е. следующий код будет корректным:
А следующий - нет, т. к. нет префикса const перед второй строкой:
Так что же это такое - массив? Это не просто const type* ![]()
Вот что я понял. К переменным всех типов присваиваются их литералы, которые заранее никуда в ОЗУ не копируются. Единственное - исключение может составить указатель, указывающий на строку. Тогда строковый литерал изначально превращается в массив типа char, и когда дело доходит до инициализации нашего указателя, то в него возвращается заранее созданный массив. А под локальные переменные неиспользуемой функции выделяется место? Или оно выделяется под них только при запуске функции? А где хранятся все те литералы, которые посылаются в аргументы? В памяти той функции, из которой вызывается другая функция, принимающая литералы в качестве аргументов? И еще вопрос: .exe-файл на протяжении всей программы хранится в ОЗУ. Но зачем? Разве из него сразу же не вытянули всю информацию? Мне все говорят, что указатель - это переменная, хранящая адрес. Но ведь компьютер не видит этой разницы, так?
Если ты ввел в первый раз менее 4-х символов, то компьютер тебя просит ввести еще одну строку, после чего выводится то, что ты ввел в первый раз и то, что ты ввел во второй раз. Однако если ты введешь 4 символа или более, то тебе не предоставится второй возможности ввести строку, вместо этого на экран выведутся 3 первых буквы из того, что ты ввел в этот единственный раз и на пустота, находящаяся строчкой ниже. Можете объяснить это поведение? Кстати, касательно функции cin.getline: она странно работает - возвращает 3 символа, когда я вторым аргументом послал число 4! Что это такое? И новый вопрос: 7) Что такое "конец слова" и "выравнивание под конец слова"? Заранее благодарю. Это сообщение отредактировал(а) Hagrael - 27.6.2011, 10:21 |
||||||||||||||||||||||
|
|||||||||||||||||||||||
bsa |
|
||||||||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Здесь и далее у тебя уже начинается путаница. "константный указатель" и "указатель на константу" в большинстве случаев значит одно и тоже (хотя, должно значить разное): const type * pointer "указатель-константа" - это уже несколько другое: type * const pointer Разница в следующем: в первом случае ты имеешь право менять УКАЗАТЕЛЬ (например, чтобы он указывал в другое место), но не имеешь права менять элемент, на который он указывает, а во втором ты имеешь право менять элемент, но не сам указатель. Разницу видишь? Массив имеет свой собственный тип - массив (type[n]). Его можно воспринимать, как "указатель-константа". Но в отличие от последнего, sizeof() возвращает не размер указателя, а занимаемое место (в char'ах) массивом.
в коде программы (когда надо вызвать твою функцию, процессор получает команды: запихать 10 в стек, запихать 50 в стек, вызвать подпрограмму по адресу такому-то, ..., откатить стек на <размер аргументов>).
Еще раз рекомендую почитать ответы на часто задаваемые вопросы (тема прикреплена). http://cplusplus.com/reference/iostream/istream/getline/ почитай, когда включается failbit. Кстати, после возникновения ошибки и до ее снятия читать не получится. под "словом" понимается так называемое "машинное слово". Т.е. это данные такого размера, работа с которыми для процессора наименее трудоемка. Наиболее популярны 32 и 64 бита (4 и 8 байт, соответственно). У современных процессоров все узлы оптимизированы на работу с такими словами. Но платой за это является снижение производительности при невыравненном доступе: представь, процессор за 1 такт читает 4 байта с адресов, кратных 4. Чтобы прочитать данные, которые лежат только кратно 2, ему придется прочитать 2 раза по 4 байта, а затем лишние байты выкинуть. А теперь представь, что нужно сделать, чтобы записать: прочитать 4 байта, заменить 2 на новые данные, записать, прочитать еще 4 байта, заменить 2 байта на новые, записать.... Минимум 4 такта вместо 1. Именно поэтому все современные компиляторы умеют делать выравнивание по границе машинного слова. |
||||||||||||||||||||
|
|||||||||||||||||||||
Hagrael |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Спасибо за ответ.
На самом деле код был таким:
Я написал 1/4 для ясности, забыв о том, что если делить один int на другой, то выполнится целочисленное деление ![]()
Т. е. технически этот код правилен, однако вы бы подумали, что его автор не знает, что делает, да?
И правда, я просто не заметил переноса строки. Немного об Endian-ах в Википедии и не до конца понял ![]() Спасибо, понял. Ах вот оно что, значит, массив - это не просто указатель на свою первую ячейку. Он не является константой (т. к. при операции int* p=int_arr; в левой стороне не нужно слово const), однако его нельзя менять. Так? Это понятно, но разве при запуске программы глобальные переменные все функции с их инструкциями не вытаскиваются? Значит, в ОЗУ все стремиться к подобному порядку: 4 байта | 8 байт | 8 байт | ... Но зачем 2 раза читать по 4 байта, а затем лишние байты выкинуть? Вы говорите о таких размерах, как 5-7 байт? Тогда, выходит, это устроено так: 1. Нашел адрес; 2. Считал 8 байт (2 раза по 4 байта); 3. Выкинул 2 байта (т. к. нужно было только 6 байт) А по 8 процессор читать не может, да? Я английский знаю не ахти, но я так понял, дело в том, что failbit - это бит, перед которым получение информации прекращается. Я правильно говорю? Это сообщение отредактировал(а) Hagrael - 27.6.2011, 12:42 |
||||||
|
|||||||
bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
да endianess отвечает лишь за порядок байт в ОЗУ. АЛУ работает независимо. Я же объяснил, чем "указатель на константу" отличается от "указателя-константы". const int *p - указатель на константу. int * const p - указатель-константа. Так вот, массив можно воспринимать как указатель-константу (хотя, на самом деле, делать так не стоит).
может. все зависит от архитектуры процессора и контроллера памяти.
failbit устанавливается при ряде ошибок чтения. В частности, getline устанавливает его, когда размер буфера меньше, чем данных в потоке. Для снятия этого бита нужно использовать метод clear(). |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
согласен на 200%. Удивительно как точно сформулирована мысль. ![]() именно это я и хотел сказать вчера. |
|||
|
||||
Hagrael |
|
||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Простите, что так долго не понимаю...
Вот именно, как я понимаю, на самом деле, это не указатель-константа! Взять даже ошибки, которые высвечиваются в логе после этого кода:
Вот, собственно, ошибки:
Значит, массив-таки имеет свой собственный тип, схожий с указателем. Но почему его, как указатель нельзя переназначить, мне до сих пор, непонятно.
А вы можете сказать примерно, из чего состоит .exe и каким образом с его помощью работает программа (или сказать, что почитать по этому поводу). Я так понимаю, что .exe-файл содержит в себе сборник инструкций, выполняющихся одна за другой. Вот, к примеру, у меня такой код:
После компиляции, насколько я понимаю, в .exe-файле будут следующие инструкции:
И, выходит, что компьютер при запуске файла проверит его расширение, увидит, что это .exe, загрузит в память и начнет следовать инструкциям. А адрес переменным задается строгий, или же при создании переменной, для нее берется свободное место, которое по адресу ближе всех др. свободных мест к нулю? А библиотечные функции пишутся на C++ или Asm? Логичнее было бы писать их на Asm, и я бы не спросил об этом, если бы не увидел директивы #include, включающей файл с расширением .h. И еще один вопрос: Если у каждой программы своя виртуальная память, то почему выдает ошибку такая конструкция:
я же изменяю свою переменную, а не переменную чужой программы. Это сообщение отредактировал(а) Hagrael - 28.6.2011, 10:38 |
||||||||||||||
|
|||||||||||||||
triclosan |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Прикладной программе (не по функциональности, а по типу и правам запуска) ОС указывает какой участок памяти она может занять (строго говоря это может быть где угодно в пользовательской памяти) далее мы уже имеем дело со смещениями т.е. ваши 0xB04566 и 0xB04700 могут меняться от запуска к запуску, но переход от main к func будет - "сдвинуться на 0xB04700-0xB04566".
Большинство функции на Си как раз писаны на Asm, при этом файл .h все равно присутствует - он содержит прототипы функций, но это все вообще-то зависит от реализации. Си++ые же функции (чистых функций в std::* не так уж и много) - главным образом на Си++, причем большинство - шаблонные, поэтому реализация в виде исходного кода. Это сообщение отредактировал(а) triclosan - 28.6.2011, 12:39 |
||||
|
|||||
Сыроежка |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Вы заблуждаетесь! Это не все равно! Языки С и С++ типизированные, и у вас не просто какой-то указатель неизвестного типа, а указатель производного типа от int. Именно для вашего примера в мтандарте сказано, что такое поведение неопределенное. То есть вы можете использовать любые некорректные конструкции, но это к сущности языка не имеет никакого отношения. Теперь приведу выдержку из стандарта по языку С: "6.5.3.2 Address and indirection operators #4 If an invalid value has been assigned to the pointer the behavior of the using * operator is undefined" В комментарии к этому параграфу дается разъяснение, что означает "invalid value" "Among the invalid values for dereferencing a pointer by the using * operator are a null pointer, an address inoppropriatedly aligned for the type of object pointed to, ..." Но и это еще не все. В параграфе 6,3.2.3 №7 сказано: "A pointer of an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the pointed to type, the behavior is undefined" очему возникли такие требования? Дело в том, что на многих млатформах типы данных должны быть соответственно выравнены. Если они не выравнены машинная операция с этими данными приводит к аварийному завершению. Добавлено через 5 минут и 52 секунды
Я вам уже объяснил! Вы очевидно с первого раза не поняли! Что вы собираетесь менять?!!! Назовите мне ту ячейку памяти, которую вы собираетесь изменить! С именем массива не связана никакая ячейка памяти! То есть нет такой ячейки, где хранится адрес массива, и которую вы могли бы изменить! В памяти хранится сам массив, то есть его элементы. А имя массива - это, можно так сказать, виртуальный адрес массива, то есть нигде этот адрес не хранится! Если бы он где-то хранился, то тогда бы вы его могли изменить. Но в этом случае это уже был бы не сам массив, а указатель на массив, то есть отдельная ячейка памяти, которую вы могли бы менять! Добавлено через 9 минут и 19 секунд
123 - это не переменная! Это константа препроцессора, которая в результате компиляции заносится непосредственно в машинную команду, которая инициализирует некоторую переменную. В приведенном ваше примере компилятор никуда не помещает 123, поэтому у этой константы нет адреса! Я вам уже все об этом в своем первом сообщении сказал. Кстати сказать это было единственное грамотное сообщение в ответ на ваш исходный вопрос, а вы его, непонятно почему, проигнорировали! Добавлено через 11 минут и 52 секунды
Я уже привел цитаты из стандарта С в своем сообщении выше, так что можете ознакомиться, почему этот код некорректный. |
||||||||||
|
|||||||||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Прибавление целочисленного числа к укакзателю называется адресной арифметикой. Так что вы не прибавляете число к указателю! Вы переводите значение одного указателя в значение указателя другого типа, его меняете, а затем делаете обратное преобразование значение к типу исходного указателя. На что стандарт, наприсер, языка С говорит:
|
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Надо только упомянуть,что вы привели выдержки из нового draft C0X: стандарта, еще вроде даже не принятого. Не большой знаток С, так что утверждать не буду.
Буду признателен если вы приведете что-то из стандарта С++ (не С), тем более что ТС явно указал язык.
Не понятно почему вы постоянно сбиваетесь на С, да еще и C0X Это сообщение отредактировал(а) volatile - 29.6.2011, 00:50 |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Сыроежка, я не проигнорировал ваш пост
![]()
Как тогда можно охарактеризовать это поведение? Но ведь я не писал &123, а написал (int*) 123, т. е. я хотел, чтобы указатель указывал на адрес 123 (что он, собственно, и делает). |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Т. е. получается, что если объявлен прототип стандартной C++ и не объявлена сама функция (программистом не сказано, что она должна делать), то она подключится из стандартной C++ библиотеки? |
|||
|
||||
triclosan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
Там, где вы меня цитируете я говорю про Си, а вы спрашиваете про Си++, хотя поведения с прототипами и отсутствием реализации в Си и Си++ схожи, если не идентичны. Тем не менее ваш вопрос мне не понятен, проиллюстрируйте пожалуйста. |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Он и указывает. Проблема в том, что в виртуальной памяти (в отличии от физической) могут быть 'дырки', т.е. адреса, по которым никакой памяти нет. Ваш 123 попадает в одну из таких дырок. Попытка обратится туда приводит к эксепшену со стороны ОС
Она будет подключена линкером оттуда, где он сможет ее найти. Если найдется в стандартных библиотеках - будет взята оттуда. Найдется у пользователя в его исходниках - будет взята оттуда. И это касается всех функций в программе, в том числе и явно стандартных. Например, вы можете написать у себя в исходнике memcpy, и по всей программе будет взята ваша функция, а не из libc |
||||
|
|||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Это, то есть то, что я процитировал, уже существует в стандарте 99 языка С. То есть уже давно принято. В С++ тоже самое написано только в другом разделе, то есть что значение указателя должно быть правльно выравнено относительно типа данных, на которые он указывает. Это особенно важно при наследовании классов. Добавлено через 2 минуты и 1 секунду
Потому что при использовании имени массива в выражениях, за исключением некоторых случаев, как, например, использование оператора sizeof, массив преобразуется в указатель на его первый элемент. |
||||
|
|||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Ну коль цитату из стандарта С++ вы привести не смогли, будет разбирать то что есть. ![]() Для полноты картины нужно еще определение понятия "correctly aligned for the pointed to type" Мой приблизительный перевод "корректно выровнен на указываемый тип" Означает ли это тоже самое что "выровнен на границу слова" ? пример
В данном примере указатель (p) корректно выровнен на указываемую переменную a.i типа int. Но он не выровнен не границу слова. Так что это разные вещи. Без определение понятия "correctly aligned for the pointed to type", все дальнейшие ваши заключения ничего не стоят. Так что жду от вас хотябы этого. Это сообщение отредактировал(а) volatile - 29.6.2011, 23:37 |
||||
|
|||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
это не совсем так.. с точки зрения операционной системы (например линукс) каждый процесс получает свое __неразрывное__ виртуальное пространство (для 32 разрядной системы 4Гб).. в тоже время эта память делится на сегменты.. у каждого сегмента есть базовый адрес (начало сегмента) и его длина (либо в байтах, если он не превышает 1Мб, либо в страницах (обычно 4К), если он больше 1Мб), а так же за каждым сегментом закреплен тип (определяющий его назначение: сегмент кода, сегмент данных и т.д.) к тому же, при загрузке программы в память, помимо самой программы, в это же пространство мэпятся и разделяемые библиотеки.. если обратиться к памяти, которая не предназначена для чтения (а например только для исполнения, как сегмент кода), либо в невыделеный сегмент, то это вызовет исключение, которое по дефолту убьет процесс.. PS плюс, вы забыли что вам твердит сыроежка, указатель нужно выравнивать -------------------- undefined |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это именно так с точки зрения архитектуры виртуальной памяти процессора (в данном случае х86) (весьма упрощенно, но тем не менее близко к истине). То, как операционная система использует эту виртуальную память - это уже 2й уровень абстракций. Предлагаю, ради сохранения здравого рассудка ТС, не вдаваться в такие подробности ![]() |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Честно говоря, я вам не нянька, чтобы для вас делать выписки из стандарта. Почему бы вам самому не заглянуть в стандарт вместо того, чтобы фантазировать ? В стандарте С++ говорится тоже самое об выравнивании. Дело в том, что размер типов данных зависит от платформы. Но в любом случае обычно размер типа int выбирается равным размеру машинного слова. Для 32-битовых платформ, которые в настоящее время наиболее распространены, размер типа int равен 4 байтам. На 64-битовых платформах обычно размер типа int солставляет 8 байтогв. Но в любом случае функция malloc возвращает адрес, который выравнен соответствующим образом. Говоря о границе слова, я лишь приводил конкретный пример для 32-битовых машин, чтобы на конкретноми примере пояснить вопрос. Не заню по каким причинам, но то ли вы не поняли, что я говорил, то ли начинаете передергивать, так как попали в лужу со своим начальным комментарием, а теперь пытаетесь как-то выкрутиться! На мой взгляд я все ясно сказал. Вопрос состоял в том, является ли корректным код, когда в указатель заносится значение, не выравненное надлежащим образом для конкретного типа данных. Я ответил, что нет, и привел цитаты из стандарта по крайней мере из стандарта С. Вы же привели в качестве начального примера некорректный код, да еще пыьались утверждать, что это вполне нормально. При этом никаких цитат из стандарта вы лично не привели. Вы только требуется, чтобы вам кто-то что-то приводил в качестве цитат из стандарта.. А почему бы вам самому не почитать стандарт?! |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Цитата из С++ 98 (какой был под руками)
Раздел 3.9 - Types
![]() |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
xvr, да эту фразу из стандарта С++ я видел. И это единственное что там нашел по этому поводу. (ну может не единственное, но такая-же фраза повторяется несколько раз, в разных местах)
А применять стандарт С к С++, не совсем корректно, там более выдержки без определения главной фразы. Что они имели под термином "correctly aligned for the pointed to type"
Кто сел еще надо подумать... ![]() Дальнейщий диспут, в таком тоне считаю бесполезным. Это сообщение отредактировал(а) volatile - 1.7.2011, 00:37 |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Естественно! Зависит от используемой платформы. Ни в С, ни в С++ не гвоорится о размерах данных. Так что тип int может занимать 16 битова на 16-битовых платформах, как, например, в MS-DOS, либо 32 бита, либо 64 бита. Но в любом случае тип int соответсвует машинному слову, то есть соответсвует размеру регистров, которые и выполняют арифметические операции.. В этом и состоит сущность языка С и С++, что они максимально прибижены к платформе. То есть они тиспользуют собственные типы данных, существующие на конкретной платформе. Этим обусловлена эффективность этих языков. И именно поэтому их порой называют языками низкого уровня. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова. (я по крайней мере не нашел, а вы ничего привести не смогли!) А применять стандарт С99 к С++ не совсем корректно. (читай совсем не) С++ если и произошел от С, то никак не от С99 ![]() это 2 разных языка. Добавлено @ 00:15 А выборочные выдержки из стандарта С99, без определения основных терминов, вообще не могут рассматриваться в качестве аргументов в споре Это сообщение отредактировал(а) volatile - 2.7.2011, 03:20 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
здесь речь идет не о размере, а о выравнивании. И о том, что второе совсем не обязательно равно первому. Например классическая х86 система не требует выравнивания (т.е. align должен быть на 1), хотя и приветствует ![]() |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Это вы сами с собой дискусируете?! Я нигде не гворил, что указатель должен быть выравнен на границу слова! Я приводил пример, ято если указатель является производным от типа int, то он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову! |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. То есть чтобы было понятно, на 32 -битовой платформе Intel тип int может равняться 16 битам. Но это соответсвует размеру регистра AX, то есть значению слова на той платформе (в данном случа 16-битовой), для совместимостью с которой создается компилятор. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны.. ![]() |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
xvr |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
[QUOTE=Сыроежка,3.7.2011, 18:20]
Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds ![]() ![]() al.s
![]() |
||||||||||
|
|||||||||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Там все ясно было написано, что значение указателя на тип int дожно быть выравнено на границу слова в соответствии с выравниванием типа int. . |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
У меня такое впечатление, что я имею дело не с адекватным человеком! Я говорил, что значение указателя должны быть выравнено согласно выравниванию типа данных, на которое он указывает. Я несколько раз специально для вас это повторял и в качестве примера приводил указатель на тип int. Во-вторых, совершенно не понятно, какие "определения основных терминово" вам нужны? Любое цитирование стандарта предполагает ссылки на термины стандарта. Так что цитировать стандарт - это всегда корректно. В-третьих, стандарт С++ также требует выравнивание значений указателей в соответствии с выравниванием типов, на которые эти указатели указывают. Джае оставляя в стороне стандарты, а просто руководствуясь обычным здравым смыслом, очевидно, что в С и в С++ должно быть одно и то же выравнивание, так как модули на С и С++ очнь часто собираются в один проект. В противном случае любой проект, состоящий из смешанных модулей, был бы некорректным! |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Сыроежка |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Вы очевидно относиетсь к тем программистам, опыт которых ограничен лишь работой на одной платформе, и которые начинают свято верить, что других аппаратных архитектур и операционных систем в природе просто не существует! ![]() Я вам на самом деле уже все указал, просто вы не внимательно читаете, что вам другие пишут! Есть такие вычислительные машины, как IBM mainframe. В настоящее время это серия Z, а операционная система соответственно называется z/OS. Так на этой платформе обращение к памяти, не выравненное соответсвующим образом приводит к аварийному завершению программы. Например, если вы в ассемблере для IBM, который называется HLASM ( от слов High Level Assembler ), зададите директиву
то память будет выравнена на границу слова. Если у вас есть знакомые, которые имеют дело с IBM mainframe, то вы можете у них проконсультироваться. У меня есть документация по IBM mainframe, включая "Руководство по операциям", а также руководства по ассемблеру HLASM, которая лежит где-то упакованная. Как я найду ее, то сомгу вам привести непосредственно выдержки из документации. А пока ограничусь цитатой из старой книги автора У.Радд "Программирование на языке ассемблера на вычислительной системе IBM 360 и 370": "Это предложение (смотри выше -мое прим.) запрашивает резервирование трех полных слов ( 3F) и присваивает имени WORDS адрес первого из зарезервированных 12 байтов. Поскольку выделение памяти мы запросили полными словами будет произведено выравнивание по границе полного слова, т.е. в качестве адреса WORDS будет выбрано значение кратное 4." (стр. 135). Когда на С или С++ объявляется статическая переменная типа int, то как раз генерируется директива ассемблера DS F. То есть на всех компиляторах, а не только IBM mainframe, для целых чисел выбирается размер машинного слова, соответсвующий размеру регистра. Почему это сделано? Да потому что арифметическим операциям поставлены в соответсвии машинные команды для выполнения арифметических операций над регистрами. Если бы не было такого соответсвия, то пришлось бы с помощью других команд моделироваться эти простейшие арифметические операции, что сразу же делало С и С++ неэффективными языками. Когда вы сами удостоверитесь в том, что я написал, с помощью своих более опытных щнакомых, или справитесь по этому вопросу в интернет, то попробуйте поставить себя на место разработчиков стандарта языков С и С++. Правильный код, написанный на С/С++, должен быть переносим, не так ли? То есть поведение программы должно быть определенным. Теперь представьте ситуацию, что ваш "правильный" код на одной платформе работает, а на другой платформе аварийно завершается. И что тогда делать с переносимостью языка?! Она рассыпается как карточный домик! Значит надо принимать такое решение в стандарте, чтобы исключить такую ситуцию, чтобы действительно правильный окд, который удовлетворяет стандарту, мог работать на любой платформе! Я вам приведу другой пример узости мышление подобного вашему. Он симметричен данной дискуссии, но только тогда оппонентом у меня выступал программист, работающий на IBM mainframe. ОН в стандартную строковую функцию передавал нулевой указатель. Когда я ему заявил, что так делать нельзя, и такое поведение программы неопределенное, он мне в ответ точно стал возражать походим образом, как это делаете вы. Он мне заявил, что программа нормально работает, так как IBM mainframe позволяет читать память по нулевым адресам. Убедить его было бесполезно, пока я его не подвел к Intel платформе, на которой вы работаете, и не показал, что программа завершается аварийно при попытке чтения в Windows памяти по нулевым адресам. Так что смотрите на вещи ширше! ![]() ![]() Добавлено через 3 минуты и 41 секунду
Это вы хотите, чтобы я признал ваш бред в виде вашего кода
который совершенно не соответсвтует стандартам С и С++?!! Вы уж лучше учите С/С++! Это вам пойдет на пользу! |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
слишком жестко.. имхо, точнее было бы : который по стандарту является зависим от реализации/платформы.. |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
![]() Михаил Жванецкий в таких случаях отвечает: - Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти... ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
xvr |
|
||||||||||||||||||||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Далеко не на одной, вынужден вас огорчить ![]()
![]()
![]()
Когда на С или С++ объявляется статическая переменная типа int, то как раз генерируется директива ассемблера DS F. [/quote]gcc предпримет явные действия по выравниванию, а не будет полагаться на ассемблер
результат после g++ (ассемблер)
![]()
Это ваши домыслы. Стандарт этого не требует. Если вам нужен 100% переносимый код - пишите на Java, хотя и там 100% не получается ![]()
Не записывайте себя во 'весь мир'.
![]() PS. И не надо со мной спорить, просто поверьте человеку, который принимал участие в написании как минимум 2х коммерческих компиляторов. ![]() |
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Вынесете ересь! Почитайте в стандарте определение программы, строго соответсвтующей стандарту, и должна ли она выполняться на любой платформе. Вы даже этого определения из стандарта не знаете, а пытаетесь о чем-то рассуждать. Если следовать вашей логике, то стандарт вообще никакого смысла не имеет, так как есть различные платформы, которые. как говорится, что хотят, то и творят.
Это не мои домыфслы, а это ваше полное не знание стандарта языков программирования С и С++! Вы даже не знаете, как я уже написал выше, определение строгогго соответсвия программы стандарту! У вас не только IBM под рукой нет, нол ук вас и знаний С и С++ нет, но тем не менее вы свое невежество пытаетесь поставить выше стандарта. И потом, я вам уже ясно сказал, что если на одной платформе обращение к памяти, не выравненной по границе типа данного заканчивается аварийно, а на друцгой нет, то это никак не связан, как вы наивно думаете, с платформами, а это связано с тем, что 1) код некорректный; 2) вы совершенно не знаете С и С++. И это никак не свуязано с особенностями платформ, как вы наивно думаете! Иначе бы просто С, как языка, не существаовало. Не догадываетесь, почему? Попробутй догадаться с трех раз! Не догадались? Я вам подскажу: тогда бы поведение программ было совершенно не предсказуемыма! Однако, как вам это не покажется странным, это на самом деле не так! Я для IBM mainframe писал программы на Visual C++, так как у меня под рукой тоже не было IBM mainframe. И тем не менее код, написанный на Visual C++ без единой ошибке исполнялся на IBM mainframe, когда я его пересылал по электронной почте. Извините, но далее ваш бред мне просто не интересно читать! |
||||
|
|||||
xvr |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Ссылку из стандарта - на бочку!
Это уже наглость, причем безмерная.
Мое терпение закончилось. Или вы предоставляете ссылки на пункты стандарта, о которых вы тут говорите, или получаете от меня предупреждение за наезды и клевету.
Это уже 100% бред. Причем ничем не подкрепленный, кроме ваших слов, которым уже веры нет. |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Сыроежка, чтоб долго не спорить, выделю главнoе : стандарт не определяет значений, а лишь определяет требования/правила.. так если по стандарту данные должны быть выровнены, то на сколько определяет платформа.. т.е. на платформе с выравниваением для int равным 1, код из первых постов, который у Вас вызывает отвращение, вполне корректный.. А чтоб он не был ill-formed на других платформах, можно добавить ограничения.. например зa'ifdef`ить ..
![]() если ж, конечно, таковое требуется, так как есть множество кода, который по инным причинам не может быть "воспроизведен" на других платформах.. Вы можете опровергнуть, если приведете выдержку из стандарта, показывающую, что выравнивание (пусть для int) не может быть равно 1. ![]() ![]() Это сообщение отредактировал(а) mes - 8.7.2011, 08:38 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
такая программа соответствует стандарту ?
а ведь она даже не будет компилироваться на платформе, где нет windows, однако на windows-платформе - абсолютно корректная и выполняющая все требования стандарта... нет ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Мы тут все были потрясены опросом, устроенным нашим 'Гуру от Стандарта', где он потребовал от нас сокровенных знаний о существовании знакового чара и умопомрачительных тонкостей взаимодействия автоматического приведения типов и, страшно сказать, integer promotion. Я лично до сих пор бьюсь в истерике, от того, что не смог справится с этим невообразимо сложным заданием
![]() ![]() Что бы хоть как то загладить свою вину, я специально набросал небольшой квест. Я думаю, что для такого знатока стандарта, как Сыроежка, он будет не более, чем легкой разминкой перед завтраком. Квест тут ![]() Если уважаемый Учитель Сыроежка справится с этим квестом, я торжественно клянусь ![]() ![]() А если не справится, то придется лишить Сыроежку звания Гуру и Учителя и забанить за необоснованные наезды на участников, и за выдачу своего личного мнения (причем ошибочного) за стандарт С++ ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ммм.. достаточно просто ответить на вопросы или аргументироватьцитатами из стандарта.. ? что то мне подсказывает, что квест Вы выбрали достаточно простой... |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
я вас сильно разочарую: сыроежка больше не появится
![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
обычно так и бывает... ну не знаю почему...самомнение зашкаливает при провоцировании ситуации, и не позволяет признать что-то когда приходит время отвечать за слова... |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
А причем здесь С или С++? Вы вообще=то сами понимаете, что пишите? Вы обращаетесь к службам операционной системы. Ни С, ни С++ никакой ответсвенности за использование системно-зависимых вызовов ответсвенность не несет! Ни в С, ни в С++ не определяются такие функции! Так что ваш пример крайне глупый! |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Мне надоело толочь в ступе одно и тоже, с теми, кто совершенно не разбирается в С/С++, и тем более в Java, на который здесь пытаются ссылаться.
Поэтому сделаю заключительное пояснение. Язык С/С++ совместим на разых платформах и переносим! То есть поведение С/С++ предсказуемо и определено согласно абстрактной вычислительной машины, описанной в стандарте. То есть если вы не используете в программе системо-зависимых средств, то никаких проблем у вас не будет. Несовместим не язык, как тут по недопониманию заявляют некоторые, а несовместимы платформы между собой! А это совершенно разные вещи. Например, на одной платформе размер целого числа может составлять 16 бит, на другой 32-бита, на третьей 64 бита, и т.д. Язык Java ни тем не лучше С/С++ в лане переносимости. То есть язык Java не имеет отношение к переносимости. Что на самом деле сделали разработчики Java? Они создали абстрактную виртуальную платформу! А уж затем поверх этой абстрактной виртуальной платформы наклеили Java. Точно с таким же успехом поверх этой виртуальной абстрактной платформы можно наклеить любой язык,как, например, Бейсик, Паскаль и тот же самый С/С++. Так что ссылаться на язык Java и говорить о какой-то переносимости языка - это некорректно! Здесь роль играет не сам язык, а та абстрактная виртуальная платформа, поверх которой язык реализуется. Кто-нибудь задумывался, почему поверх этой абстрактной виртуальной платформы поместили некий новый язык под названием Java, а не тот же самый С или С++? Дело в том, что назначение С/С++ вполне конкретное, и этот (эти) языки занимают свою нишу, которую никто другой занять не может. Язык С - это по сути дела универсальный ассемблер для любой платформы с мнемоникой более высокогот уровня, чем у ассемблеров конкретной платформы. Именно это роль С играет. Его синтаксис очень спартанский, он эффективный, порой его объектный код ничем не уступает аналогичному коду, написанному на ассемблере. В этом и состот миссия этого языка. Поэтому, например, Страуструп очень строго следит, чтобы нововведения в язык С++ не делали его менее эффективным, чем язык С. Многие предложения по стандартизации языка С++ были отклонены Страустропом, именно исходя из ссображений, что эти предложения снижали эффективность языка. Поэтому язык С/С++ приближен к особенностям различных платформ, то есть он позволяет различным платформам "внедряться" в язык С/С++. Что имеется в виду? Главное, это то, что языки С/С++ оставляют открытым вопрос о размере целочисленных типов. Единственное, что четко прописано, это то, что типы char(s) должны занимать один байт. Но при этом даже байт не обязан состоять из 8 битов, а может состоять из 9 битов. Для представлянеия в памяти целых чисел могут использоваться различные форматы, а не только дополнение до 2. Может быть и дополнение до 1, и другой формат, когда представления отрицательных и положительных сичел отличается лишь битовым знаком. Более тогог, представления целых чисел может содержать пустоты! То есть язык С/С++ оставляет открытыми двери для особеностей той или иной платформы. Но тем не менее семантика языка, его требования к поведению кода четко прописаны. И с этой точки зрения, если ваш код не опирается на системно-зависящие вещи, полностью переносим. А иначе и быть просто не может! В противном случае мы имели бы столько языков С, сколько существует платформ, и каждый язык имел бы свой синтаксис и свою семантику. Я не спроста приводил пример, что я на Visual C++ писал код для IBM mainftame, и этот код без каких-дибо изменений выполнялся так, как и предполагалось, когда он писался на Visual C++. Почему? Потому что, во-первых, и там, и там была 32-битовая система, и код не использовал каких-то системно-зависимых вызовов. С/С++ предполагают, что целые числа выравнены в соответсвии с кратностью их размеров. Почему это не прописано? Да просто потому, что стандарт не определяет размеры целых чисел. Он лишь определяет их ранги относительно друг друга. Кроме того сами стандарты несовершенно и постоянно редактируются. Так что это обычное дело для стандарта, если что-то четко не прописано. ВЫ можете послать свои предложенияч по уточнению стандарта в комитет по стандартизации. |
|||
|
||||
xvr |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Мания величия в очень запущенной форме. Пациенту рекомендуется бан на форуме, пока не остынет ![]()
Угу, 'абстрактный конь в вакууме' ![]()
Вы не думали в политику пойти? Или в журналисты? Так перевернуть все с ног на голову - это надо иметь талант ![]()
Спасибо, о Великий Гуру! Как же мы раньше жили без столь великого знания!
Видимо не будет ![]()
![]() Демагог наш великий. Вы очень изящно заменяете задаваемые вам вопросы на другие, на которые и отвечаете (абсолютно правильно и последовательно, хотя и нафиг никому не нужно). Выдаете свое (порой ошибочное) мнение за стандарт, с формулировкой "Я ТАК СКАЗАЛ! Не нравится - ищите в стандарте сами". Любых несогласных с вами объявляете неучами, и отправляете учить стандарт ![]() Когда вас ткнут носом (с примерами и ссылками на тот самый стандарт) в неувязки в вашей демагогии, вы объявляете виноватыми в узости мышления, незнании стандарта и прочих смертных грехах того, кто вас ткнул. Я все еще жду от вас ссылки на стандарт, и ответов на квест в соседней теме, который я создал СПЕЦИАЛЬНО ДЛЯ ВАС! Иначе я считаю вас троллем с всеми вытекающими последствиями |
||||||||||||
|
|||||||||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а если использую - будут? очень интересно для чего тогда создаются расширения языка, intrinsic-и, поддержка inline assembler-а, платформозависимые библиотеки? Это все создается затем, чтобы у нас были проблемы? Стандарт - как бы ты его не любил, это не пуп земли и вокруг него мир программиста C++ не вертится. Стандарт многое оставляет на усмотрение компилятора и основываясь на гарантиях конкретного компилятора я могу писать платформозависимый код на C++ и мне откровенно говорю до уличного осветительного прибора чье либо одобрение. Писать платформозависимый код там, где не нужна переносимость - это вполне нормально. |
|||
|
||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
при этом платформазависиммые не только внешние вызовы, но размеры типовов, а также их представление.. да если не на что зависимое код не опирается, он конечно же переносим.. но встает вопрос, в чем тогда преимущество этого языка ?
Вы подменяете понятия, вводя всех и себя в том числе в заблуждения.. т.е. Вы счиатаете что если у языка семантика одна и та же на разных платформах, то корректная программа (по стандарту) будет выдавать абсолютно один и тот же результат ?
так кто то пару постов назад призывал думать широко..и что же ?! сами наступили на те же грабли ?! есть платформы на которых писать на (классическом) си не получится ![]()
Размер не определяет, а выравнивание определил ?! хотя нет уже вы смягчили слово, теперь он "предполагает".. хотя вот откуда кратность взялась ?! а так Вы частично правы.. да стандарт опреляет и размер типов и их выравнивание.. только это уже другой стандарт.. ![]() |
||||||||
|
|||||||||
Сыроежка |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
У меня такое впечатление, что вам очень тяжело связать вместе пару фраз! Вы спрашиваете, в чем преимущество С? Я вам ответил, что он играет роль универсального языка ассемблера высокого уровня для любой платформы. А вы, как говорится, смотрите в книгу и видите фигу. Цитата(Сыроежка @ 8.7.2011, 17:45 ) C/С++ предполагают,что целые числа выравнены в соответсвии с кратностью их размеров[/B] . Почему это не прописано? Да просто потому, что стандарт не определяет размеры целых чисел. Размер не определяет, а выравнивание определил ?! хотя нет уже вы смягчили слово, теперь он "предполагает".. хотя вот откуда кратность взялась ?! Да, размер не определяется, а выравнивание определяется. В стандарте С даже спциально есть определение понятия выравнивания. Не догадываетесь, для чего это нужно? А все очень просто. Это нужно для арифметики с указателями. Только и всего. Добавлено через 9 минут и 49 секунд
Да, если вы используете ассемблер, то очевидно, что ассемблер на разных платформах разных. Так что странные у вас взгляды. Стандарта - это как раз "пуп земли"! Потому что если язык не удовлетворяет стандарту, то значит вы говорите о чем-то другом, но не о языке С или С++. То есть ваши фантазии по поводу языка к самому языку никакого отношения не имеют. Более того как раз требование к кмопилятору, чтобы он имаксимально удовлетворял стандарту, является основным тербованием к компиляторам у профессионалов. Иначе ваш код просто будет мало того, что не переносим, а вообще его поведение будет непредсказуемым. Поэтому всякое отклонение от стандарта вы используете, кк говорится, на свой страх и риск. Но страшнее всего то, что порой такие ощиьки, связанные с отклонением о стандарта при переходе с одного компилятора на другой или с одной платформы на другую, порой трудно найти. И тогда поведение программы становится таким, как будто бы на нее влияет погода за окном: сегодня программа работает так, как ожидалось, а завтра совсем по другому. И, как я отметил, такие ошибки очень трудно натйи. Просто вы, очевидно, не работали в крупных проектах, в которых число модулей, включая заголовочные файлы, превосходит 500. Вот тгогда бы я посмотрле бы, как бы вы искали ощибку, связанную с тем, что где-то в коде вы использовали конструкции, не соответсвутющие стандарту. Это только дял дилетантов, которые не понимают серьезность проблемы, станларт не является пупом земли. А фирмы, разработчики программного обеспечения, а также фирмы, занимающиеся разработкой компиляторв, поголовно состоят в комитетах по стандартизации. Потому что они понимают серьезность проблемы. |
||||||
|
|||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Сыроежка, пример.
приходит пакет данных, с заголовком:
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Мне легко, я пытался , чтоб Вы осознали Ваши тупики без моей подсказки .. Чтоб не распыляться, так как Вы все время избегаете целевых вопросов, уделяя внимания оффтопику, еще раз уточню: где в стандарте сказанно, что выравнивание не может быть равно 1 ? как стандартными средствами узнать выравнивание для нужного типа ? почему если выравнивание на платформе 1, нельзя использовать код из первых постов.. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Любой ? И iOS (на чём у них там - на процессоре Samsung кажется), Android, Windows Phone 7 ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
alexvs11 |
|
|||
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
bsa,
так же проблем не должно возникнуть? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
Ну вот, только отлучился -- и пропустил такой знатный ср обсуждение.
Сыроежка, не стоит считать всех глупее себя, ошибаются все. У тебя есть похвальное стремление писать программы по стандарту -- это отлично, но реальная жизнь стандартом не ограничиваются. Разработчики компиляторов, предоставляя сотни расширений, делают это не от нечего делать. Всего лишь один пример -- синтаксис текущий стандарта никак не может не повлиять на видимость символов разделяемой библиотеки. Признай свою ошибку, и двигайся дальше. Хочется особо отметить не так давно пришедшего volatile -- так держать. |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
![]() -------------------- undefined |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
М. Жванецкий. XX Век (выдержка) |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Да уж
![]() Сыроежка Оставляешь впечатление человека, который вообще нихрена на C++ серьезнее чем Hello World не писал. Это сообщение отредактировал(а) azesmcar - 11.7.2011, 09:31 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
должно, если я пользуюсь не GCC или совместимым компилятором. И вообще, твой код нестандартен. А надо сделать стандартно. |
|||
|
||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
И что из того, что разработчики делают сотни расширений?! Разве это оправдание того, что вы сами грубо нарушаете стандарт?! Не вижу абсолютно никакой логики в вашем высказывании. Есать лишь у вас желание любой ценой оправдать свое незнание стандарта. Только и всего. Тут вообще со стороны смешно выглядет ваше поведение в дискуссии. Вы с пеной у рта пытаетесь оправдать ничем не обоснованное грубое нарушение стандарта. И ради чего? Только ради того, чтобы не признавать свое незнание стандарта. ![]() Добавлено @ 15:38
Пакеты данных, очевидно, передаются по среде передачи упакованными. И их формат и выравнивание данных очень часто не соответствуют требованиям языков С/С++. Как это грамотно описать? Обычно проимзводят базировние этого пакет по указателю char *, а затем делают необходимые преобразования и переписывают данные в подготовленную структуру. Очень часто для этих целей используется стандартная функция memcpy для выполнения копирования данных из пакета в переменные программы определенного типа. Тут также стоит отметить, что в пакете целочисленные данные могут быть представлены в формате как big indian, в то время как на вашей платформе они представляются в виде little indian. То есть обычно в любом случае требуется преобразование. Это сообщение отредактировал(а) Сыроежка - 13.7.2011, 15:40 |
||||
|
|||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
мне кажется Вы увлеклись рассматриванием отражения в экране.. ![]()
позвольте узнать корректный аналог вышеприведенного кода.. научите, что там вместо +1 надо было написать.. ![]() |
||||||
|
|||||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Очевидно, что до вас с первого раза не доходит. У данного некорректного кода есть лишь один аналог - это отсутствие этого некорректного кода. Надеюсь, еще через одну неделю вы не будете снова задавать этот вопрос. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
т.е. прибавлять к указателю значение нельзя ? а если можно то какое ? Добавлено через 43 секунды естественно спрашивается в контексте все того же вышеприведенного примера.. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Встречайте цирк с конями, на форуме наконец-то появился настоящий специалист! Старый Shaggie, как всегда, проморгал все важные события. Спасибо товарищам форумчанам, подсказали куда поглядывать.
Сыроежка, считать идеальным измученный годами, изменяющимися парадигмами, конкурентами, новыми веяниями и обратными совместимостями стандарт переусложнённого языка программирования - это просто верх садомазохизма! Впрочем, его в треде оказалось предостаточно... |
|||
|
||||
Сыроежка |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Увы, приходиться уже в десятый раз повторять, что этот код некорректный, если значение указателя не выравнено по границе типа int. А Денич Ритчи заявляет еще более строго, что для этого типа должно быть выравнивание по границе слова. Вы хотя бы прочитали книгу Дениса Ритчи "Программирование на С" в разделе, называющемся примерно следующим образом "связь между указателями и целыми числами", если вы стандарт не читаете. Добавлено через 3 минуты и 5 секунд
У меня такое ощущение, что вы, как и многие из здесь присутствующих, совершенно не адекватны, и приписываете мне то, что я не говорил. Я лишь сказал, что такой код, который здесь мусолят, некорректный и может привести к аварийному завершению программы на некоторых платформах. Он не удовлетворяет стандарту, не является, как говорится, implementation defined, а потому его поведение не предсказуемо. То есть это совершенно безграмотный код. |
||||
|
|||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Shaggie |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
А то как же! ![]() ![]()
Обычно программисты не пишут некорректный код, который "может привести к аварийному завершению программы на некоторых платформах". Просто потому, что такой код сложен в чтении и чреват ошибками в дальнейшем. То есть попросту не нужен. Полезно уметь ценить своё время и время своих коллег. Однако мы не живём в идеальном сферическом вакуумном мире. Мы инженеры. Наша работа, работа профессионалов своего дела, - решать проблемы заказчика. Всё! Часто в условиях ограниченных ресурсов (времени, памяти, нервов). Хороший код - это такой код, который решает задачи 1) текущей работоспособности, 2) дальнейшей поддержки. Задачи бывают разные. Коллеги меня поймут, embedded программисты поймут в особенности. Дано: слабенький процессор, мизер памяти, приходится силой отвоёвывать каждый байт и каждый такт. В таких условиях код volatile
бьёт дуплетом - он 1) работоспособен, 2) поддерживаем (за счёт комментария. И хотя он очень низкоуровнев и не даёт описания проблемы, из-за которой пришлось применить данный хак, при этом даже в текущем виде заметно облегчает чтение кода). Использование подобного кода в мейнстримной разработке бессмысленно и вредно. Опытные товарищи, заметив "хакерский" код и не получив внятного оправдания его использования, применяют карательные меры со всей надлежащей суровостью. Краткие выводы по первым двум страницам темы: 1) такого рода код писать можно и в отдельных случаях он работает, 2) стандарт грозит пальчиком, 3) программисты всё это знают, сами так не пишут и других на это не одобряют, 4) но в случае необходимости трюки работают и помогают решить проблему. Краткие выводы по остальным страницам: 1) хамов никто не любит. |
||||||
|
|||||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Сыроежка, я тут подумал-подумал, а ведь получается, что Вы правы!
Я не понимаю этих людей, которые говорят о каком-то сферическом вакууме... Давайте рассмотрим абсолютно реалистичную ситуацию (это я не только к Вам, а ко всем). Дано (это предположение, все совпадения - случайны): 1. Допустим, в мессенджере QIP есть плагин для протокола ICQ, требующий реализацию в dll-ке такой ф-ции
Причём объявлена она без extern "C", и, соответственно, декорирована, т.е. изменить её интерфейс мы не можем. 2. В 0-м и в 42-м int'е протокола ICQ лежат требуемые для плагина данные. 3. Ваша и моя фирма делают реализацию такого плагина. Выглядят наши плагины абсолютно одинакого (во всяком случае в начале)
4. Но настаёт момент, когда ICQ меняет протокол (что скажете - сферический вакуум?), и теперь перед данными, которые шли и раньше добавляется один байт (допустим тип сообщения). На ICQ ни я ни Вы влиять не можем. На QIP тоже. Что делаю я ? Переписываю плагин:
Выводы (промежуточные): Что в активе у меня ? - мой плагин работает с новой версией протокола - я продал 1 млн. плагинов за 99 коп. за штуку Что у меня в пассиве ? - я написал некорректный код - я нарушил стандарт - меня неодобрят в W3C - мой код не будет работать на IBM mainframe и PIC-контроллерах - я не стал миллионером (99 коп. же) Что в активе у Вас ? - Вы не поступились принципами - Ваш код написан в полном соответствии со стандартом - Вы чисты перед W3C - Ваш плагин не будет падать на IBM mainframe и PIC-контроллерах Что в пассиве у Вас ? - Вас уволили Итого (актив:пассив) - у меня 2:5, у Вас 4:1 Выводы (окончательные): Вы абсолютно правы. Не слушайте этих неадекватных людей. Так держать!!! -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну тогда вопрос на засыпку, a что будете делать если надо, чтоб код также работал и на вышеперечисленных платформах ? ![]()
![]() Это сообщение отредактировал(а) mes - 15.7.2011, 08:47 |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
ещё раз перепишу плагин QIP'а для протокола ICQ для IBM mainframe и PIC-контроллеров:
IMHO замечательно получилось ![]() Это сообщение отредактировал(а) borisbn - 15.7.2011, 09:30 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Представьте себе - мне надо написать программу управления для стиральной машины (для блока управления стиральной машины). Я вооружился стандартами, поднатужился, и выдал на гора совершенство. Оно соответствует всем пунктам стандарта, в нем нет ни строчки кода, о которой стандарт говорит implementation dependent (не говоря уже о более крепких выражениях). Оно использует только стандартные С и Posix библиотеки, и вообще оно полностью соответствует тому самому 'сферическому коню в вакууме'.
Вопрос - если я откомпилю и запущу мою программу на PC, она превратится в стиральную машину? ![]() ![]() Добавлено через 10 минут и 10 секунд Кстати, вот замечательное описание стиля спора Сыроежки:
М. Жванецкий |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
вот чёрт. Видел же замечание, залез в первую попавшуюся доку, увидел
и всё равно лажанул :( исправил. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
однако.. ![]() мы за ценой не постоим © |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
операция по чтению невыровненных данных легко выносится в функцию, и весь этот копипаст уйдет по добру и здорову ![]() Это сообщение отредактировал(а) mes - 15.7.2011, 09:38 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
доволен. ето консорциум Добавлено через 1 минуту и 21 секунду ![]() Добавлено через 2 минуты и 39 секунд а таки согласитесь, Сыроежка внес свежую струю (поручик, молчать!) в С++-сные разделы |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
я просто соптимизировал за компилятор, чтоб не делать лишних push/call/pop. Шутю, ессно ![]() Добавлено через 3 минуты и 23 секунды тем более я не знаю, что там за компилер в IBM и в PIC ![]() Добавлено через 8 минут и 36 секунд и вообще, я в интернет кафе сижу, и уменя деньги заканчиваются, так что мне некогда думать об оптимальности кода © самизнаетекто ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Извините, но я совершенно ничего не понял. Почему вы решили, что если вы написали плохой код, темп более который падает на многих платформах, то вы продали миллион плагинов, а тот, кто написал корректный код, да который к тому же не падает на многих платформах, ничего не продал?! Знаете, я знаю многгих торгашей, которые быстро продают испорченный товар. Но, как правило, их судьба заканчивается в отделении милиции открытием уголовного дела. Да и потребители могут замучить и затаскать вас по судам, требуя качественный продукт в соответсвии с Законом о потребителях. Я не знаю, почему вы так наивно верите в сказки, что если вы делаете некачественный продукт, то вы процветаете? Я не вижу никаких логических обоснований этому вашему верованию. Чтобы вам была понятно ситуция, то приведу жизненный пример, а не ваши фантазии. Как-то я посетил ресторан, в котолром мне довольно быстро подсунули не то вино, которое я заказал, а какой-то дешевый суррогат, но по цене того вина, что я заказал. Знаете, каков результат? Я перестал посещать этот ресторан. А еще через полгода этот ресторан закрылся, так как рядом открылся ресторан конкурентов, где клиентам давали именно то, что они заказывали. Как вам эта моя история?! ![]() |
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
![]() с софтом немного сложнее определить что это не то что заказывалось, думаю главное чтоб программный продукт выполнял то что от него требуется, а как там внутри все написано пользователя не должно волновать. Если заказчик скажет что этот продукт должен работать на таких-то процессорах и таких-то система - это уже другое дело, но если этого не было то программер в праве писать как ему заблагорассудится. |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Просто случайно наткнулся,
Отрывок из "C:\Program Files\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlstdthunk.h" Библиотека ATL от мелкомягких.
Для тех кто не в теме виндов,
Сыроежка, вам нужно срочно писать Биллу Гейтсу, чтоб он закрывал свой ресторан. ![]() Подайте на него в суд! |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
![]() ![]() Стиву Балмеру ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Хорошо, пусть Стиву Балмеру.
Начать письмо следует так: Сыроежка to Steven Ballmer
Как они посмели в библиотеке, которая кстати обязана компилится на любом компиляторе С++ под win, писать такой совершенно безграмотный & implementation defined код? Пусть Сыроежка научит этого безграмотного Стива Балмера, как нужно писать программы. хотя, честно говоря, даже меня несколько коробит от такого кода. А ведь ничо, работает! ![]() |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Specially for РазорителяМестныхКафешек.
Для особо одарённых: - делать зубочистки из красного дерева - бессмысленно - делать туалетную бумагу 150мг/см - идиотизм - давать первокласснику с собой в школу iPhone - глупо - писать плагин в QIP для ICQ с тем, чтобы он работал на Cray, IBM Blue Gene и на стиральной машине - верх безумства -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Теперь понял! Вы делаете зубочистки, туалетную бумагу и т.д. У меня только вопрос, а что вы делаете на форуме программистов?! |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Я б с удовольствием занялся бы этим и т.д., но это место уже занято оч.уважаемым мною человеком - Стивом. Я так понял, что Вам доставляет удовольствие ругань, поэтому не буду его Вам доставлять. No comments. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
iPhone - Стив... ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
borisbn, это типа тот кто сейчас яблокофоны архитектирует? я правильно понял? это отдельный вопрос.
а уважаешь-то за что? Добавлено @ 23:11 за то что айфон красивый? Это сообщение отредактировал(а) boostcoder - 16.7.2011, 23:12 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
boostcoder,
![]() Прикалываешься чоле ? Про Стива Джобса не слышал ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
я не пытаюсь принизить его уважаемость. просто хочу понять.
это чтоб меня камнями не закидали за сомнение в его уважаемости. Добавлено @ 23:19 ни разу. имя слышал. но не знаю кто это. пока ты искал подвох в моем вопросе, нарыл это: Стив Джобс. Добавлено @ 23:21 мое личное мнение: мне, конкретно его, уважать не за что. ну ничего он для меня полезного не сделал. скажу даже больше....почти уверен в том, что пока он изобретал айфон, в африке умерли тысячи детишек, банально от голода. и чем он им помог? - айфонами накормил? в добавок, я противник коммерческого ПО. но это ИМХО, учтите. Добавлено @ 23:22 ой холиварная это тема..завязываю. Это сообщение отредактировал(а) boostcoder - 16.7.2011, 23:22 |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Походу этот сумасшедший не только здесь людям мозги компостирует тынц. Какие однако тролли нынче пошли подкованные! Там вроде пока еще даже не раскусили, что это фальшивка
![]() |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
сыроежка - это олицетворение стандарта.. ему кажется, что стандарт это он..
кстати, там он сказал, что больше не готов дискутировать, так что скоро он вернется.. ![]() -------------------- undefined |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я очень сильно сомневаюсь, что Стив Джоббс стал бы уважать вас самого! Но тем не менее вам самому уважать кого угодно не возброняется. Проблема лишь в том, что к сожалению сам Стив Джоббс не знает о том, что вы его уважаете. А то несомненно он бы обрадовался! ![]() Это сообщение отредактировал(а) Сыроежка - 17.7.2011, 19:26 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
yyyyyyyyyyyyyeeeeees! Мне разрешили!!! Съели!!! Кто ещё может похвастаться высшим соизволением?
специально для необразованных ламеров - Вас пишется с большой буквы. Для дебилов повторяю - Вас - с большой. Вас - с большой. Дошло ? К сообществу vingrad'а - сорри, что сорвался, но достал. Реально достал -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
triclosan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
borisbn, раздел о С++ не место для политических дискуссий
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
triclosan,
> сорри, что сорвался, но достал. Реально достал ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Сыроежка |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Я бы попросил модератора форума обратить внимание на данного грубияна, который, во-первых, разводит флуд, во-вторых. просто переходит на оскорбления, то есть его сообщение состоит лишь из одних оскорблений |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |