Модераторы: bsa

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Микс, Разные простые вопросы 
V
    Опции темы
Hagrael
  Дата 26.6.2011, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Здравствуйте, уважаемые форумчане. Я не так давно начал учить C++ и засел на некоторых вопросах:
1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)
    Реально ли сдвинуть на несколько бит?
2) Почему массив сделали константой? И почему вообще стоит использовать константы?
3) Касательно констант, в следующем коде:
Код
int a;
a=10;

под 10 тоже выделяется отдельное место? А в этом:
Код
int a=10;

4) Если говорить "на языке компьютера", то операция &a возвращает указатель, а не адрес? Ведь эта операция возвращает тип type*, присущий указателям. А адрес - это число (типа int) по моему мнению.
5) Каков порядок инициализации массива в следующем коде:
Код
char a[]="Hello";

Строка компилятором заменяется на указатель на  массив типа char. Значит, инициализация состоит из следующих этапов: узнаем размер массива по правую часть; освобождаем память под этот размер; по очереди копируем ячейки правого массива в соответственные ячейки левого. Так?
6) Странно работает программа:
Код
char a[10], b[10];
cin.getline(a, 4);
cin.getline(b, 4);
cout << a << endl;
cout << b;

Я один (!) раз ввожу "12345", а она мне выдает "123"! Я же 2 раза использовал функцию cin.getline! Не могли бы вы объяснить мне, почему мне приходится вводить информацию один раз, и переменной b ничего не присваивается?

Заранее благодарен  smile 

Это сообщение отредактировал(а) Hagrael - 26.6.2011, 15:00
PM MAIL   Вверх
hawk3500
Дата 26.6.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



1)
указатель это по сути дела адрес!
И здвинуть его модно прибавив (или отняв) нужное вам количество байт.
У 99% ПК байтовое адресное пространство.
2)
Не ясен вопрос.
поясните.
3)
выделяется.
В разных местах может выделяться.
4)
указатель-это и есть число.
Всё верно.
5)
порядок будет несколько различен от того глобальная это переменная или нет

--------------------
воин dzen'a
PM MAIL   Вверх
volatile
Дата 26.6.2011, 15:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)

Код

int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);


Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
Реально ли сдвинуть на несколько бит?

нет


Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
Почему массив сделали константой? И почему вообще стоит использовать константы?

Размер массива сделали константой. Почему не знаю. В новых версиях это уже не константа. Видимо наследие тяжёлых времен.

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
3) Касательно констант, в следующем коде:
int a;
a=10;
под 10 тоже выделяется отдельное место? А в этом:
int a=10;

Во-первых у вас, это не константа. 
const int a; <- вот это константа.
Выделение памяти - зависит от реализации.
По опыту могу сказать, что от формы инициализации не зависит. А зависит есть ли где в программе указатель на эту константу.
Если указателя нет, то и память не выделяется, а просто подставляется значение.
Если есть указатель, то память будет выделена.

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
 Если говорить "на языке компьютера", то операция &a возвращает указатель, а не адрес? 

Указатель это и есть адрес. точнее указатель это переменная в которой хранится адрес того, на что он указывает.

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
Каков порядок инициализации массива в следующем коде:
char a[]="Hello";

Зависит от того в каком месте стоит.
Если в функции, и если не статик, то будет примерно так как вы написали.
для статик или если это глабальный массив, то выделение будет произведено на этапе компиляции.



PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 15:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Здесь вам неправильно ответили. Сдвинуть указатель на целове на несколько байт нельзя! То есть этот код юудет неопределенным согласно стандарту языка. Поэтому приведенный в одном комментарии од, показанный ниже, является некорректным. 
Цитата(volatile @  26.6.2011,  15:32 Найти цитируемый пост)
1:
int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);


Более того на некоторых системах он может привести к аварийному завершению работы, если вы по этому указателю захотите что-то записать. Указатель для типа int должен быть выровнен на границу слова.

Тем более нельзя указатель сдвинуть, как вы пишите, на несколько бит, так как минимальная единица адресация - это байт.

Что касается массива, то это не константа. Просто нет такой отдельной переменной, как массив, чтобы вы могли изменить значение по адресу этой переменной.  То есть, фактически, вам менять нечего!  Чтобы было понятно, то, например, указатель на элемент массива - это отделная ячейка памяти. Поэтому указатели можно менять, а с именем массива никакой ячейки памяти не связано. В памяти располагается лишь сам массив, который вы и можете менять. 

Что касается вашего примера с определением целочисленного значения, то очно целочисленные константы в памяти не хранятся. То есть компилятор, например, в вашем коде

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1:

int a;
a=10;


может сразу же записать по адресу переменной 'a' значение 10, и не хранить этот литерал 10 отдельно в памяти. Но бывают случаи, когда, например, используются выражения в качестве аргументов функции, когда компилятор хранит отдельно целочисленные литералы в своем пуле литералов. Но в общем случае компилятор оычно непосредственно вставляет в код целочисленные литералы без сохранения их в отдельном участке памяти.


Что касается примера

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1:

char a[]="Hello";


то в данном случае компилятор также не хранит строковый литерал в памяти, а лишь использует его для инициализации массива. То есть память выделяется только для массива a[], размер которого определяется как размер строкового литерала плюс один байт по нулевой завершающий символ. В вашем примере для массива будет выделено 6 байтов, и в них будет скопирован строковый литерал, включая завершающий ноль.

То есть этот код полностью эквивалентен следующему коду

char a[ 6 ] = { 'H', 'e', 'l', 'l', 'o', '\0' };

То есть никаких двух массивов, один - для строкового литерала, а другой - для идентификатора 'a', не создается. Создается лишь один массив для идентификатора 'a'.
Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1:
:


char a[10], b[10];
cin.getline(a, 4);
cin.getline(b, 4);
cout << a << endl;
cout << b;


Что касается этого примера выше, товы ведялете буфер для ввода строки в 4 байта. Функция считывает все то, что вы ввели до нажатия клавиши Enter, а затем копирует лишь 3 байта, добавляя их четвертым байтом нулевого значения. 
PM MAIL   Вверх
volatile
Дата 26.6.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Здесь вам неправильно ответили. Сдвинуть указатель на целове на несколько байт нельзя! То есть этот код юудет неопределенным согласно стандарту языка. Поэтому приведенный в одном комментарии од, показанный ниже, является некорректным. 
Цитата(volatile @  26.6.2011,  15:32 )
1:
int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);
Более того на некоторых системах он может привести к аварийному завершению работы, если вы по этому указателю захотите что-то записать. Указатель для типа int должен быть выровнен на границу слова.

Согласен с тем что код не кошерный, и новичкам такое показывать конечно нестоило.
Но строго говорить что 
Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Указатель для типа int должен быть выровнен на границу слова.

Вовсе он не должен.
Есть куча стркутур, где DWORD'ы не выровнены на границу слова.
И на PC это абсолютно нормально.
Хотя повторюсь, так делать, конечно-же не стоит.

PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  26.6.2011,  16:08 Найти цитируемый пост)
Цитата(Сыроежка @  26.6.2011,  15:53 )
Указатель для типа int должен быть выровнен на границу слова.


Вовсе он не должен.
Есть куча стркутур, где DWORD'ы не выровнены на границу слова.
И на PC это абсолютно нормально.
Хотя повторюсь, так делать, конечно-же не стоит.


В вашей структуре может быть целове число не выравнено на границу челого числа, но если вы занесете адрес этого целого числа в указатель, то такое поведение не соответсвует станарту  является неопределенным. И то, что у вас где-то это может "проскочить", совершенно не означает, что код корректный.
Приведу простой пример. Неокторые делают такое объявление

char * p = "12";

А затем менют значение по адресу этого указателя. Например, *p = '3'; При раоте, например, MS-DOS это пройдет, так как память там не защищенная, но тем не менее этот код некорректный согласно стандарту, так как строковые литералы менять запрещается.
PM MAIL   Вверх
volatile
Дата 26.6.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Сыроежка, ваш пример, с
*p = '3';
к теме выравнивания int'ов никакого отношения не имеет.

Добавлено @ 16:28
Кроме того он и не скомпилится.

Но повторю.
Жалею что показал это.
Так делать нехорошо.

Это сообщение отредактировал(а) volatile - 26.6.2011, 16:29
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  26.6.2011,  16:24 Найти цитируемый пост)
Сыроежка, ваш пример, с
*p = '3';
к теме выравнивания int'ов никакого отношения не имеет.


Имеет самое непосредственное отношение! Вы просто не поняли! Я хотел показать, что некоторые некорректные конструкция языка могут проскакивать на той или иной платформе, но тем не менее код является некорректным. Точно также и в случае занесения в указатель на тип int значения, которое не кратно размеру слова, то есть размеру int. Если вы попытаетесь по этому адресу записать целое число, то на многих платформах вы получите аварийное завершение. Н адругих платформах это может проскочить. Но то, что где-то это проскочило, это совершенно не делает код корректным! Стандарт по этому поводу прямо говорит, что такое поведение является неопределенным, то есть вы играетет в рулетку на свой страх и риск. А точнее пишите код, который не является допустимым кодом ни С и ни С++.

Добавлено через 8 минут и 45 секунд
Цитата(volatile @  26.6.2011,  16:24 Найти цитируемый пост)
Сыроежка, ваш пример, с
*p = '3';
к теме выравнивания int'ов никакого отношения не имеет.

Добавлено @ 16:28
Кроме того он и не скомпилится.


Зря вы думаете, что такой код не компилируется! Многие компияторы, особенно на С, спокойно компилируются этот код. Кроме того вы не забывайте, что компилятору бывает очень трудно обнаружить такую ошибку, например, есл такой указатель передается в качестве аргумента какой-нибудь другой функции, а уж в этой функции происходт присвоение по адресу указателя.

У вас код не окмпилируется скорей всего по той причине, что вы компилируете как код С++, и компилятор видет это непосредственное изменение.  Дело в том, что ест разница между С и С++ в том, како тип имеют строковые литералы. На С++ строковый литерал имеет тип массива производного от типа const char, а в С это массив, производный от типа char. Но тем не менее стандарты и С++ и С строго запрещают менять строковые литералы.
PM MAIL   Вверх
volatile
Дата 26.6.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Сыроежка, я уже тыщу раз сказал что пример не хорош, и что я жалею что показал его.
Просто иногда новичку нужно знать (вспоминая себя) и такие вещи.
но на вопрос
Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)

ответ мой такой.
Цитата(volatile @  26.6.2011,  15:32 Найти цитируемый пост)
int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);


Спорить дальше не буду
 smile 
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
5) Каков порядок инициализации массива в следующем коде:

код C++
1:

char a[]="Hello";


Как происходит инициализация массива строковым литералом, я вам показал выше в своем комментарии.
Но нужно не путать две вещи: инциализацию массива строковым литералом, и инициализацию указателя на char адресом строкового литераа, то есть когда вы пишите

char *p = "Hello";

В этом случае компилятор действительно сохраняет символьный строковый литерал в памяти в виде символьного массива, а указателю p присваивает знчение адреса первого элемента этого массива.
Причем следует знать важные отличия характеристик строкового итерала в С и в С++. 
В С строковый литерал имеет тип массива, производного от типа char (массивы называются в стандартах С и С++ производными типами, то есть их тип определяется типом элемента массива). В то время как в С++ строковый литерал имеет тип, произвоный от типа const char.

Есть и еще одно важное различие, которые многие программисты не знают. Так, например, следующий код

char s[3] = "XYZ"; 

является корректным в С. В то время как в С++ такой код является некорректным. 
PM MAIL   Вверх
hawk3500
Дата 26.6.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Сыроежка
  Дата 26.6.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(hawk3500 @  26.6.2011,  18:00 Найти цитируемый пост)
ИМХО чтобы не было проблем с выравниванием и проблем с выравниванием и разрадностью многих систем порой всё же стоит выходить за пределы 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) 


Я уже написал выше, что этот код некорректный. Вы можете проделывать различные преобразования, но код так и останется не корректным.
И это имеет дело не "к чистоте "языка, как вы думаете, а к совершенно некорректному программированию, которое к языку отношения не имеет.

Ваши попытки мне напоминают стремление слово "корова" писать через "а". От того, что вы букву "а" напишите, например, прописными буквами, а не строчными, то есть в виде "кАрова", не делает прапвильным правописание этого слова.

То есть ваш комментарий ни к С, ни к С++ отношениря не имеет. А имеет отношение лишь к тому, чего не надо делать на С и С++! Если бы автор вопроса интересовался  именно этим, то есть тем, как не надо писать на С и С++, то ваш ответ был бы к месту.

Добавлено через 3 минуты и 32 секунды
Цитата(hawk3500 @  26.6.2011,  18:00 Найти цитируемый пост)
Я бы реализовал это просто.
void *Point;
__asm
{
  mov eax,Point
  add eax,03h
  mov Point,eax
}


Кстати сказать, хотел бюы отметить, что, во-перваых, в С вообще нет ключевого слова asm  ни в каких модификациях (с префиксом в виде знаков подчеркивания или нет), а в С++ есть лишь ключевое слово asm Так что предложенный вами способ имеет отношение лишь к какому-то оригинальному компилятору. 
PM MAIL   Вверх
hawk3500
Дата 26.6.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



void *Point;
__asm
{
  mov eax,Point
  add eax,03h
  mov Point,eax
}

и где же сдесь ошибка??????
--------------------
воин dzen'a
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(hawk3500 @  26.6.2011,  18:15 Найти цитируемый пост)
void *Point;
__asm
{
  mov eax,Point
  add eax,03h
  mov Point,eax
}

и где же сдесь ошибка?????? 


А я не гвоорил, что здесь ошибка! Я говорил, что к исходному вопросу это отношения не имеет. Автор, фактически, спрашивал, может ли указатель иметь значение, не кратное размеру int. Ответ прост: не может! То есть такое поведение неопределенное.

Что касается вашего примера, то ваша переменная Point объявлена не как указатель на int, а как указатель на void. Так что к исходному вопросу вообще никакого отношения не имеет. Внутреннее представление указателя на void по крайней мере в соответствии со стандартом С соответствует внутреннему представлению указателя на char. Это сделано для того, чтобы можно было использовать такие функции, как, например, memcpy.
Очевидно, что указатель на void может адресовать любой байт. Тем не менее это неверно для указателей на int.

Добавлено через 50 секунд
Я имел в виду, может ли указатель на int иметь значение не кратное размеру int.

Добавлено через 13 минут и 39 секунд
Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)


То есть если отвечать на этот исходный вопрос, то сделать это, то есть игнорируя арифметику указателей, нельзя. Так как тогда указатель будет содержать некорректное значение. И примером этого является указатель на int. 
Естественно, что указатель на char ожет адресовать любой байт, но даже он не игнориует арифметику указателей, то есть сдвиг происходи согласно размеру типа ( в данном случае sizeof( char ) ), на данное которого указатель указывает. Более того могут быть и wchar_t типы символов. 
Конечно, если использовать тип char * , то вопросов никаких нет, так как sizeof( char ) == 1. Но, как я понимаю, автора не этот вопрос мучал, а мучал вопрос, может ли какой-нибудь указатель хранить значение, которое не удовлетворяет правилам арифметики с указателями.

В связи с вышесказанным ваш пример со вставкой ассемблера вообще выглядет абсурдной, так как можно просто перевести указатель на int  в указатель на char и ему присвоить любое значение! Зачем такие сложности с ассемблером?!!!
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



То есть суть исходного вопроса, касающегосу игнорирования арифметики указателей сводится к следующему вопросу: является ли следующий код корректным?

Код

int x = 10;
int *p = &x;

p = ( int * )( ( char * )p + 1 );


Ответ: не является!

Это сообщение отредактировал(а) Сыроежка - 26.6.2011, 19:14
PM MAIL   Вверх
alexvs11
Дата 26.6.2011, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Сыроежка, приведите выдержку из стандарта про выравнивание, раз вы его тут упоминали
PM MAIL   Вверх
Сыроежка
Дата 26.6.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(alexvs11 @  26.6.2011,  19:31 Найти цитируемый пост)
Сыроежка, приведите выдержку из стандарта про выравнивание, раз вы его тут упоминали 


Резонное предложение. Приведу, но только завтра или послезавтра, так как сейчас общаюсь из нтернет-кафе, и под рукой никаких документов нет.
PM MAIL   Вверх
volatile
Дата 26.6.2011, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @ 26.6.2011,  19:13)
является ли следующий код корректным?
Код

int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );

Ответ: не является!


а такой код будет корректным ? smile
Код

for ( int i=0; i<sizeof(int); ++i )
   p = ( int * )( ( char * )p + 1 );

Еесли Нет, приведите пример машины, операционной системы, да хоть чего-нибудь, где этот код работать не будет.
(именно этот код с for)

Если Да, то как может в целом корректный код состоять из нескольких некорректных операций?

PM MAIL   Вверх
hawk3500
Дата 26.6.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 6.2.2009

Репутация: нет
Всего: 2



Сыроежка вот вы говорили:

Цитата

То есть суть исходного вопроса, касающегосу игнорирования арифметики указателей сводится к следующему вопросу: является ли следующий код корректным?
код C++

int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );


Изначально вопрос стоял так:
Цитата

1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)
    Реально ли сдвинуть на несколько бит?


Игнорировать арифметику указателей-означает прежде всего не привязываться к базовым типам.
Если у меня есть указатель на тот или иной участок памяти и задача сдвинуть на несколько байт,
то я просто прибавлю к к имеющемуся значению в указателе значение равное сумме того что есть + 3.
А вот какой тип данных вы будете использовать мне всё равно.
С точки зрения программы адресное пространство масива линейно и применение понятия выравнивания не корректно,
разве что быть может это учитываеться в каких нибудь древних системах или при низкоуровневом программировании...но мы о нём речи не ведём.
Пришлите скрин отладчика(ОС значения не имеет) под которым мя явно увидим что это приведёт к падению системы.....


Это сообщение отредактировал(а) hawk3500 - 26.6.2011, 23:31
--------------------
воин dzen'a
PM MAIL   Вверх
volatile
Дата 27.6.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



hawk3500, на некоторых платформах (микроконтроллеры напр.) действительно нельзя обращаться по указателям не выровненным на слово. К PC (Personal Computer), да и вообще к любым машинам на X86 это не отностися, не важно какая система (win*; dos*; *nix).

Сделаю ударение нельзя именно обращаться.
Но здесь никто и не обращается
Мы только прибавляем число к указателю.  smile 

Это сообщение отредактировал(а) volatile - 27.6.2011, 00:06
PM MAIL   Вверх
volatile
Дата 27.6.2011, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



удалил. не к чему это.

Это сообщение отредактировал(а) volatile - 27.6.2011, 01:54
PM MAIL   Вверх
borisbn
Дата 27.6.2011, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



>на некоторых платформах (микроконтроллеры напр .) действительно нельзя обращаться по указателям не выровненным на
слово

Мало того, на некоторых компиляторах размер char равен размеру short и равен размеру int - AnalogDevice под какой-то свой процессор (161-й по-моему) 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Hagrael
Дата 27.6.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Спасибо всем, кто мне ответил!

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
1) Как сдвинуть указатель на несколько байт? (игнорируя арифметику указателей)

Код
int x=10;
int* p=&x;
p+=1/4;

Данный код некорректен из-за того, что оператор + может связывать переменную типа type* (любой указатель) только с переменной типа int.
Код
int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );

А почему некорректен этот код, мне непонятно. Однако, думаю, что прежде следует понять, почему не работает код, приведенный ниже:
Код
int x=10;
int* p=&x;
char *p_char=(char*) p;
cout << p_char;

Консоль абсолютно чиста, если не считать статуса завершения программы. Из-за чего?

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
2) Почему массив сделали константой? И почему вообще стоит использовать константы?

Массив на самом деле ведь указывает на свою первую ячейку. Однако это не просто указатель, а константа-указатель. Следующий код приводит к ошибке " non-lvalue in assignment ":
Код
int arr[10];
arr++;

А следующий - к ошибке " incompatible types in assignment of `int' to `int[10]' ":
Код
int arr[10];
arr+=1;

Однако я заметил, что обычные константы нельзя копировать в др. переменные без префикса constant, однако массив можно. Т. е. следующий код будет корректным:
Код
int arr[10];
int* pointer=arr;

А следующий - нет, т. к. нет префикса const перед второй строкой:
Код
int arr[10];
int* pointer=arr;

Так что же это такое - массив? Это не просто const type*  smile 

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
3) Касательно констант, в следующем коде:

int a;
a=10;

под 10 тоже выделяется отдельное место? А в этом:

int a=10;

Вот что я понял. К переменным всех типов присваиваются их литералы, которые заранее никуда в ОЗУ не копируются. Единственное - исключение может составить указатель, указывающий на строку. Тогда строковый литерал изначально превращается в массив типа char, и когда дело доходит до инициализации нашего указателя, то в него возвращается заранее созданный массив.

А под локальные переменные неиспользуемой функции выделяется место? Или оно выделяется под них только при запуске функции? А где хранятся все те литералы, которые посылаются в аргументы? В памяти той функции, из которой вызывается другая функция, принимающая литералы в качестве аргументов? И еще вопрос: .exe-файл на протяжении всей программы хранится в ОЗУ. Но зачем? Разве из него сразу же не вытянули всю информацию?

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
4) Если говорить "на языке компьютера", то операция &a возвращает указатель, а не адрес? Ведь эта операция возвращает тип type*, присущий указателям. А адрес - это число (типа int) по моему мнению.

Мне все говорят, что указатель - это переменная, хранящая адрес. Но ведь компьютер не видит этой разницы, так?

Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
6) Странно работает программа:

char a[10], b[10];
cin.getline(a, 4);
cin.getline(b, 4);
cout << a << endl;
cout << b;

Если ты ввел в первый раз менее 4-х символов, то компьютер тебя просит ввести еще одну строку, после чего выводится то, что ты ввел в первый раз и то, что ты ввел во второй раз. Однако если ты введешь 4 символа или более, то тебе не предоставится второй возможности ввести строку, вместо этого на экран выведутся 3 первых буквы из того, что ты ввел в этот единственный раз и на пустота, находящаяся строчкой ниже. Можете объяснить это поведение?
Кстати, касательно функции cin.getline: она странно работает - возвращает 3 символа, когда я вторым аргументом послал число 4! Что это такое?

И новый вопрос:
7) Что такое "конец слова" и "выравнивание под конец слова"?

Заранее благодарю.

Это сообщение отредактировал(а) Hagrael - 27.6.2011, 10:21
PM MAIL   Вверх
bsa
Дата 27.6.2011, 10:46 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Код
int x=10;
int* p=&x;
p+=1/4;
Данный код некорректен из-за того, что оператор + может связывать переменную типа type* (любой указатель) только с переменной типа int.
Данный код вполне корректен. Так как p переместится на 0 позиций. Слово "сдвиг" я бы вообще не рекомендовал применять к указателям, так как под сдвигом понимается битовая операция (фактически, сдвиг на 1 влево тоже самое что и умножение на 2, а вправо - целочисленное деление на 2), которая для указателей вообще недопустима (если не понятно почему, почитай про указатели в Ответах на часто задаваемые вопросы).
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Код
int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );

А почему некорректен этот код, мне непонятно.
По мне, он корректен - я не нашел в стандарте указаний на то, что доступ к объектам обязан быть выравнен. С другой стороны, если я такой код увижу, то я буду считать его ошибочным (если, конечно, в комментариях к нему меня не убедят в обратном). Потому что очень мало причин, по которым может это понадобиться. Обычно, все решается несколько иначе.


Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Код
int x=10;
int* p=&x;
char *p_char=(char*) p;
cout << p_char;

Консоль абсолютно чиста, если не считать статуса завершения программы. Из-за чего?
Начнем с того, что 10 - это код символа '\n' - конец строки. Он на консоли отображается как перемещение курсора в начало следующей строки. Но, данный код может отобразиться тогда и только тогда, когда у тебя система Little Endian (x86, например). А вот на Big Endian системах (ARM, например) на экран будет выведен символ '\0' (так как x будет содержать байты 0, 0, 0, 10 вместо 10, 0, 0, 0).

Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Массив на самом деле ведь указывает на свою первую ячейку. Однако это не просто указатель, а константа-указатель. 

Здесь и далее у тебя уже начинается путаница.
"константный указатель" и "указатель на константу" в большинстве случаев значит одно и тоже (хотя, должно значить разное): const type * pointer
"указатель-константа" - это уже несколько другое:  type * const pointer
Разница в следующем: в первом случае ты имеешь право менять УКАЗАТЕЛЬ (например, чтобы он указывал в другое место), но не имеешь права менять элемент, на который он указывает, а во втором ты имеешь право менять элемент, но не сам указатель. Разницу видишь?
Массив имеет свой собственный тип - массив (type[n]). Его можно воспринимать, как "указатель-константа". Но в отличие от последнего, sizeof() возвращает не размер указателя, а занимаемое место (в char'ах) массивом.
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
А под локальные переменные неиспользуемой функции выделяется место? Или оно выделяется под них только при запуске функции?
выделяется только при входе в функцию.
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
А где хранятся все те литералы, которые посылаются в аргументы? В памяти той функции, из которой вызывается другая функция, принимающая литералы в качестве аргументов?
в коде программы (когда надо вызвать твою функцию, процессор получает команды: запихать 10 в стек, запихать 50 в стек, вызвать подпрограмму по адресу такому-то, ..., откатить стек на <размер аргументов>). 
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
И еще вопрос: .exe-файл на протяжении всей программы хранится в ОЗУ. Но зачем? Разве из него сразу же не вытянули всю информацию?
Вообще-то, основную часть экзэшника (речь не про отладочную сборку, когда 99,99% его объема уходит под отладочную информацию) занимает программа. А она должна быть в памяти, чтобы процессор мог ее выполнять.

Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Мне все говорят, что указатель - это переменная, хранящая адрес. Но ведь компьютер не видит этой разницы, так?

Еще раз рекомендую почитать ответы на часто задаваемые вопросы (тема прикреплена).
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Если ты ввел в первый раз менее 4-х символов, то компьютер тебя просит ввести еще одну строку, после чего выводится то, что ты ввел в первый раз и то, что ты ввел во второй раз. Однако если ты введешь 4 символа или более, то тебе не предоставится второй возможности ввести строку, вместо этого на экран выведутся 3 первых буквы из того, что ты ввел в этот единственный раз и на пустота, находящаяся строчкой ниже. Можете объяснить это поведение?
http://cplusplus.com/reference/iostream/istream/getline/ почитай, когда включается failbit. Кстати, после возникновения ошибки и до ее снятия читать не получится.

Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
7) Что такое "конец слова" и "выравнивание под конец слова"?
под "словом" понимается так называемое "машинное слово". Т.е. это данные такого размера, работа с которыми для процессора наименее трудоемка. Наиболее популярны 32 и 64 бита (4 и 8 байт, соответственно). У современных процессоров все узлы оптимизированы на работу с такими словами. Но платой за это является снижение производительности при невыравненном доступе: представь, процессор за 1 такт читает 4 байта с адресов, кратных 4. Чтобы прочитать данные, которые лежат только кратно 2, ему придется прочитать 2 раза по 4 байта, а затем лишние байты выкинуть. А теперь представь, что нужно сделать, чтобы записать: прочитать 4 байта, заменить 2 на новые данные, записать, прочитать еще 4 байта, заменить 2 байта на новые, записать.... Минимум 4 такта вместо 1. Именно поэтому все современные компиляторы умеют делать выравнивание по границе машинного слова.

PM   Вверх
Hagrael
Дата 27.6.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Спасибо за ответ.

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Данный код вполне корректен. Так как p переместится на 0 позиций.

На самом деле код был таким:
Код
int x=10;
int* p=&x;
p+=0.25;

Я написал 1/4 для ясности, забыв о том, что если делить один int на другой, то выполнится целочисленное деление smile Думаю, теперь понятно, о чем я говорил:
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Данный код некорректен из-за того, что оператор + может связывать переменную типа type* (любой указатель) только с переменной типа int.


Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
По мне, он корректен - я не нашел в стандарте указаний на то, что доступ к объектам обязан быть выравнен. С другой стороны, если я такой код увижу, то я буду считать его ошибочным (если, конечно, в комментариях к нему меня не убедят в обратном). Потому что очень мало причин, по которым может это понадобиться. Обычно, все решается несколько иначе.

Т. е. технически этот код правилен, однако вы бы подумали, что его автор не знает, что делает, да?

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Начнем с того, что 10 - это код символа '\n' - конец строки. Он на консоли отображается как перемещение курсора в начало следующей строки.

И правда, я просто не заметил переноса строки.

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Но, данный код может отобразиться тогда и только тогда, когда у тебя система Little Endian (x86, например). А вот на Big Endian системах (ARM, например) на экран будет выведен символ '\0' (так как x будет содержать байты 0, 0, 0, 10 вместо 10, 0, 0, 0).

Немного об Endian-ах в Википедии и не до конца понял smile Big Endian и Little Endian - это различные порядки байтов. Но по идее это же одно и то же число, и после операций результат на различных системах должен быть одинаковым относительно каждой системы. Или нет?

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Здесь и далее у тебя уже начинается путаница.
"константный указатель" и "указатель на константу" в большинстве случаев значит одно и тоже (хотя, должно значить разное): const type * pointer
"указатель-константа" - это уже несколько другое:  type * const pointer
Разница в следующем: в первом случае ты имеешь право менять УКАЗАТЕЛЬ (например, чтобы он указывал в другое место), но не имеешь права менять элемент, на который он указывает, а во втором ты имеешь право менять элемент, но не сам указатель. Разницу видишь?

Спасибо, понял.

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Массив имеет свой собственный тип - массив (type[n]). Его можно воспринимать, как "указатель-константа". Но в отличие от последнего, sizeof() возвращает не размер указателя, а занимаемое место (в char'ах) массивом.

Ах вот оно что, значит, массив - это не просто указатель на свою первую ячейку. Он не является константой (т. к. при операции int* p=int_arr; в левой стороне не нужно слово const), однако его нельзя менять. Так?

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Вообще-то, основную часть экзэшника (речь не про отладочную сборку, когда 99,99% его объема уходит под отладочную информацию) занимает программа. А она должна быть в памяти, чтобы процессор мог ее выполнять.

Это понятно, но разве при запуске программы глобальные переменные все функции с их инструкциями не вытаскиваются?

Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Чтобы прочитать данные, которые лежат только кратно 2, ему придется прочитать 2 раза по 4 байта, а затем лишние байты выкинуть. А теперь представь, что нужно сделать, чтобы записать: прочитать 4 байта, заменить 2 на новые данные, записать, прочитать еще 4 байта, заменить 2 байта на новые, записать.... Минимум 4 такта вместо 1.

Значит, в ОЗУ все стремиться к подобному порядку:
4 байта | 8 байт | 8 байт | ...
Но зачем 2 раза читать по 4 байта, а затем лишние байты выкинуть? Вы говорите о таких размерах, как 5-7 байт? Тогда, выходит, это устроено так:
    1. Нашел адрес;
    2. Считал 8 байт (2 раза по 4 байта);
    3. Выкинул 2 байта (т. к. нужно было только 6 байт)
А по 8 процессор читать не может, да?

Цитата(bsa @  27.6.2011, 10:46 Найти цитируемый пост)
http://cplusplus.com/reference/iostream/istream/getline/

Я английский знаю не ахти, но я так понял, дело в том, что failbit - это бит, перед которым получение информации прекращается. Я правильно говорю?

Это сообщение отредактировал(а) Hagrael - 27.6.2011, 12:42
PM MAIL   Вверх
bsa
Дата 27.6.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
Т. е. технически этот код правилен, однако вы бы подумали, что его автор не знает, что делает, да?

да
Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
Немного об Endian-ах в Википедии и не до конца понял  Big Endian и Little Endian - это различные порядки байтов. Но по идее это же одно и то же число, и после операций результат на различных системах должен быть одинаковым относительно каждой системы. Или нет?
endianess отвечает лишь за порядок байт в ОЗУ. АЛУ работает независимо.
Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
Ах вот оно что, значит, массив - это не просто указатель на свою первую ячейку. Он не является константой (т. к. при операции int* p=int_arr; в левой стороне не нужно слово const), однако его нельзя менять. Так?
Я же объяснил, чем "указатель на константу" отличается от "указателя-константы". const int *p - указатель на константу. int * const p - указатель-константа. Так вот, массив можно воспринимать как указатель-константу (хотя, на самом деле, делать так не стоит).
Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
Это понятно, но разве при запуске программы глобальные переменные все функции с их инструкциями не вытаскиваются?
А что по твоему содержит экзэшник? Он содержит именно программный код, информацию о распределении памяти и необходимых подключаемых библиотеках, а также данные для инициализации глобальных переменных. Правда, возможно, он еще может содержать всякий "мусор" (например, самораспаковывающиеся архивы).

Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
А по 8 процессор читать не может, да?
может. все зависит от архитектуры процессора и контроллера памяти.
Цитата(Hagrael @  27.6.2011,  12:35 Найти цитируемый пост)
Я английский знаю не ахти, но я так понял, дело в том, что failbit - это бит, перед которым получение информации прекращается. Я правильно говорю?
Учи английский, иначе в программировании делать тебе нечего.
failbit устанавливается при ряде ошибок чтения. В частности, getline устанавливает его, когда размер буфера меньше, чем данных в потоке. Для снятия этого бита нужно использовать метод clear().
PM   Вверх
volatile
Дата 28.6.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(bsa @ 27.6.2011,  10:46)
Цитата(Hagrael @  27.6.2011,  08:57 Найти цитируемый пост)
Код
int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );

А почему некорректен этот код, мне непонятно.
По мне, он корректен - я не нашел в стандарте указаний на то, что доступ к объектам обязан быть выравнен. С другой стороны, если я такой код увижу, то я буду считать его ошибочным (если, конечно, в комментариях к нему меня не убедят в обратном). Потому что очень мало причин, по которым может это понадобиться. Обычно, все решается несколько иначе.


согласен на 200%. Удивительно как точно сформулирована мысль.  smile
именно это я и хотел сказать вчера.
PM MAIL   Вверх
Hagrael
Дата 28.6.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Простите, что так долго не понимаю...

Цитата(bsa @  27.6.2011,  23:32 Найти цитируемый пост)
Массив можно воспринимать как указатель-константу (хотя, на самом деле, делать так не стоит).

Вот именно, как я понимаю, на самом деле, это не указатель-константа! Взять даже ошибки, которые высвечиваются в логе после этого кода:
Код
int a=5;
int* const p=&a;
p++; // 1

int arr[10];
arr++; // 2

Вот, собственно, ошибки:
Код
1. increment of read-only variable `p'
2. non-lvalue in assignment

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

Цитата(bsa @  27.6.2011,  23:32 Найти цитируемый пост)
А что по твоему содержит экзэшник? Он содержит именно программный код, информацию о распределении памяти и необходимых подключаемых библиотеках, а также данные для инициализации глобальных переменных. Правда, возможно, он еще может содержать всякий "мусор" (например, самораспаковывающиеся архивы).

А вы можете сказать примерно, из чего состоит .exe и каким образом с его помощью работает программа (или сказать, что почитать по этому поводу). Я так понимаю, что .exe-файл содержит в себе сборник инструкций, выполняющихся одна за другой. Вот, к примеру, у меня такой код:
Код
#include <iostream>

void func();

int main() {
    cout << "Hello";
    func();
    return 0;
}

void func() {cout << "Good Bye";}

После компиляции, насколько я понимаю, в .exe-файле будут следующие инструкции:
Код
1) в месте 0xB04566 будет находиться функция типа void, аргументов она не берет;
2) в месте 0xB04700 будет находиться главная функция, делает она вот что:
    1) пишет "Hello"
    2) вызывает функцию по адресу 0xB04566 без аргументов;
    3) возвращает 0;
4) функция по адресу 0xB04566 должна делать следующее: {}
5) запускай главную функцию!!!

И, выходит, что компьютер при запуске файла проверит его расширение, увидит, что это .exe, загрузит в память и начнет следовать инструкциям.

А адрес переменным задается строгий, или же при создании переменной, для нее берется свободное место, которое по адресу ближе всех др. свободных мест к нулю?

А библиотечные функции пишутся на C++ или Asm? Логичнее было бы писать их на Asm, и я бы не спросил об этом, если бы не увидел директивы #include, включающей файл с расширением .h.

И еще один вопрос: Если у каждой программы своя виртуальная память, то почему выдает ошибку такая конструкция:
Код
int* p=(int*) 123;
*p=6;

я же изменяю свою переменную, а не переменную чужой программы.

Это сообщение отредактировал(а) Hagrael - 28.6.2011, 10:38
PM MAIL   Вверх
triclosan
Дата 28.6.2011, 12:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(Hagrael @  28.6.2011,  10:20 Найти цитируемый пост)
А адрес переменным задается строгий, или же при создании переменной, для нее берется свободное место, которое по адресу ближе всех др. свободных мест к нулю?

Прикладной программе (не по функциональности, а по типу и правам запуска) ОС указывает какой участок памяти она может занять (строго говоря это может быть где угодно в пользовательской памяти) далее мы уже имеем дело со смещениями т.е. ваши 0xB04566 и 0xB04700 могут меняться от запуска к запуску, но переход от main к func будет - "сдвинуться на 0xB04700-0xB04566".

Цитата(Hagrael @  28.6.2011,  10:20 Найти цитируемый пост)
А библиотечные функции пишутся на C++ или Asm? Логичнее было бы писать их на Asm, и я бы не спросил об этом, если бы не увидел директивы #include, включающей файл с расширением .h.

Большинство функции на Си как раз писаны на Asm, при этом файл .h все равно присутствует - он содержит прототипы функций, но это все вообще-то зависит от реализации. 
Си++ые же функции (чистых функций в std::* не так уж и много) - главным образом на Си++, причем большинство - шаблонные, поэтому реализация в виде исходного кода.

Это сообщение отредактировал(а) triclosan - 28.6.2011, 12:39
PM MAIL   Вверх
Сыроежка
Дата 28.6.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(hawk3500 @  26.6.2011,  23:31 Найти цитируемый пост)
Игнорировать арифметику указателей-означает прежде всего не привязываться к базовым типам.
Если у меня есть указатель на тот или иной участок памяти и задача сдвинуть на несколько байт,
то я просто прибавлю к к имеющемуся значению в указателе значение равное сумме того что есть + 3.


Вы заблуждаетесь! Это не все равно! Языки С и С++ типизированные, и у вас не просто какой-то указатель неизвестного типа, а указатель производного типа от 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 секунды
Цитата(Hagrael @  28.6.2011,  10:20 Найти цитируемый пост)
Вот именно, как я понимаю, на самом деле, это не указатель-константа! Взять даже ошибки, которые высвечиваются в логе после этого кода:

код C++

int a=5;
int* const p=&a;
p++; // 1

int arr[10];
arr++; // 2





Вот, собственно, ошибки:

Без подсветки

1. increment of read-only variable `p'
2. non-lvalue in assignment



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



Я вам уже объяснил! Вы очевидно с первого раза не поняли! Что вы собираетесь менять?!!! Назовите мне ту ячейку памяти, которую вы собираетесь изменить! С именем массива не связана никакая ячейка памяти! То есть нет такой ячейки, где хранится адрес массива, и которую вы могли бы изменить! В памяти хранится сам массив, то есть его элементы. А имя массива - это, можно так сказать, виртуальный адрес массива, то есть нигде этот адрес не хранится! Если бы он где-то хранился, то тогда бы вы его могли изменить. Но в этом случае это уже был бы не сам массив, а указатель на массив, то есть отдельная ячейка памяти, которую вы могли бы менять!

Добавлено через 9 минут и 19 секунд
Цитата(Hagrael @  28.6.2011,  10:20 Найти цитируемый пост)
И еще один вопрос: Если у каждой программы своя виртуальная память, то почему выдает ошибку такая конструкция:

код C++
1:
2:

int* p=(int*) 123;
*p=6;


я же изменяю свою переменную, а не переменную чужой программы.


123 - это не переменная! Это константа препроцессора, которая в результате компиляции заносится непосредственно в машинную команду, которая инициализирует некоторую переменную.

В приведенном ваше примере компилятор никуда не помещает 123, поэтому у этой константы нет адреса!

Я вам уже все об этом в своем первом сообщении сказал. Кстати сказать это было единственное грамотное сообщение в ответ на ваш исходный вопрос, а вы его, непонятно почему, проигнорировали!

Добавлено через 11 минут и 52 секунды
Цитата(bsa @  27.6.2011,  10:46 Найти цитируемый пост)
Цитата(Hagrael @  27.6.2011,  08:57 )
код C++
1:
2:
3:

int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );





А почему некорректен этот код, мне непонятно.

По мне, он корректен - я не нашел в стандарте указаний на то, что доступ к объектам обязан быть выравнен. С другой стороны, если я такой код увижу, то я буду считать его ошибочным (если, конечно, в комментариях к нему меня не убедят в обратном). Потому что очень мало причин, по которым может это понадобиться. Обычно, все решается несколько иначе.


Цитата(volatile @  28.6.2011,  00:25 Найти цитируемый пост)
Цитата(bsa @ 27.6.2011,  10:46)
Цитата(Hagrael @  27.6.2011,  08:57 )
код C++
1:
2:
3:

int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );





А почему некорректен этот код, мне непонятно.

По мне, он корректен - я не нашел в стандарте указаний на то, что доступ к объектам обязан быть выравнен. С другой стороны, если я такой код увижу, то я буду считать его ошибочным (если, конечно, в комментариях к нему меня не убедят в обратном). Потому что очень мало причин, по которым может это понадобиться. Обычно, все решается несколько иначе.




согласен на 200%. Удивительно как точно сформулирована мысль.  
именно это я и хотел сказать вчера. 



Я уже привел цитаты из стандарта С в своем сообщении выше, так что можете ознакомиться, почему этот код некорректный.
PM MAIL   Вверх
Сыроежка
Дата 28.6.2011, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  27.6.2011,  00:04 Найти цитируемый пост)
Сделаю ударение нельзя именно обращаться.
Но здесь никто и не обращается
Мы только прибавляем число к указателю.   


Прибавление целочисленного числа к укакзателю называется адресной арифметикой. 
Так что вы не прибавляете число к указателю! Вы переводите значение одного указателя в значение указателя другого типа, его меняете, а затем делаете обратное преобразование значение к типу исходного указателя. На что стандарт, наприсер, языка С говорит:
Цитата(Сыроежка @  28.6.2011,  18:16 Найти цитируемый пост)
"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"


PM MAIL   Вверх
volatile
Дата 29.6.2011, 00:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Надо только упомянуть,что вы привели выдержки из нового draft C0X: стандарта, еще вроде даже не принятого. Не большой знаток С, так что утверждать не буду.
Буду признателен если вы приведете что-то из стандарта С++ (не С), тем более что ТС явно указал язык. 
Цитата(Hagrael @  26.6.2011,  14:45 Найти цитируемый пост)
Здравствуйте, уважаемые форумчане. Я не так давно начал учить C++ 

Не понятно почему вы постоянно сбиваетесь на С, да еще и C0X

Это сообщение отредактировал(а) volatile - 29.6.2011, 00:50
PM MAIL   Вверх
Hagrael
Дата 29.6.2011, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Сыроежка, я не проигнорировал ваш пост smile Вы говорите, что с адресом массива не связаны никакие ячейки памяти, но почему тогда такая запись не выдаст ошибки?
Код
int arr[10];
arr[0];
*(arr+0); // массив ведет себя, как указатель!

Как тогда можно охарактеризовать это поведение?

Цитата(Сыроежка @  28.6.2011,  18:16 Найти цитируемый пост)
123 - это не переменная!

Но ведь я не писал &123, а написал (int*) 123, т. е. я хотел, чтобы указатель указывал на адрес 123 (что он, собственно, и делает).
PM MAIL   Вверх
Hagrael
Дата 29.6.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Цитата(triclosan @  28.6.2011,  12:27 Найти цитируемый пост)
Большинство функции на Си как раз писаны на Asm, при этом файл .h все равно присутствует - он содержит прототипы функций, но это все вообще-то зависит от реализации. 

Т. е. получается, что если объявлен прототип стандартной C++ и не объявлена сама функция (программистом не сказано, что она должна делать), то она подключится из стандартной C++ библиотеки?
PM MAIL   Вверх
triclosan
Дата 29.6.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(Hagrael @  29.6.2011,  09:27 Найти цитируемый пост)
Т. е. получается, что если объявлен прототип стандартной C++ и не объявлена сама функция (программистом не сказано, что она должна делать), то она подключится из стандартной C++ библиотеки? 

Там, где вы меня цитируете я говорю про Си, а вы спрашиваете про Си++, хотя поведения с прототипами и отсутствием реализации в Си и Си++ схожи, если не идентичны.

Тем не менее ваш вопрос мне не понятен, проиллюстрируйте пожалуйста.
PM MAIL   Вверх
xvr
Дата 29.6.2011, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Hagrael @  29.6.2011,  07:54 Найти цитируемый пост)
Но ведь я не писал &123, а написал (int*) 123, т. е. я хотел, чтобы указатель указывал на адрес 123 (что он, собственно, и делает). 

Он и указывает. Проблема в том, что в виртуальной памяти (в отличии от физической) могут быть 'дырки', т.е. адреса, по которым никакой памяти нет. Ваш 123 попадает в одну из таких дырок. Попытка обратится туда приводит к эксепшену со стороны ОС

Цитата(Hagrael @  29.6.2011,  09:27 Найти цитируемый пост)
Т. е. получается, что если объявлен прототип стандартной C++ и не объявлена сама функция (программистом не сказано, что она должна делать), то она подключится из стандартной C++ библиотеки? 

Она будет подключена линкером оттуда, где он сможет ее найти. Если найдется в стандартных библиотеках - будет взята оттуда. Найдется у пользователя в его исходниках - будет взята оттуда. И это касается всех функций в программе, в том числе и явно стандартных. 
Например, вы можете написать у себя в исходнике memcpy, и по всей программе будет взята ваша функция, а не из libc

PM MAIL   Вверх
Сыроежка
Дата 29.6.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  29.6.2011,  00:18 Найти цитируемый пост)
Надо только упомянуть,что вы привели выдержки из нового draft C0X: стандарта, еще вроде даже не принятого. Не большой знаток С, так что утверждать не буду.


Это, то есть то, что я процитировал, уже существует в стандарте 99 языка С. То есть уже давно принято.
В С++ тоже самое написано только в другом разделе, то есть что значение указателя должно быть правльно выравнено относительно типа данных, на которые он указывает. Это особенно важно при наследовании классов.

Добавлено через 2 минуты и 1 секунду
Цитата(Hagrael @  29.6.2011,  07:54 Найти цитируемый пост)
Сыроежка, я не проигнорировал ваш пост  Вы говорите, что с адресом массива не связаны никакие ячейки памяти, но почему тогда такая запись не выдаст ошибки?

код C++
1:
2:
3:

int arr[10];
arr[0];
*(arr+0); // массив ведет себя, как указатель!


Потому что при использовании имени массива в выражениях, за исключением некоторых случаев, как, например, использование оператора sizeof, массив преобразуется в указатель на его первый элемент.
PM MAIL   Вверх
volatile
Дата 29.6.2011, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  28.6.2011,  19:24 Найти цитируемый пост)
"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"

Ну коль цитату из стандарта С++ вы привести не смогли, будет разбирать то что есть.  smile 
Для полноты картины нужно еще определение понятия "correctly aligned for the pointed to type"
Мой приблизительный перевод "корректно выровнен на указываемый тип"
Означает ли это тоже самое что "выровнен на границу слова" ?

пример
Код

#pragma pack(1)
struct A
{
   char c;
   int  i;
} a;

int * p = &a.i;


В данном примере  указатель (p) корректно выровнен на указываемую переменную a.i типа int. 
Но он не выровнен не границу слова. Так что это разные вещи.

Без определение понятия "correctly aligned for the pointed to type", все дальнейшие ваши заключения ничего не стоят.
Так что жду от вас хотябы этого.



Это сообщение отредактировал(а) volatile - 29.6.2011, 23:37
PM MAIL   Вверх
fish9370
Дата 30.6.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(xvr @  29.6.2011,  12:55 Найти цитируемый пост)
Он и указывает. Проблема в том, что в виртуальной памяти (в отличии от физической) могут быть 'дырки', т.е. адреса, по которым никакой памяти нет. Ваш 123 попадает в одну из таких дырок. Попытка обратится туда приводит к эксепшену со стороны ОС


это не совсем так.. с точки зрения операционной системы (например линукс) каждый процесс получает свое __неразрывное__ виртуальное пространство (для 32 разрядной системы 4Гб).. в тоже время эта память делится на сегменты.. у каждого сегмента есть базовый адрес (начало сегмента) и его длина (либо в байтах, если он не превышает 1Мб, либо в страницах (обычно 4К), если он больше 1Мб), а так же за каждым сегментом закреплен тип (определяющий его назначение: сегмент кода, сегмент данных и т.д.)

к тому же, при загрузке программы в память, помимо самой программы, в это же пространство мэпятся и разделяемые библиотеки..

если обратиться к памяти, которая не предназначена для чтения (а например только для исполнения, как сегмент кода), либо в невыделеный сегмент, то это вызовет исключение, которое по дефолту убьет процесс..

PS плюс, вы забыли что вам твердит сыроежка, указатель нужно выравнивать


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 30.6.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(fish9370 @  30.6.2011,  00:33 Найти цитируемый пост)
это не совсем так.. с точки зрения операционной системы 

Это именно так с точки зрения архитектуры виртуальной памяти процессора (в данном случае х86) (весьма упрощенно, но тем не менее близко к истине). То, как операционная система использует эту виртуальную память - это уже 2й уровень абстракций. Предлагаю, ради сохранения здравого рассудка ТС, не вдаваться в такие подробности  smile 


PM MAIL   Вверх
Сыроежка
Дата 30.6.2011, 19:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  29.6.2011,  23:34 Найти цитируемый пост)
Ну коль цитату из стандарта С++ вы привести не смогли, будет разбирать то что есть.   
Для полноты картины нужно еще определение понятия "correctly aligned for the pointed to type"
Мой приблизительный перевод "корректно выровнен на указываемый тип"
Означает ли это тоже самое что "выровнен на границу слова" ?


Честно говоря, я вам не нянька, чтобы для вас делать выписки из стандарта. Почему бы вам самому не заглянуть в стандарт вместо того, чтобы фантазировать ? В стандарте С++ говорится тоже самое об выравнивании. 
Дело в том, что размер типов данных зависит от платформы. Но в любом случае обычно размер типа int выбирается равным размеру машинного слова. Для 32-битовых платформ, которые в настоящее время наиболее распространены, размер типа int равен 4 байтам. На 64-битовых платформах обычно размер типа int солставляет 8 байтогв. 
Но в любом случае функция malloc возвращает адрес, который выравнен соответствующим образом.
Говоря о границе слова, я лишь приводил конкретный пример для 32-битовых машин, чтобы на конкретноми примере пояснить вопрос.
Не заню по каким причинам, но то ли вы не поняли, что я говорил, то ли начинаете передергивать, так как попали в лужу со своим начальным комментарием, а теперь пытаетесь как-то выкрутиться!
На мой взгляд я все ясно сказал. Вопрос состоял в том, является ли корректным код, когда в указатель заносится значение, не выравненное надлежащим образом для конкретного типа данных. Я ответил, что нет, и привел цитаты из стандарта по крайней мере из стандарта С.

Вы же привели в качестве начального примера некорректный код, да еще пыьались утверждать, что это вполне нормально. При этом никаких цитат из стандарта вы лично не привели. Вы только требуется, чтобы вам кто-то что-то приводил в качестве цитат из стандарта.. А почему бы вам самому не почитать стандарт?!
PM MAIL   Вверх
xvr
Дата 30.6.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата из С++ 98 (какой был под руками)
Раздел 3.9 - Types
Цитата

Object types have alignment requirements. The alignment of complete object type is an implementation-defined integer value representing number of bytes; an object allocated at an address that meet alignment requirement of its object type/
Резюме - значения должны быть выровнены, но на сколько именно - зависит от реализации.  smile 
PM MAIL   Вверх
volatile
Дата 30.6.2011, 23:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



xvr, да эту фразу из стандарта С++ я видел. И это единственное что там нашел по этому поводу. (ну может не единственное, но такая-же фраза повторяется несколько раз, в разных местах)

А применять стандарт С к С++, не совсем корректно, там более выдержки без определения главной фразы.
Что они имели под термином "correctly aligned for the pointed to type"

Цитата(Сыроежка @  30.6.2011,  19:23 Найти цитируемый пост)
Не заню по каким причинам, но то ли вы не поняли, что я говорил, то ли начинаете передергивать, так как попали в лужу со своим начальным комментарием, а теперь пытаетесь как-то выкрутиться!

Кто сел еще надо подумать... smile 
Дальнейщий диспут, в таком тоне считаю бесполезным.


Это сообщение отредактировал(а) volatile - 1.7.2011, 00:37
PM MAIL   Вверх
Сыроежка
Дата 1.7.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(xvr @  30.6.2011,  22:37 Найти цитируемый пост)
Цитата из С++ 98 (какой был под руками)
Раздел 3.9 - Types

Цитата

Object types have alignment requirements. The alignment of complete object type is an implementation-defined integer value representing number of bytes; an object allocated at an address that meet alignment requirement of its object type/


Резюме - значения должны быть выровнены, но на сколько именно - зависит от реализации.    


Естественно! Зависит от используемой платформы. Ни в С, ни в С++ не гвоорится о размерах данных. Так что тип int может занимать 16 битова на 16-битовых  платформах, как, например,  в MS-DOS, либо 32 бита, либо 64 бита. Но в любом случае тип int соответсвует машинному слову, то есть соответсвует размеру регистров, которые и выполняют арифметические операции.. В этом и состоит сущность языка С и С++, что они максимально прибижены к платформе. То есть они тиспользуют собственные типы данных, существующие на конкретной платформе. Этим обусловлена эффективность этих языков. И именно поэтому их порой называют языками низкого уровня. 

PM MAIL   Вверх
volatile
Дата 2.7.2011, 00:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова.
(я по крайней мере не нашел, а вы ничего привести не смогли!)

А применять стандарт С99 к С++ не совсем корректно. (читай совсем не)
С++ если и произошел от С, то никак не от С99 smile 
это 2 разных языка.

Добавлено @ 00:15
А выборочные выдержки из стандарта С99, без определения основных терминов, вообще не могут рассматриваться в качестве аргументов в споре


Это сообщение отредактировал(а) volatile - 2.7.2011, 03:20
PM MAIL   Вверх
xvr
Дата 2.7.2011, 08:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @  1.7.2011,  16:04 Найти цитируемый пост)
стественно! Зависит от используемой платформы. Ни в С, ни в С++ не гвоорится о размерах данных.

здесь речь идет не о размере, а о выравнивании. И о том, что второе совсем не обязательно равно первому. Например классическая х86 система не требует выравнивания (т.е. align должен быть на 1), хотя и приветствует  smile 
 
PM MAIL   Вверх
Сыроежка
Дата 3.7.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  2.7.2011,  00:11 Найти цитируемый пост)
Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова.
(я по крайней мере не нашел, а вы ничего привести не смогли!)



Это вы сами с собой дискусируете?! Я нигде не гворил, что указатель должен быть выравнен на границу слова! Я приводил пример, ято если указатель является производным от типа int, то он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!


PM MAIL   Вверх
mes
Дата 3.7.2011, 18:02 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  14:45 Найти цитируемый пост)
он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!

но при этом выровнен не обязательно по размеру слова.. 



--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 3.7.2011, 18:10 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  3.7.2011,  18:02 Найти цитируемый пост)
Цитата(Сыроежка @  3.7.2011,  14:45 )
он должен быть выравнен в сосотевтсвии с выравниванием типа int. А тип int на различных платформах обычно выбирается равным слову!


но при этом выровнен не обязательно по размеру слова.. 


Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. 
То есть чтобы было понятно, на 32 -битовой платформе Intel тип int может равняться 16 битам. Но это соответсвует размеру регистра AX, то есть значению слова на той платформе (в данном случа 16-битовой), для совместимостью с которой создается компилятор.
PM MAIL   Вверх
mes
Дата 3.7.2011, 18:16 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  17:10 Найти цитируемый пост)
Я уже все ясно сказал! То, что вы не понимаете сказанного, это уже ваши личные проблемы! Тип int на платформах выбирается равным размеру слова. Есть только исключение, когда на платформе емкость регистров которой удваивается по сравнению с предыдущей реализацией данной платформы, тип int может равняться получлову. Но тем не менее он всегда соответсвует размеру регистра на исхдной платформе. 

Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны..  smile 



--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 3.7.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  3.7.2011,  18:16 Найти цитируемый пост)
Кроме одной детали : размер и выравнивание могут быть равны, но не обязаны..  


Я не встречал еще ассемблера, где при выделении памяти для слова, как, например,

Код

dw ?
или

для Intel

Код

ds  f


для IBM проходило выравнивание не по размеру слова!

PM MAIL   Вверх
mes
Дата 3.7.2011, 19:56 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  3.7.2011,  17:20 Найти цитируемый пост)
Я не встречал еще ассемблера, где при выделении памяти для слов ... проходило выравнивание не по размеру слова!

и что это доказывает ?




--------------------
PM MAIL WWW   Вверх
volatile
Дата 4.7.2011, 06:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  3.7.2011,  15:45 Найти цитируемый пост)
Я нигде не гворил, что указатель должен быть выравнен на границу слова


Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Указатель для типа int должен быть выровнен на границу слова.


без комментариев.
PM MAIL   Вверх
xvr
Дата 4.7.2011, 13:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



[QUOTE=Сыроежка,3.7.2011,  18:20]
Цитата(mes @  3.7.2011,  18:16 Найти цитируемый пост)

Я не встречал еще ассемблера, где при выделении памяти для слова, как, например,

Код

dw ?
или

для Intel

Код

ds  f

для IBM проходило выравнивание не по размеру слова!

Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds  smile Хочу полюбоваться  smile 

al.s
Код

    .text
    .byte 1
    .word 0x55aa
    .byte 0xa5

Код

> gcc -c al.s -o al.o
> objdump -s al.o                                                                                 
 
al.o:     file format elf64-x86-64
 
Contents of section .text:
 0000 01aa55a5                             ..U.    
как видим - никаких выравниваний  smile 

PM MAIL   Вверх
Сыроежка
Дата 5.7.2011, 17:44 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  4.7.2011,  06:28 Найти цитируемый пост)
Я нигде не гворил, что указатель должен быть выравнен на границу слова


Цитата(Сыроежка @  26.6.2011,  15:53 Найти цитируемый пост)
Указатель для типа int должен быть выровнен на границу слова.


без комментариев. 


Там все ясно было написано, что значение указателя на тип int дожно быть выравнено на границу слова в соответствии с выравниванием типа int.
.
PM MAIL   Вверх
Сыроежка
Дата 5.7.2011, 18:56 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(volatile @  2.7.2011,  00:11 Найти цитируемый пост)
Сыроежка,
В стандарте С++ нет ничего что говорит что указатель должен быть обязательно выровнен на границу слова.
(я по крайней мере не нашел, а вы ничего привести не смогли!)

А применять стандарт С99 к С++ не совсем корректно. (читай совсем не)
С++ если и произошел от С, то никак не от С99 smile 
это 2 разных языка.

Добавлено @ 00:15
А выборочные выдержки из стандарта С99, без определения основных терминов, вообще не могут рассматриваться в качестве аргументов в споре


У меня такое впечатление, что я имею дело не с адекватным человеком! Я говорил, что значение   указателя должны быть выравнено согласно выравниванию типа данных, на которое он указывает. Я несколько раз специально для вас это повторял и в качестве примера приводил указатель на тип int.  Во-вторых, совершенно не понятно, какие "определения  основных терминово" вам нужны? Любое цитирование стандарта предполагает ссылки на термины стандарта. Так что цитировать стандарт - это всегда корректно. В-третьих, стандарт С++ также требует выравнивание значений указателей в соответствии с выравниванием типов, на которые эти указатели указывают. Джае оставляя в стороне стандарты, а просто руководствуясь обычным здравым смыслом, очевидно, что в С и в С++ должно быть одно и то же выравнивание, так как модули на С и С++ очнь часто собираются в один проект. В противном случае любой проект, состоящий из смешанных модулей, был бы некорректным!

PM MAIL   Вверх
volatile
Дата 5.7.2011, 23:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  5.7.2011,  18:56 Найти цитируемый пост)
У меня такое впечатление, что я имею дело не с адекватным человеком!

Буквально с больной головы на здоровую smile 

Вам уже все ясно объяснили. Неплохо было бы признать свою ошибку.
Время на вас тратить не хочу больше. 
Извините.


PM MAIL   Вверх
Сыроежка
Дата 6.7.2011, 14:54 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(xvr @  4.7.2011,  13:09 Найти цитируемый пост)
Ой, покажите мне такой ассемблер (все равно для чего), который будет по своему усмотрению выравнивать dw или ds  smile Хочу полюбоваться  smile 

al.s
Выделить всёБез подсветки
    
    .text
    .byte 1
    .word 0x55aa
    .byte 0xa5

Выделить всёБез подсветки

    
> gcc -c al.s -o al.o
> objdump -s al.o                                                                                 
 
al.o:     file format elf64-x86-64
 
Contents of section .text:
 0000 01aa55a5                             ..U.    
как видим - никаких выравниваний  smile 


Вы очевидно относиетсь к тем программистам, опыт которых ограничен лишь работой на одной платформе, и которые начинают свято верить, что других аппаратных архитектур и операционных систем в природе просто не существует!smile
Я вам на самом деле уже все указал, просто вы не внимательно читаете, что вам другие пишут!
Есть такие вычислительные машины, как IBM mainframe. В настоящее время это серия Z, а операционная система соответственно называется z/OS. Так на этой платформе обращение к памяти, не выравненное соответсвующим образом приводит к аварийному завершению программы. Например, если вы в ассемблере для IBM, который называется HLASM ( от слов High Level Assembler ), зададите директиву

Код

WORDS    DS 3F


то память будет выравнена на границу слова. Если у вас есть знакомые, которые имеют дело с 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 памяти по нулевым адресам.

Так что смотрите на вещи ширше!smile И не думайте, что весь мир ограничен той платформой, на которой вы работаете!smile

Добавлено через 3 минуты и 41 секунду
Цитата(volatile @  5.7.2011,  23:15 Найти цитируемый пост)
Вам уже все ясно объяснили. Неплохо было бы признать свою ошибку.
Время на вас тратить не хочу больше. 
Извините.


Это вы хотите, чтобы я признал ваш бред в виде вашего кода


Код

int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);



который совершенно не соответсвтует стандартам С и С++?!! Вы уж лучше учите С/С++! Это вам пойдет на пользу!
PM MAIL   Вверх
mes
Дата 6.7.2011, 19:00 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  6.7.2011,  13:54 Найти цитируемый пост)
который совершенно не соответсвтует стандартам С и С++?!!

слишком жестко..  имхо, точнее было бы : который по стандарту является зависим от реализации/платформы.. 



--------------------
PM MAIL WWW   Вверх
Dov
Дата 6.7.2011, 20:30 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



Цитата(Сыроежка @  6.7.2011,  14:54 Найти цитируемый пост)
Вы уж лучше учите С/С++! Это вам пойдет на пользу!
   smile 

Михаил Жванецкий в таких случаях отвечает:
-  Не говорите, что мне нужно делать, и я не буду говорить, куда вам нужно идти... smile  



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
xvr
Дата 6.7.2011, 22:19 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @ 6.7.2011,  14:54)
Вы очевидно относиетсь к тем программистам, опыт которых ограничен лишь работой на одной платформе, и которые начинают свято верить, что других аппаратных архитектур и операционных систем в природе просто не существует!smile

Далеко не на одной, вынужден вас огорчить  smile SPARK, Itanium, ARM, x86, x86-64 Достаточно?

Цитата

Я вам на самом деле уже все указал, просто вы не внимательно читаете, что вам другие пишут!
'Другие' - это вы один. Вам же пишут хором (человек так 5), но вы похоже вообще не читаете  smile 

Цитата

Есть такие вычислительные машины, как IBM mainframe. 
Да, IBM у меня под столом не завалялось, увы  smile 

Цитата

Так на этой платформе обращение к памяти, не выравненное соответсвующим образом приводит к аварийному завершению программы. 
Ну и что? На SPARK'е это тоже так. И на ARM'е. А на x86 не так. И что это доказывает? Только то, что компьютеры бывают разные.

Когда на С или С++ объявляется статическая переменная типа int, то как раз генерируется директива ассемблера DS F. 
[/quote]gcc предпримет явные действия по выравниванию, а не будет полагаться на ассемблер

Код

char c1;
int i2;
long long ll1;


результат после g++ (ассемблер)

Код

    .file    "al.cc"
.globl _c1
    .bss
_c1:
    .space 1
.globl _i2
    .align 4
_i2:
    .space 4
.globl _ll1
    .align 8
_ll1:
    .space 8


Цитата

Когда вы сами удостоверитесь в том, что я написал, с помощью своих более опытных щнакомых, 
Я уже удостоверился, из первоисточника - компилятора. С более опытными 'щнакомыми' советую ознакомится вам, хотя видимо не поможет. Вам уже хором эти самые 'более опытные' говорят и говорят - все как об стенку горох  smile 

Цитата

Правильный код, написанный на С/С++, должен быть переносим, не так ли? 
Нет, не так. Может быть переносим, но не обязан. Переносимость - это всего лишь одно из требований к программе. Оно может требоваться, а может и не требоваться.

Цитата

Теперь представьте ситуацию, что ваш "правильный" код на одной платформе работает, а на другой платформе аварийно завершается.
Запросто могу представить. Для начала она (программа) скорее всего на другой платформе не соберется.

Цитата

 И что тогда делать с переносимостью языка?!
А ее и нет. Посмотрите на коды переносимых программ на С (или С++). Найдете кучу ifdef и прочих прелестей, для каждой конкретной платформы.

Цитата

Значит надо принимать такое решение в стандарте, чтобы исключить такую ситуцию, чтобы действительно правильный окд, который удовлетворяет стандарту, мог работать на любой платформе!

Это ваши домыслы. Стандарт этого не требует. Если вам нужен 100% переносимый код - пишите на Java, хотя и там 100% не получается  smile 

Цитата

Я вам приведу другой пример узости мышление подобного вашему. Он симметричен данной дискуссии, но только тогда оппонентом у меня выступал программист, работающий на IBM mainframe. ОН в стандартную строковую функцию передавал нулевой указатель. Когда я ему заявил, что так делать нельзя, и такое поведение программы неопределенное, он мне в ответ точно стал возражать походим образом, как это делаете вы. Он мне заявил, что программа нормально работает, так как IBM mainframe позволяет читать память по нулевым адресам. Убедить его было бесполезно, пока я его не подвел к Intel платформе, на которой вы работаете, и не показал, что программа завершается аварийно при попытке чтения в Windows памяти по нулевым адресам.
Ну и что? Его программа должна была работать на Windows? Если нет, то он абсолютно прав.

Цитата

Так что смотрите на вещи ширше!smile И не думайте, что весь мир ограничен той платформой, на которой вы работаете!smile

Не записывайте себя во 'весь мир'. 

Цитата

Это вы хотите, чтобы я признал ваш бред в виде вашего кода
Код

int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);


который совершенно не соответсвтует стандартам С и С++?!!
Соответствует. Код абсолютно правильный (для x86), и абсолютно не переносимый.

Цитата

 Вы уж лучше учите С/С++! Это вам пойдет на пользу!
Да уж, вам его учить не надо - на пользу явно не пошло  smile 


PS. И не надо со мной спорить, просто поверьте человеку, который принимал участие в написании как минимум 2х коммерческих компиляторов.  smile 



PM MAIL   Вверх
Сыроежка
Дата 7.7.2011, 17:38 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(xvr @  6.7.2011,  22:19 Найти цитируемый пост)
Нет, не так. Может быть переносим, но не обязан. Переносимость - это всего лишь одно из требований к программе. Оно может требоваться, а может и не требоваться.


Вынесете ересь! Почитайте в стандарте определение программы, строго соответсвтующей стандарту, и должна ли она выполняться на любой платформе. Вы даже этого определения из стандарта не знаете, а пытаетесь о чем-то рассуждать. Если следовать вашей логике, то стандарт вообще никакого смысла не имеет, так как есть различные платформы, которые. как говорится, что хотят, то и творят.

Цитата(xvr @  6.7.2011,  22:19 Найти цитируемый пост)
Это ваши домыслы. Стандарт этого не требует. Если вам нужен 100% переносимый код - пишите на Java, хотя и там 100% не получается  


Это не мои домыфслы, а это ваше полное не знание стандарта языков программирования С и С++! Вы даже не знаете, как я уже написал выше, определение строгогго соответсвия программы стандарту!



Цитата(xvr @  6.7.2011,  22:19 Найти цитируемый пост)
Да, IBM у меня под столом не завалялось, увы  


У вас не только IBM под рукой нет, нол ук вас и знаний С и С++ нет, но тем не менее вы свое невежество пытаетесь поставить выше стандарта.

И потом, я вам уже ясно сказал, что если на одной платформе обращение к памяти, не выравненной по границе типа данного заканчивается аварийно, а на друцгой нет, то это никак не связан, как вы наивно думаете, с платформами, а это связано с тем, что 1) код некорректный; 2) вы совершенно не знаете С и С++. И это никак не свуязано с особенностями платформ, как вы наивно думаете! Иначе бы просто С, как языка, не существаовало. Не догадываетесь, почему? Попробутй догадаться с трех раз! Не догадались? Я вам подскажу: тогда бы поведение программ было совершенно не предсказуемыма!

Однако, как вам это не покажется странным, это на самом деле не так! Я для IBM mainframe писал программы на Visual C++, так как у меня под рукой тоже не было IBM mainframe. И тем не менее код, написанный на Visual C++ без единой ошибке исполнялся на IBM mainframe, когда я его пересылал по электронной почте.

Извините, но далее ваш бред мне просто не интересно читать!
PM MAIL   Вверх
xvr
Дата 7.7.2011, 22:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
Почитайте в стандарте определение программы, строго соответсвтующей стандарту, и должна ли она выполняться на любой платформе. 

Ссылку из стандарта - на бочку!

Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
Это не мои домыфслы, а это ваше полное не знание стандарта языков программирования С и С++! Вы даже не знаете, как я уже написал выше, определение строгогго соответсвия программы стандарту!

Это уже наглость, причем безмерная.

Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
нол ук вас и знаний С и С++ нет, но тем не менее вы свое невежество пытаетесь поставить выше стандарта.

Мое терпение закончилось. Или вы предоставляете ссылки на пункты стандарта, о которых вы тут говорите, или получаете от меня предупреждение за наезды и клевету.

Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
И потом, я вам уже ясно сказал, что если на одной платформе обращение к памяти, не выравненной по границе типа данного заканчивается аварийно, а на друцгой нет, то это никак не связан, как вы наивно думаете, с платформами, а это связано с тем, что 1) код некорректный; 

Это уже 100% бред. Причем ничем не подкрепленный, кроме ваших слов, которым уже веры нет.


PM MAIL   Вверх
mes
Дата 7.7.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Сыроежка, чтоб долго не спорить, выделю главнoе : стандарт не определяет значений, а лишь определяет требования/правила..  так если по стандарту данные должны быть выровнены, то на сколько определяет платформа.. т.е. на платформе с выравниваением для int равным 1, код из первых постов, который у Вас вызывает отвращение, вполне корректный.. А чтоб он не был ill-formed на других платформах, можно добавить ограничения.. например  зa'ifdef`ить ..  smile
если ж, конечно, таковое требуется, так как есть множество кода, который по инным причинам не может быть "воспроизведен" на других платформах..  


Вы можете опровергнуть, если приведете выдержку из стандарта, показывающую, что выравнивание (пусть для int) не может быть равно 1. smile
smile

Это сообщение отредактировал(а) mes - 8.7.2011, 08:38


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 8.7.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
Почитайте в стандарте определение программы, строго соответсвтующей стандарту, и должна ли она выполняться на любой платформе.

такая программа соответствует стандарту ?
Код

#include <windows.h>
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 

    MSG msg; 
    ... 
    while ( GetMessage( &msg, (HWND) NULL, 0, 0 ) )
    { 
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    } 
    return msg.wParam; 


а ведь она даже не будет компилироваться на платформе, где нет windows, однако на windows-платформе - абсолютно корректная и выполняющая все требования стандарта... нет ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 8.7.2011, 09:28 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Мы тут все были потрясены опросом, устроенным нашим 'Гуру от Стандарта', где он потребовал от нас сокровенных знаний о существовании знакового чара и умопомрачительных тонкостей взаимодействия автоматического приведения типов и, страшно сказать, integer promotion. Я лично до сих пор бьюсь в истерике, от того, что не смог справится с этим невообразимо сложным заданием  smile  smile 

Что бы хоть как то загладить свою вину, я специально набросал небольшой квест. Я думаю, что для такого знатока стандарта, как Сыроежка, он будет не более, чем легкой разминкой перед завтраком. Квест тут  smile 

Если уважаемый Учитель Сыроежка справится с этим квестом, я торжественно клянусь smile  признать свое полное невежество не только в знании стандарта С++, но и в программировании вообще  smile 

А если не справится, то придется лишить Сыроежку звания Гуру и Учителя и забанить за необоснованные наезды на участников, и за выдачу своего личного мнения (причем ошибочного) за стандарт С++  smile 

PM MAIL   Вверх
boostcoder
Дата 8.7.2011, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(xvr @  8.7.2011,  09:28 Найти цитируемый пост)
 клянусь признать свое полное невежество не только в знании стандарта С++, но и в программировании вообще

фигасе smile 
PM WWW   Вверх
mes
Дата 8.7.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  8.7.2011,  08:28 Найти цитируемый пост)
Если уважаемый Учитель Сыроежка справится с этим квестом

ммм.. достаточно просто ответить на вопросы или аргументироватьцитатами из стандарта.. ? 

Цитата(xvr @  8.7.2011,  08:28 Найти цитируемый пост)
я торжественно клянусь

что то мне подсказывает, что квест Вы выбрали достаточно простой...


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 8.7.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



я вас сильно разочарую: сыроежка больше не появится smile 
PM WWW   Вверх
bsa
Дата 8.7.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(boostcoder @  8.7.2011,  10:23 Найти цитируемый пост)
я вас сильно разочарую: сыроежка больше не появится

почему?
PM   Вверх
boostcoder
Дата 8.7.2011, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(bsa @  8.7.2011,  16:44 Найти цитируемый пост)
почему?

обычно так и бывает...
ну не знаю почему...самомнение зашкаливает при провоцировании ситуации, и не позволяет признать что-то когда приходит время отвечать за слова...
PM WWW   Вверх
Сыроежка
Дата 8.7.2011, 18:01 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(borisbn @  8.7.2011,  08:37 Найти цитируемый пост)
Цитата(Сыроежка @  7.7.2011,  17:38 Найти цитируемый пост)
Почитайте в стандарте определение программы, строго соответсвтующей стандарту, и должна ли она выполняться на любой платформе.

такая программа соответствует стандарту ?
Выделить всёкод C++

    
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 

    MSG msg; 
    ... 
    while ( GetMessage( &msg, (HWND) NULL, 0, 0 ) )
    { 
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    } 
    return msg.wParam; 


а ведь она даже не будет компилироваться на платформе, где нет windows, однако на windows-платформе - абсолютно корректная и выполняющая все требования стандарта... нет ? 


А причем здесь С или С++? Вы вообще=то сами понимаете, что пишите? Вы обращаетесь к службам операционной системы. Ни С, ни С++ никакой ответсвенности за использование системно-зависимых вызовов ответсвенность не несет! Ни в С, ни в С++ не определяются такие функции!
Так что ваш пример крайне глупый!
PM MAIL   Вверх
Сыроежка
Дата 8.7.2011, 18:45 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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-битовая система, и код не использовал каких-то системно-зависимых вызовов.

С/С++ предполагают, что целые числа выравнены в соответсвии с кратностью их размеров. Почему это не прописано? Да просто потому, что стандарт не определяет размеры целых чисел. Он лишь определяет их ранги относительно друг друга. Кроме того сами стандарты несовершенно и постоянно редактируются. Так что это обычное дело для стандарта, если что-то четко не прописано. ВЫ можете послать свои предложенияч по уточнению стандарта в комитет по стандартизации.




PM MAIL   Вверх
xvr
Дата 8.7.2011, 20:02 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Мне надоело толочь в ступе одно и тоже, с теми, кто совершенно не разбирается в С/С++, и тем более в Java, на который здесь пытаются ссылаться

Мания величия в очень запущенной форме. Пациенту рекомендуется бан на форуме, пока не остынет  smile 

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Язык С/С++ совместим на разых платформах и переносим! То есть поведение С/С++ предсказуемо и определено согласно абстрактной вычислительной машины, описанной в стандарте. 

Угу, 'абстрактный конь в вакууме'  smile 

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Несовместим не язык, как тут по недопониманию заявляют некоторые, а несовместимы платформы между собой!

Вы не думали в политику пойти? Или в журналисты? Так перевернуть все с ног на голову - это надо иметь талант  smile 

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Например, на одной платформе размер целого числа может составлять 16 бит, на другой 32-бита, на третьей 64 бита, и т.д

Спасибо, о Великий Гуру! Как же мы раньше жили без столь великого знания!

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
С/С++ предполагают, что целые числа выравнены в соответсвии с кратностью их размеров.
Ссылка на стандарт будет?

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Почему это не прописано? 
Видимо не будет  smile 

Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
Так что это обычное дело для стандарта, если что-то четко не прописано.
Точно не будет  smile 

Демагог наш великий. Вы очень изящно заменяете задаваемые вам вопросы на другие, на которые и отвечаете (абсолютно правильно и последовательно, хотя и нафиг никому не нужно). Выдаете свое (порой ошибочное) мнение за стандарт, с формулировкой "Я ТАК СКАЗАЛ! Не нравится - ищите в стандарте сами". Любых несогласных с вами объявляете неучами, и отправляете учить стандарт  smile 

Когда вас ткнут носом (с примерами и ссылками на тот самый стандарт) в неувязки в вашей демагогии, вы объявляете виноватыми в узости мышления, незнании стандарта и прочих смертных грехах того, кто вас ткнул.

Я все еще жду от вас ссылки на стандарт, и ответов на квест в соседней теме, который я создал СПЕЦИАЛЬНО ДЛЯ ВАС!

Иначе я считаю вас троллем с всеми вытекающими последствиями



PM MAIL   Вверх
azesmcar
Дата 8.7.2011, 22:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Сыроежка @  8.7.2011,  18:45 Найти цитируемый пост)
То есть если вы не используете в программе системо-зависимых средств, то никаких проблем у вас не будет. 

а если использую - будут? очень интересно для чего тогда создаются расширения языка, intrinsic-и, поддержка inline assembler-а, платформозависимые библиотеки? Это все создается затем, чтобы у нас были проблемы?

Стандарт - как бы ты его не любил, это не пуп земли и вокруг него мир программиста C++ не вертится. Стандарт многое оставляет на усмотрение компилятора и основываясь на гарантиях конкретного компилятора я могу писать платформозависимый код на C++ и мне откровенно говорю до уличного осветительного прибора чье либо одобрение. Писать платформозависимый код там, где не нужна переносимость - это вполне нормально.
PM   Вверх
mes
Дата 9.7.2011, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  8.7.2011,  17:45 Найти цитируемый пост)
если ваш код не опирается на системно-зависящие вещи, полностью переносим.

при этом платформазависиммые не только внешние вызовы, но размеры типовов, а также их представление.. 
да если не на что зависимое код не опирается, он конечно же переносим.. но встает вопрос, в чем тогда преимущество этого языка ?

Цитата(Сыроежка @  8.7.2011,  17:45 Найти цитируемый пост)
А иначе и быть просто не может! В противном случае мы имели бы столько языков С, сколько существует платформ, и каждый язык имел бы свой синтаксис и свою семантику.

Вы подменяете понятия, вводя всех и себя в том числе в заблуждения..  
т.е. Вы счиатаете что если у языка семантика одна и та же на разных платформах, то корректная программа (по стандарту)  будет выдавать абсолютно один и тот же результат ?

Цитата(Сыроежка @  8.7.2011,  17:45 Найти цитируемый пост)
Язык С - это по сути дела универсальный ассемблер для любой платформы 

так кто то пару постов назад призывал думать широко..и что же ?! сами наступили на те же грабли ?! есть платформы на которых писать на (классическом) си не получится smile

Цитата(Сыроежка @  8.7.2011,  17:45 Найти цитируемый пост)
C/С++ предполагают,что целые числа выравнены в соответсвии с кратностью их размеров[/B] . Почему это не прописано? Да просто потому, что стандарт не определяет размеры целых чисел.

Размер не определяет, а выравнивание определил ?! хотя нет уже вы смягчили слово, теперь он "предполагает".. хотя вот откуда кратность взялась ?! 
а так Вы частично правы.. да стандарт опреляет и размер типов и их выравнивание.. только это уже другой стандарт.. smile






--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 10.7.2011, 16:22 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  9.7.2011,  01:32 Найти цитируемый пост)
при этом платформазависиммые не только внешние вызовы, но размеры типовов, а также их представление.. 
да если не на что зависимое код не опирается, он конечно же переносим.. но встает вопрос, в чем тогда преимущество этого языка ?


Цитата(mes @  9.7.2011,  01:32 Найти цитируемый пост)
Цитата(Сыроежка @  8.7.2011,  17:45 )
Язык С - это по сути дела универсальный ассемблер для любой платформы 


так кто то пару постов назад призывал думать широко..и что же ?! сами наступили на те же грабли ?! есть платформы на которых писать на (классическом) си не получится 


У меня такое впечатление, что вам очень тяжело связать вместе пару фраз! Вы спрашиваете, в чем преимущество С? Я вам ответил, что он играет роль универсального языка ассемблера высокого уровня для любой платформы.  А вы, как говорится, смотрите в книгу и видите фигу. 

Цитата(Сыроежка @  8.7.2011,  17:45 ) 
C/С++ предполагают,что целые числа выравнены в соответсвии с кратностью их размеров[/B] . Почему это не прописано? Да просто потому, что стандарт не определяет размеры целых чисел. 


Размер не определяет, а выравнивание определил ?! хотя нет уже вы смягчили слово, теперь он "предполагает".. хотя вот откуда кратность взялась ?! 

Да, размер не определяется, а выравнивание определяется. В стандарте С даже спциально есть определение понятия выравнивания. Не догадываетесь, для чего это нужно? А все очень просто. Это нужно для арифметики с указателями. Только и всего.

Добавлено через 9 минут и 49 секунд
Цитата(azesmcar @  8.7.2011,  22:37 Найти цитируемый пост)
а если использую - будут? очень интересно для чего тогда создаются расширения языка, intrinsic-и, поддержка inline assembler-а, платформозависимые библиотеки? Это все создается затем, чтобы у нас были проблемы?

Стандарт - как бы ты его не любил, это не пуп земли и вокруг него мир программиста C++ не вертится. Стандарт многое оставляет на усмотрение компилятора и основываясь на гарантиях конкретного компилятора я могу писать платформозависимый код на C++ и мне откровенно говорю до уличного осветительного прибора чье либо одобрение. Писать платформозависимый код там, где не нужна переносимость - это вполне нормально. 


Да, если вы используете ассемблер, то очевидно, что ассемблер на разных платформах разных. Так что странные у вас взгляды.

Стандарта - это как раз "пуп земли"! Потому что если язык не удовлетворяет стандарту, то значит вы говорите о чем-то другом, но не о языке С или С++. То есть ваши фантазии по поводу языка к самому языку никакого отношения не имеют. Более того как раз требование к кмопилятору, чтобы он имаксимально удовлетворял стандарту, является основным тербованием к компиляторам у профессионалов. Иначе ваш код просто будет мало того, что не переносим, а вообще его поведение будет непредсказуемым. Поэтому всякое отклонение от стандарта вы используете, кк говорится, на свой страх и риск. Но страшнее всего то, что порой такие ощиьки, связанные с отклонением о стандарта при переходе с одного компилятора на другой или с одной платформы на другую, порой трудно найти. И тогда поведение программы становится таким, как будто бы на нее влияет погода за окном: сегодня программа работает так, как ожидалось, а завтра совсем по другому. И, как я отметил, такие ошибки очень трудно натйи.

Просто вы, очевидно, не работали в крупных проектах, в которых число модулей, включая заголовочные файлы, превосходит 500. Вот тгогда бы я посмотрле бы, как бы вы искали ощибку, связанную с тем, что где-то в коде вы использовали конструкции, не соответсвутющие стандарту. 

Это только дял дилетантов, которые не понимают серьезность проблемы, станларт не является пупом земли. А фирмы, разработчики программного обеспечения, а также фирмы, занимающиеся разработкой компиляторв, поголовно состоят в комитетах по стандартизации. Потому что они понимают серьезность проблемы.
PM MAIL   Вверх
bsa
Дата 10.7.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Сыроежка, пример.
приходит пакет данных, с заголовком:
Код
char magic[2];
uint32_t hdrSize;
uint32_t dataSize;
....
uint16 data[dataSize]
Очевидно, что член hdrSize и последующие не будут иметь нужного выравнивания (именно в этих случаях используется арифметика указателей, о которой спрашивал ТС). Как это написать грамотно?
PM   Вверх
mes
Дата 10.7.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  10.7.2011,  15:22 Найти цитируемый пост)
У меня такое впечатление, что вам очень тяжело связать вместе пару фраз! 

Мне легко, я пытался , чтоб Вы осознали Ваши тупики без моей подсказки .. 
Чтоб не распыляться, так как Вы все время избегаете целевых вопросов, уделяя внимания оффтопику, еще раз уточню: 
где в стандарте сказанно, что выравнивание не может быть равно 1 ?
как стандартными средствами узнать выравнивание для нужного типа ?
почему если выравнивание на платформе 1, нельзя использовать код из первых постов.. 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 10.7.2011, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Сыроежка @  10.7.2011,  16:22 Найти цитируемый пост)
н играет роль универсального языка ассемблера высокого уровня для любой платформы

Любой ? И iOS (на чём у них там - на процессоре Samsung кажется), Android, Windows Phone 7 ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 10.7.2011, 20:36 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  10.7.2011,  16:22 Найти цитируемый пост)
А вы, как говорится, смотрите в книгу и видите фигу. 


Цитата(Сыроежка @  10.7.2011,  15:37 Найти цитируемый пост)
Это кто же вас таким непорядочным воспитал?!!! 



PM MAIL   Вверх
alexvs11
Дата 10.7.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



bsa
Код

struct  packet
{
  char magic[2];
  uint32_t hdrSize;
  uint32_t dataSize;
  .... 
  uint16 data[dataSize]
} __attribute__ ((packed));


так же проблем не должно возникнуть?
PM MAIL   Вверх
JackYF
Дата 10.7.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Ну вот, только отлучился -- и пропустил такой знатный ср обсуждение.

Сыроежка, не стоит считать всех глупее себя, ошибаются все. У тебя есть похвальное стремление писать программы по стандарту -- это отлично, но реальная жизнь стандартом не ограничиваются. Разработчики компиляторов, предоставляя сотни расширений, делают это не от нечего делать. Всего лишь один пример -- синтаксис текущий стандарта никак не может не повлиять на видимость символов разделяемой библиотеки. Признай свою ошибку, и двигайся дальше.

Хочется особо отметить не так давно пришедшего volatile -- так держать.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
fish9370
Дата 10.7.2011, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



 smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 10.7.2011, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата

Значительно легче переносится принципиальность. Она допускает отстаивание двух позиций одновременно, поэтому споры стали более интересными ввиду перемены спорящими своих взглядов во время споров, что делает трудным для наблюдения, но более коротким и насыщенным.


М. Жванецкий. XX Век (выдержка)


PM MAIL   Вверх
azesmcar
Дата 11.7.2011, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Да уж smile написал сперва много текста, потом стер. Какой смысл отвечать на чушь?
Сыроежка
Оставляешь впечатление человека, который вообще нихрена на C++ серьезнее чем Hello World не писал.

Это сообщение отредактировал(а) azesmcar - 11.7.2011, 09:31
PM   Вверх
bsa
Дата 11.7.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(alexvs11 @  10.7.2011,  20:41 Найти цитируемый пост)
так же проблем не должно возникнуть? 

должно, если я пользуюсь не GCC или совместимым компилятором. И вообще, твой код нестандартен. А надо сделать стандартно.
PM   Вверх
Сыроежка
Дата 13.7.2011, 15:31 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(JackYF @  10.7.2011,  21:34 Найти цитируемый пост)
Сыроежка, не стоит считать всех глупее себя, ошибаются все. У тебя есть похвальное стремление писать программы по стандарту -- это отлично, но реальная жизнь стандартом не ограничиваются. Разработчики компиляторов, предоставляя сотни расширений, делают это не от нечего делать. Всего лишь один пример -- синтаксис текущий стандарта никак не может не повлиять на видимость символов разделяемой библиотеки. Признай свою ошибку, и двигайся дальше.


И что из того, что разработчики делают сотни расширений?! Разве это оправдание того, что вы сами грубо нарушаете стандарт?! Не вижу абсолютно никакой логики в вашем высказывании. Есать лишь у вас желание любой ценой оправдать свое незнание стандарта. Только и всего.

Тут вообще со стороны смешно выглядет ваше поведение в дискуссии. Вы с пеной у рта пытаетесь оправдать ничем не обоснованное грубое нарушение стандарта. И ради чего? Только ради того, чтобы не признавать свое незнание стандарта.smile

Добавлено @ 15:38
Цитата(bsa @  10.7.2011,  17:43 Найти цитируемый пост)
Сыроежка, пример.
приходит пакет данных, с заголовком:
Выделить всёБез подсветки

char magic[2];
uint32_t hdrSize;
uint32_t dataSize;
....
uint16 data[dataSize]
Очевидно, что член hdrSize и последующие не будут иметь нужного выравнивания (именно в этих случаях используется арифметика указателей, о которой спрашивал ТС). Как это написать грамотно? 


Пакеты данных, очевидно, передаются по среде передачи упакованными. И их формат и выравнивание данных очень часто не соответствуют требованиям языков С/С++.

Как это грамотно описать? Обычно проимзводят базировние этого пакет по указателю char *, а затем делают необходимые преобразования и переписывают данные в подготовленную структуру. Очень часто для этих целей используется стандартная функция memcpy для выполнения копирования данных из пакета в переменные программы определенного типа. Тут также стоит отметить, что в пакете целочисленные данные могут быть представлены в формате как big indian, в то время как на вашей платформе они представляются в виде little indian. То есть обычно в любом случае требуется преобразование.



Это сообщение отредактировал(а) Сыроежка - 13.7.2011, 15:40
PM MAIL   Вверх
mes
Дата 13.7.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  13.7.2011,  14:31 Найти цитируемый пост)
Тут вообще со стороны смешно выглядет ваше поведение в дискуссии. Вы с пеной у рта пытаетесь

мне кажется Вы увлеклись рассматриванием отражения в экране..  smile 


Цитата(Сыроежка @  13.7.2011,  14:31 Найти цитируемый пост)
 ничем не обоснованное грубое нарушение стандарта. 

Цитата(Сыроежка @  26.6.2011,  18:13 Найти цитируемый пост)
То есть суть исходного вопроса, касающегосу игнорирования арифметики указателей сводится к следующему вопросу: является ли следующий код корректным?
Код

int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );


Ответ: не является!

позвольте узнать корректный аналог вышеприведенного кода.. научите, что там вместо +1 надо было написать..
smile



--------------------
PM MAIL WWW   Вверх
Сыроежка
Дата 13.7.2011, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  13.7.2011,  16:35 Найти цитируемый пост)
Цитата(Сыроежка @  26.6.2011,  18:13 Найти цитируемый пост)
То есть суть исходного вопроса, касающегосу игнорирования арифметики указателей сводится к следующему вопросу: является ли следующий код корректным?
Выделить всёкод C++
1:
2:
3:
    
int x = 10;
int *p = &x;
p = ( int * )( ( char * )p + 1 );


Ответ: не является!

позвольте узнать корректный аналог вышеприведенного кода.. научите, что там вместо +1 надо было написать..
smile



Очевидно, что до вас с первого раза не доходит. У данного некорректного кода есть лишь один аналог - это отсутствие этого некорректного кода. Надеюсь, еще через одну неделю вы не будете снова задавать этот вопрос.
PM MAIL   Вверх
boostcoder
Дата 13.7.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Сыроежка @  13.7.2011,  16:52 Найти цитируемый пост)
до вас с первого раза не доходит. У данного некорректного кода есть лишь один аналог - это отсутствие этого некорректного кода.

толсто.

Это сообщение отредактировал(а) boostcoder - 13.7.2011, 16:58
PM WWW   Вверх
mes
Дата 13.7.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Сыроежка @  13.7.2011,  15:52 Найти цитируемый пост)
Очевидно, что до вас с первого раза не доходит. У данного некорректного кода есть лишь один аналог - это отсутствие этого некорректного кода. Надеюсь, еще через одну неделю вы не будете снова задавать этот вопрос. 

т.е. прибавлять к указателю значение нельзя ? а если можно то какое ?

Добавлено через 43 секунды
естественно спрашивается  в контексте все того же вышеприведенного примера.. 



--------------------
PM MAIL WWW   Вверх
xvr
Дата 13.7.2011, 20:12 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Сыроежка @  13.7.2011,  15:31 Найти цитируемый пост)
данные могут быть представлены в формате как big indian, в то время как на вашей платформе они представляются в виде little indian.

Эээ, в формате Большого Индейца и Маленького Индейца? Или Индуса?  smile 
PM MAIL   Вверх
Shaggie
Дата 14.7.2011, 00:35 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Встречайте цирк с конями, на форуме наконец-то появился настоящий специалист! Старый Shaggie, как всегда, проморгал все важные события. Спасибо товарищам форумчанам, подсказали куда поглядывать.

Сыроежка, считать идеальным измученный годами, изменяющимися парадигмами, конкурентами, новыми веяниями и обратными совместимостями стандарт переусложнённого языка программирования - это просто верх садомазохизма!

Впрочем, его в треде оказалось предостаточно...


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Сыроежка
Дата 14.7.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(mes @  13.7.2011,  18:32 Найти цитируемый пост)
Цитата(Сыроежка @  13.7.2011,  15:52 Найти цитируемый пост)
Очевидно, что до вас с первого раза не доходит. У данного некорректного кода есть лишь один аналог - это отсутствие этого некорректного кода. Надеюсь, еще через одну неделю вы не будете снова задавать этот вопрос. 

т.е. прибавлять к указателю значение нельзя ? а если можно то какое ?

Добавлено через 43 секунды
естественно спрашивается  в контексте все того же вышеприведенного примера.. 


Увы, приходиться уже в десятый раз повторять, что этот код некорректный, если значение указателя не выравнено по границе типа int. А Денич Ритчи заявляет еще более строго, что для этого типа должно быть выравнивание по границе слова. Вы хотя бы прочитали книгу Дениса Ритчи "Программирование на С" в разделе, называющемся примерно следующим образом "связь между указателями и целыми числами", если вы стандарт не читаете.

Добавлено через 3 минуты и 5 секунд
Цитата(Shaggie @  14.7.2011,  00:35 Найти цитируемый пост)
Сыроежка, считать идеальным измученный годами, изменяющимися парадигмами, конкурентами, новыми веяниями и обратными совместимостями стандарт переусложнённого языка программирования - это просто верх садомазохизма!



У меня такое ощущение, что вы, как и многие из здесь присутствующих, совершенно не адекватны, и приписываете мне то, что я не говорил.
Я лишь сказал, что такой код, который здесь мусолят, некорректный и может привести к аварийному завершению программы на некоторых платформах. Он не удовлетворяет стандарту, не является, как говорится, implementation defined, а потому его поведение не предсказуемо. То есть это совершенно безграмотный код. 
PM MAIL   Вверх
volatile
Дата 14.7.2011, 23:23 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(Сыроежка @  14.7.2011,  18:57 Найти цитируемый пост)
А Денич Ритчи заявляет 

Сыроежка, Вам не надо книжки больше читать. Они вам не идут в прок.
Вы же не умеете программировать.  smile 
А теория без практики это NULL

PM MAIL   Вверх
Shaggie
Дата 15.7.2011, 02:27 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(Сыроежка @  14.7.2011,  19:57 Найти цитируемый пост)
такое ощущение, что вы, как и многие из здесь присутствующих, совершенно не адекватны

А то как же!  smile  smile

Цитата(Сыроежка @  14.7.2011,  19:57 Найти цитируемый пост)
такой код, который здесь мусолят, некорректный и может привести к аварийному завершению программы на некоторых платформах. Он не удовлетворяет стандарту, не является, как говорится, implementation defined, а потому его поведение не предсказуемо. То есть это совершенно безграмотный код.  

Обычно программисты не пишут некорректный код, который "может привести к аварийному завершению программы на некоторых платформах". Просто потому, что такой код сложен в чтении и чреват ошибками в дальнейшем. То есть попросту не нужен. Полезно уметь ценить своё время и время своих коллег.

Однако мы не живём в идеальном сферическом вакуумном мире. Мы инженеры. Наша работа, работа профессионалов своего дела, - решать проблемы заказчика. Всё! Часто в условиях ограниченных ресурсов (времени, памяти, нервов). Хороший код - это такой код, который решает задачи 1) текущей работоспособности, 2) дальнейшей поддержки.

Задачи бывают разные. Коллеги меня поймут, embedded программисты поймут в особенности. Дано: слабенький процессор, мизер памяти, приходится силой отвоёвывать каждый байт и каждый такт. В таких условиях код volatile
Код

int *p = адрес;
// сдвинуть на 3 байта
 p = (int*)((char*) p + 3);

бьёт дуплетом - он 1) работоспособен, 2) поддерживаем (за счёт комментария. И хотя он очень низкоуровнев и не даёт описания проблемы, из-за которой пришлось применить данный хак, при этом даже в текущем виде заметно облегчает чтение кода). 

Использование подобного кода в мейнстримной разработке бессмысленно и вредно. Опытные товарищи, заметив "хакерский" код и не получив внятного оправдания его использования, применяют карательные меры со всей надлежащей суровостью.

Краткие выводы по первым двум страницам темы: 1) такого рода код писать можно и в отдельных случаях он работает, 2) стандарт грозит пальчиком, 3) программисты всё это знают, сами так не пишут и других на это не одобряют, 4) но в случае необходимости трюки работают и помогают решить проблему.

Краткие выводы по остальным страницам: 1) хамов никто не любит.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
borisbn
Дата 15.7.2011, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Сыроежка, я тут подумал-подумал, а ведь получается, что Вы правы!
Я не понимаю этих людей, которые говорят о каком-то сферическом вакууме...
Давайте рассмотрим абсолютно реалистичную ситуацию (это я не только к Вам, а ко всем).

Дано (это предположение, все совпадения - случайны):
1. Допустим, в мессенджере QIP есть плагин для протокола ICQ, требующий реализацию в dll-ке такой ф-ции
Код
bool plugin_func( int * p );

Причём объявлена она без extern "C", и, соответственно, декорирована, т.е. изменить её интерфейс мы не можем.
2. В 0-м и в 42-м int'е протокола ICQ лежат требуемые для плагина данные.
3. Ваша и моя фирма делают реализацию такого плагина. Выглядят наши плагины абсолютно одинакого (во всяком случае в начале)
Код

bool plugin_func( int * p ) {
    int b0 = p[ 0 ];
    int b42 = p[ 42 ];
    if ( b42 > b0 ) {
        ...
    }
...
}

4. Но настаёт момент, когда ICQ меняет протокол (что скажете - сферический вакуум?), и теперь перед данными, которые шли и раньше добавляется один байт (допустим тип сообщения). На ICQ ни я ни Вы влиять не можем. На QIP тоже.

Что делаю я ? Переписываю плагин:
Код

bool plugin_func( int * p ) {
    p = (int*)((char*)(p) + 1); // CENCORED ICQ-шники поменяли протокол
    int b0 = p[ 0 ];
    int b42 = p[ 42 ];
    if ( b42 > b0 ) {
        ...
    }
...
}

Что делаете Вы ? Отказываетесь писать такой совершенно некорректный код.

Выводы (промежуточные):
Что в активе у меня ?
- мой плагин работает с новой версией протокола
- я продал 1 млн. плагинов за 99 коп. за штуку
Что у меня в пассиве ?
- я написал некорректный код
- я нарушил стандарт
- меня неодобрят в W3C
- мой код не будет работать на IBM mainframe и PIC-контроллерах
- я не стал миллионером (99 коп. же)
Что в активе у Вас ?
- Вы не поступились принципами
- Ваш код написан в полном соответствии со стандартом
- Вы чисты перед W3C
- Ваш плагин не будет падать на IBM mainframe и PIC-контроллерах
Что в пассиве у Вас ?
- Вас уволили

Итого (актив:пассив) - у меня 2:5, у Вас 4:1

Выводы (окончательные):
Вы абсолютно правы. Не слушайте этих неадекватных людей. Так держать!!!


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 15.7.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  15.7.2011,  07:27 Найти цитируемый пост)
- мой код не будет работать на IBM mainframe и PIC-контроллерах

ну тогда вопрос на засыпку, a что будете делать если надо, чтоб код также работал и на вышеперечисленных платформах ? smile 

Цитата(Shaggie @  15.7.2011,  01:27 Найти цитируемый пост)
Краткие выводы по первым двум страницам темы: 1) такого рода код писать можно и в отдельных случаях он работает, 2) стандарт грозит пальчиком, 3) программисты всё это знают, сами так не пишут и других на это не одобряют, 4) но в случае необходимости трюки работают и помогают решить проблему.

Краткие выводы по остальным страницам: 1) хамов никто не любит. 

 smile 


Это сообщение отредактировал(а) mes - 15.7.2011, 08:47


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 15.7.2011, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  15.7.2011,  08:46 Найти цитируемый пост)
ну тогда вопрос на засыпку, a что будете делать если надо, чтоб код также работал и на вышеперечисленных платформах ?

ещё раз перепишу плагин QIP'а для протокола ICQ для IBM mainframe и PIC-контроллеров:
Код

bool plugin_func( int * p ) {
#ifdef IBM_MAINFRAME || PIC_CONTROLLER
    char * pCh = (char*)p;
    pCh++; // CENCORED ICQ-шники поменяли протокол
#ifdef LITTLE_ENDIAN
    int b0 =   (unsigned int)pCh[ 0 ]
             | ( (unsigned int)(pCh[ 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 2 ]) << 16 )
             | ( (unsigned int)(pCh[ 3 ]) << 24 );
    int b42 =  (unsigned int)pCh[ 42 * 4 + 0 ]
             | ( (unsigned int)(pCh[ 42 * 4 + 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 3 ]) << 8 );
#else
    int b0 =   (unsigned int)pCh[ 3 ]
             | ( (unsigned int)(pCh[ 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 1 ]) << 16 )
             | ( (unsigned int)(pCh[ 0 ]) << 24 );
    int b42 =  (unsigned int)pCh[ 42 * 4 + 3 ]
             | ( (unsigned int)(pCh[ 42 * 4 + 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 0 ]) << 8 );
#endif
#else // это нужно для того невероятного случая, если IBM и PIC'и откажутся от QIP'а.
       // тогда код будет более читаемым :)
    p = (int*)((char*)(p) + 1); // CENCORED ICQ-шники поменяли протокол
    int b0 = p[ 0 ];
    int b42 = p[ 42 ];
#endif
    if ( b42 > b0 ) {
        ...
    }
...
}


IMHO замечательно получилось  smile . W3C будет довольна (довольно?)



Это сообщение отредактировал(а) borisbn - 15.7.2011, 09:30


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 15.7.2011, 09:09 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Представьте себе - мне надо написать программу управления для стиральной машины (для блока управления стиральной машины). Я вооружился стандартами, поднатужился, и выдал на гора совершенство. Оно соответствует всем пунктам стандарта, в нем нет ни строчки кода, о которой стандарт говорит implementation dependent (не говоря уже о более крепких выражениях). Оно использует только стандартные С и Posix библиотеки, и вообще оно полностью соответствует тому самому 'сферическому коню в вакууме'. 

Вопрос - если я откомпилю и запущу мою программу на PC, она превратится в стиральную машину?  smile А если нет, то нафига было надрываться и добиваться (тут - от слова 'добил') такого всеобъемлющего соответствия не только стандарту, но и всем мыслимым и немыслимым критериям совместимости?  smile

Добавлено через 10 минут и 10 секунд
Кстати, вот замечательное описание стиля спора Сыроежки:

Цитата

Стиль спора
Хватит спорить о вариантах зернопогрузчика. Долой диспуты вокруг технических вопросов.

Мы овладеваем более высоким стилем спора. Спор без фактов. Спор на темпераменте. Спор, переходящий от голословного утверждения на личность партнера.

Что может говорить хромой об искусстве Герберта фон Караяна? Если ему сразу заявить, что он хромой, он признает себя побежденным.

О чем может спорить человек, который не поменял паспорт? Какие взгляды на архитектуру может высказать мужчина без прописки? Пойманный с поличным, он сознается и признает себя побежденным.

И вообще, разве нас может интересовать мнение человека лысого, с таким носом? Пусть сначала исправит нос, отрастит волосы, а потом и выскажется.

Поведение в споре должно быть простым: не слушать собеседника, а разглядывать его или напевать, глядя в глаза. В самый острый момент попросить документ, сверить прописку, попросить характеристику с места работы, легко перейти на "ты", сказать: "А вот это не твоего собачего ума дело", и ваш партнер смягчится, как ошпаренный.

В наше время, когда уничтожают вредных насекомых, стерилизуя самцов, мы должны поднять уровень спора до абстрактной высоты. Давайте рассуждать о крахе и подъеме Голливуда, не видя ни одного фильма. Давайте сталкивать философов, не читая их работ. Давайте спорить о вкусе устриц и кокосовых орехов с теми, кто их ел, до хрипоты, до драки, воспринимая вкус еды на слух, цвет на зуб, вонь на глаз, представляя себе фильм по названию, живопись по фамилии, страну по "Клубу кинопутешествий", остроту мнений по хрестоматии.

Выводя продукцию на уровень мировых стандартов, которых никто не видел, мы до предела разовьем все семь чувств плюс интуицию, которая с успехом заменяет информацию. С чем и приходится себя поздравить. Прошу к столу - вскипело!

М. Жванецкий

PM MAIL   Вверх
mes
Дата 15.7.2011, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  15.7.2011,  08:07 Найти цитируемый пост)
LITTLE_INDIAN

видать замечание про индейцов прошло даром..  smile 


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 15.7.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  15.7.2011,  09:27 Найти цитируемый пост)
видать замечание про индейцов прошло даром..

вот чёрт. Видел же замечание, залез в первую попавшуюся доку, увидел
Цитата

Q_LITTLE_ENDIAN

и всё равно лажанул :( 
исправил.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 15.7.2011, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  15.7.2011,  08:07 Найти цитируемый пост)
 int b0 =   (unsigned int)pCh[ 0 ]
             | ( (unsigned int)(pCh[ 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 2 ]) << 16 )
             | ( (unsigned int)(pCh[ 3 ]) << 24 );
    int b42 =  (unsigned int)pCh[ 42 * 4 + 0 ]
             | ( (unsigned int)(pCh[ 42 * 4 + 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 3 ]) << 8 );
#else
    int b0 =   (unsigned int)pCh[ 3 ]
             | ( (unsigned int)(pCh[ 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 1 ]) << 16 )
             | ( (unsigned int)(pCh[ 0 ]) << 24 );
    int b42 =  (unsigned int)pCh[ 42 * 4 + 3 ]
             | ( (unsigned int)(pCh[ 42 * 4 + 2 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 1 ]) << 8 )
             | ( (unsigned int)(pCh[ 42 * 4 + 0 ]) << 8 

однако..  smile 
мы за ценой не постоим ©


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 15.7.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  15.7.2011,  09:31 Найти цитируемый пост)
однако..   мы за ценой не постоим

ну а что сейчас не так ?   smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 15.7.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  15.7.2011,  08:35 Найти цитируемый пост)
ну а что сейчас не так ?   

операция по чтению невыровненных данных легко выносится в функцию, и весь этот копипаст уйдет по добру и здорову smile



Это сообщение отредактировал(а) mes - 15.7.2011, 09:38


--------------------
PM MAIL WWW   Вверх
baldina
Дата 15.7.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(borisbn @  15.7.2011,  09:07 Найти цитируемый пост)
довольна (довольно?)

доволен. ето консорциум

Добавлено через 1 минуту и 21 секунду
 smile эх, как хочется тоже че-нить написать, про индейцев и ендейцев в т.ч., жаль времени нет, работать надо(((

Добавлено через 2 минуты и 39 секунд
а таки согласитесь, Сыроежка внес свежую струю (поручик, молчать!) в С++-сные разделы
PM MAIL   Вверх
borisbn
Дата 15.7.2011, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(mes @  15.7.2011,  09:38 Найти цитируемый пост)
легко выносится в функцию

я просто соптимизировал за компилятор, чтоб не делать лишних push/call/pop.
Шутю, ессно smile

Добавлено через 3 минуты и 23 секунды
тем более я не знаю, что там за компилер в IBM и в PIC smile

Добавлено через 8 минут и 36 секунд
и вообще, я в интернет кафе сижу, и уменя деньги заканчиваются, так что мне некогда думать об оптимальности кода © самизнаетекто
 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Сыроежка
Дата 15.7.2011, 18:01 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(borisbn @  15.7.2011,  08:27 Найти цитируемый пост)
Выводы (промежуточные):
Что в активе у меня ?
- мой плагин работает с новой версией протокола
- я продал 1 млн. плагинов за 99 коп. за штуку
Что у меня в пассиве ?
- я написал некорректный код
- я нарушил стандарт
- меня неодобрят в W3C
- мой код не будет работать на IBM mainframe и PIC-контроллерах
- я не стал миллионером (99 коп. же)
Что в активе у Вас ?
- Вы не поступились принципами
- Ваш код написан в полном соответствии со стандартом
- Вы чисты перед W3C
- Ваш плагин не будет падать на IBM mainframe и PIC-контроллерах
Что в пассиве у Вас ?
- Вас уволили


Извините, но я совершенно ничего не понял. Почему вы решили, что если вы написали плохой код, темп более который падает на многих платформах, то вы продали  миллион плагинов, а тот, кто написал корректный код, да который к тому же не падает на многих платформах, ничего не продал?!

Знаете, я знаю многгих торгашей, которые быстро продают испорченный товар. Но, как правило, их судьба заканчивается в отделении милиции открытием уголовного дела. Да и потребители могут замучить и затаскать вас по судам, требуя качественный продукт в соответсвии с Законом о потребителях.

Я не знаю, почему вы так наивно верите в сказки, что если вы делаете некачественный продукт, то вы процветаете? Я не вижу никаких логических обоснований этому вашему верованию. Чтобы вам была понятно ситуция, то приведу жизненный пример, а не ваши фантазии. Как-то я посетил ресторан, в котолром мне довольно быстро подсунули не то вино, которое я заказал, а какой-то дешевый суррогат, но по цене того вина, что я заказал. Знаете, каков результат? Я перестал посещать этот ресторан. А еще через полгода этот ресторан закрылся, так как рядом открылся ресторан конкурентов, где клиентам давали именно то, что они заказывали.

Как вам эта моя история?!smile
PM MAIL   Вверх
asmdzen
Дата 15.7.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



 smile 
Цитата(Сыроежка @  15.7.2011,  18:01 Найти цитируемый пост)
где клиентам давали именно то, что они заказывали

с софтом немного сложнее определить что это не то что заказывалось, думаю главное чтоб программный продукт выполнял то что от него требуется, а как там внутри все написано пользователя не должно волновать. Если заказчик скажет что этот продукт должен работать на таких-то процессорах и таких-то система - это уже другое дело, но если этого не было то программер в праве писать как ему заблагорассудится. 
PM MAIL   Вверх
volatile
Дата 15.7.2011, 23:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Просто случайно наткнулся, 
Отрывок из "C:\Program Files\Microsoft Visual Studio 9.0\VC\ce\atlmfc\include\atlstdthunk.h" 
Библиотека ATL от мелкомягких.

Код

#pragma pack(push,1)
struct _stdcallthunk
{
    DWORD   m_mov;
    DWORD   m_this;
    BYTE    m_jmp;
    DWORD   m_relproc;
    BOOL Init(DWORD_PTR proc, void* pThis)
    {
        m_mov = 0x042444C7;  //C7 44 24 0C
        m_this = PtrToUlong(pThis);
        m_jmp = 0xe9;
        m_relproc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(_stdcallthunk)));
        // write block from data cache and
        //  flush from instruction cache
        FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));
        return TRUE;
    }
#pragma pack(pop)

Для тех кто не в теме виндов,
Код

typedef unsigned char       BYTE;
typedef unsigned long       DWORD;

Сыроежка, вам нужно срочно писать Биллу Гейтсу, чтоб он закрывал свой ресторан.  smile
Подайте на него в суд!

PM MAIL   Вверх
borisbn
Дата 16.7.2011, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(volatile @  15.7.2011,  23:45 Найти цитируемый пост)
m_mov = 0x042444C7;  //C7 44 24 0C

 smile 

Цитата(volatile @  15.7.2011,  23:45 Найти цитируемый пост)
Биллу Гейтсу

 smile 
Стиву Балмеру  smile 




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 16.7.2011, 00:38 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Хорошо, пусть Стиву Балмеру.
Начать письмо следует так:
Сыроежка to Steven Ballmer
Цитата(Сыроежка @  14.7.2011,  18:57 Найти цитируемый пост)
такой код, ... некорректный и может привести к аварийному завершению программы на некоторых платформах. Он не удовлетворяет стандарту, не является, как говорится, implementation defined, а потому его поведение не предсказуемо. То есть это совершенно безграмотный код.  


Как они посмели в библиотеке, которая кстати обязана компилится на любом компиляторе С++ под win, писать такой совершенно безграмотный & implementation defined код?

Пусть Сыроежка научит этого безграмотного Стива Балмера, как нужно писать программы.

хотя, честно говоря, даже меня несколько коробит от такого кода. А ведь ничо, работает! smile 
PM MAIL   Вверх
borisbn
Дата 16.7.2011, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Specially for РазорителяМестныхКафешек.

Цитата(Сыроежка @  15.7.2011,  18:01 Найти цитируемый пост)
Извините, но я совершенно ничего не понял


Для особо одарённых:
- делать зубочистки из красного дерева - бессмысленно
- делать туалетную бумагу 150мг/см - идиотизм
- давать первокласснику с собой в школу iPhone - глупо
- писать плагин в QIP для ICQ с тем, чтобы он работал на Cray, IBM Blue Gene и на стиральной машине - верх безумства


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Сыроежка
Дата 16.7.2011, 20:17 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(borisbn @  16.7.2011,  11:15 Найти цитируемый пост)
Для особо одарённых:
- делать зубочистки из красного дерева - бессмысленно
- делать туалетную бумагу 150мг/см - идиотизм
- давать первокласснику с собой в школу iPhone - глупо
- писать плагин в QIP для ICQ с тем, чтобы он работал на Cray, IBM Blue Gene и на стиральной машине - верх безумства 



Теперь понял! Вы делаете зубочистки, туалетную бумагу и т.д. У меня только вопрос, а что вы делаете на форуме программистов?!
PM MAIL   Вверх
borisbn
Дата 16.7.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Сыроежка @  16.7.2011,  20:17 Найти цитируемый пост)
Вы делаете зубочистки, туалетную бумагу и т.д.

Я б с удовольствием занялся бы этим и т.д., но это место уже занято оч.уважаемым мною человеком - Стивом.
Я так понял, что Вам доставляет удовольствие ругань, поэтому не буду его Вам доставлять.
No comments.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 16.7.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(borisbn @  16.7.2011,  22:49 Найти цитируемый пост)
уважаемым мною человеком - Стивом

это кто? и за что уважаем?
PM WWW   Вверх
borisbn
Дата 16.7.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(boostcoder @  16.7.2011,  22:59 Найти цитируемый пост)
это кто? и за что уважаем?

Цитата(Сыроежка @  16.7.2011,  20:17 Найти цитируемый пост)
давать первокласснику с собой в школу iPhone

iPhone - Стив...

Цитата(mes @  16.7.2011,  23:03 Найти цитируемый пост)
Новый "Билл Гейтс"

 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 16.7.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



borisbn, это типа тот кто сейчас яблокофоны архитектирует? я правильно понял? это отдельный вопрос.
а уважаешь-то за что?

Добавлено @ 23:11
за то что айфон красивый?

Это сообщение отредактировал(а) boostcoder - 16.7.2011, 23:12
PM WWW   Вверх
borisbn
Дата 16.7.2011, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



boostcoder,  smile 
Прикалываешься чоле ? Про Стива Джобса не слышал ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 16.7.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



я не пытаюсь принизить его уважаемость. просто хочу понять.
это чтоб меня камнями не закидали за сомнение в его уважаемости.

Добавлено @ 23:19
Цитата(borisbn @  16.7.2011,  23:11 Найти цитируемый пост)
Прикалываешься чоле ?

ни разу.

Цитата(borisbn @  16.7.2011,  23:11 Найти цитируемый пост)
Про Стива Джобса не слышал ?

имя слышал. но не знаю кто это.
пока ты искал подвох в моем вопросе, нарыл это: Стив Джобс.

Добавлено @ 23:21
мое личное мнение: мне, конкретно его, уважать не за что. ну ничего он для меня полезного не сделал. скажу даже больше....почти уверен в том, что пока он изобретал айфон, в африке умерли тысячи детишек, банально от голода. и чем он им помог? - айфонами накормил? в добавок, я противник коммерческого ПО. но это ИМХО, учтите.

Добавлено @ 23:22
ой холиварная это тема..завязываю.

Это сообщение отредактировал(а) boostcoder - 16.7.2011, 23:22
PM WWW   Вверх
volatile
Дата 17.7.2011, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Походу этот сумасшедший не только здесь людям мозги компостирует тынц. Какие однако тролли нынче пошли подкованные! Там вроде пока еще даже не раскусили, что это фальшивка smile.
PM MAIL   Вверх
fish9370
Дата 17.7.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



сыроежка - это олицетворение стандарта.. ему кажется, что стандарт это он.. 
кстати, там он сказал, что больше не готов дискутировать, так что скоро он вернется..  smile 


--------------------
undefined
PM MAIL WWW ICQ   Вверх
volatile
Дата 17.7.2011, 12:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(fish9370 @  17.7.2011,  10:54 Найти цитируемый пост)
ему кажется, что стандарт это он.. 

В старое доброе время, максимум что могло придти таким в голову, это объявить себя Наполеоном.
А теперь стандарты C/C++!

Да уж, времена пошли...

PM MAIL   Вверх
Сыроежка
Дата 17.7.2011, 19:14 (ссылка)    | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(borisbn @  16.7.2011,  23:11 Найти цитируемый пост)
boostcoder,  smile 
Прикалываешься чоле ? Про Стива Джобса не слышал ? 



Я очень сильно сомневаюсь, что Стив Джоббс стал бы уважать вас самого! Но тем не менее вам самому уважать кого угодно не возброняется. Проблема лишь в том, что к сожалению сам Стив Джоббс не знает о том, что вы его уважаете. А то несомненно он бы обрадовался!smile

Это сообщение отредактировал(а) Сыроежка - 17.7.2011, 19:26
PM MAIL   Вверх
borisbn
Дата 17.7.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Сыроежка @  17.7.2011,  19:14 Найти цитируемый пост)
Но тем не менее вам самому уважать кого угодно не возброняется

yyyyyyyyyyyyyeeeeees! Мне разрешили!!! 

Съели!!!
Кто ещё может похвастаться высшим соизволением?


Цитата(Сыроежка @  17.7.2011,  19:14 Найти цитируемый пост)
Я очень сильно сомневаюсь, что Стив Джоббс стал бы уважать вас самого! 

специально для необразованных ламеров - Вас пишется с большой буквы.
Для дебилов повторяю - Вас - с большой. Вас - с большой.
Дошло ?

К сообществу vingrad'а - сорри, что сорвался, но достал. Реально достал


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
triclosan
Дата 17.7.2011, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



borisbn, раздел о С++ не место для политических дискуссий

PM MAIL   Вверх
borisbn
Дата 17.7.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



triclosan
> сорри, что сорвался, но достал. Реально достал
smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Сыроежка
Дата 18.7.2011, 19:46 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: 1
Всего: 1



Цитата(borisbn @  17.7.2011,  21:34 Найти цитируемый пост)
специально для необразованных ламеров - Вас пишется с большой буквы.
Для дебилов повторяю - Вас - с большой. Вас - с большой.
Дошло ?



Я бы попросил модератора форума обратить внимание на данного грубияна, который, во-первых, разводит флуд, во-вторых. просто переходит на оскорбления, то есть его сообщение состоит лишь из одних оскорблений 
PM MAIL   Вверх
bsa
Дата 18.7.2011, 19:58 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Тема закрывается, так как она переросла в бессмысленный спор

PM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.4868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.