yanart
Гость
|
|
« Ответ #30 : 28-08-2009 09:53 » |
|
yanart, зачем такой опасный способ, в посте sss #2 всё гораздо лучше сделано )
Алексей1153++, если вы считате что код опасный, разверните свой ответ. Я в этом коде не вижу никакой опасности, даже если unsigned long будет 10 байт. Ведь сначало идут младшие байты числа, а нам надо поменять старший байт младщего слова. Зачем громоздить лишнего (пример исходник sss). Считаю, если делать сдвигами - влияет на быстродействие, если асмом, то конечно вариант, но не все знают ассемблер, мой вариант простой. Уж, извините, если что не так.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #31 : 28-08-2009 10:00 » |
|
yanart, 1) развёртываю: void main() { u.dw = 0x77778899; u.b[111]=0xCC; // вылет или попорченные данные программы} 2) Считаю, если делать сдвигами - влияет на быстродействие
компилятор всё это превратит в прямые подстановки адресов байтов, и не будет рантайм сдвигов Работать будет мновенно громоздкости у sss не вижу , вижу только правильное обращение с памятью 3) если асмом, то конечно вариант
абсолютно не вариант
|
|
« Последнее редактирование: 28-08-2009 10:02 от Алексей1153++ »
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #32 : 28-08-2009 10:04 » |
|
yanart, 1) развёртываю: void main() { u.dw = 0x77778899; u.b[111]=0xCC; // вылет или попорченные данные программы} 2) Считаю, если делать сдвигами - влияет на быстродействие
компилятор всё это превратит в прямые подстановки адресов байтов, и не будет рантайм сдвигов Работать будет мновенно громоздкости у sss не вижу , вижу только правильное обращение с памятью 3) если асмом, то конечно вариант
абсолютно не вариант Извините, так тогда по вашему и со строками работать "опасный код" char s[10]; s[111]='a';
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #33 : 28-08-2009 10:06 » |
|
yanart, для строк существуют: 1) спецклассы (std::string , CString) 2) const char* s; s="a"; + функции работы со строками 3) ну и почитать книжки по с++ yanart, ты попробуй код sss, потом поделай действий и посмотри в дизассемблере Давай, если ты убираешь рекламу , мы просто будем считать тебя новичком, а не спамером ?
|
|
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #34 : 28-08-2009 10:22 » |
|
yanart, для строк существуют: 1) спецклассы (std::string , CString) 2) const char* s; s="a"; + функции работы со строками 3) ну и почитать книжки по с++ yanart, ты попробуй код sss, потом поделай действий и посмотри в дизассемблере Давай, если ты убираешь рекламу , мы просто будем считать тебя новичком, а не спамером ? Я её уже давно убрал! Я единственное не понимаю, почему такая агрессия на форуме, ну да была реклама, так как я не увидел, что нельзя рекламу в подписи делать, можно было в личку написать, я бы её убрал. Я ведь не ради наживы! Просто я сейчас создаю бесплатные видеоуроки по С++, ну и народу может было бы интересно, я со своего сайта ведь с этой рекламмы ни копейки не получу. Написал код, сразу его обхаяли! Ну вот скажи мне, какой идиот напишет в своей программе u.b[111]=0xCC; когда объявил массив из 4-ех элементов? Ладно, согласен, для работы со строками есть классы, только не всегда ими хочется пользоваться. А если не со строками int A[10]; A[101]=666; Какой класс посоветуете? Конечно можно написать свой, а то вдруг за пределы массива выскочу;) ведь так?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #35 : 28-08-2009 10:23 » |
|
Алексей1153++, не, а кто мешает написать функции побайтовой работы с long? Не вижу ничего плохого в массиве. Можно ещё: union { long value; struct { char first; char second; char third; char fourth; } bytes; }
И следить за выравниванием.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #36 : 28-08-2009 10:32 » |
|
Ну вот скажи мне, какой идиот напишет в своей программе u.b[111]=0xCC; когда объявил массив из 4-ех элементов?
да любой, и не обязательно идиот. Раз класс это позволяет напрямую сделать - ошибка может случиться. А вот если бы ты сделал этот массив private , ябы ни слова не сказал Ладно, согласен, для работы со строками есть классы, только не всегда ими хочется пользоваться. А если не со строками int A[10]; A[101]=666;
Какой класс посоветуете? Конечно можно написать свой, а то вдруг за пределы массива выскочу;) ведь так?
да любой из названных + самописный Dimka, дык, что угодно можно написать, лишь бы не делать явных грубых ошибок ) yanart, а насчёт агрессии - так это я с недосыпу. Ну и вообще, я очень агрессивный
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #37 : 28-08-2009 12:10 » |
|
Алексей1153++, работа с двойным словом побайтово с целью именно доступа к байтам - это, имхо, в любом случае низкоуровневая работа, требующая внимательности и прямых рук. Поэтому можно делать как угодно, лишь бы метод был переносимым и надёжным с точки зрения компиляции правильного кода. Кстати, у sss в примере был char arry[sizeof(DWORD)]; в структуре (и это, к слову, лучше, чем arry[4])
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #38 : 28-08-2009 14:46 » |
|
ну это я не заметил - char arry[sizeof(DWORD)];
) Но поля всё таки безопаснее
|
|
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #39 : 28-08-2009 16:36 » |
|
Алексей1153++, работа с двойным словом побайтово с целью именно доступа к байтам - это, имхо, в любом случае низкоуровневая работа, требующая внимательности и прямых рук. Поэтому можно делать как угодно, лишь бы метод был переносимым и надёжным с точки зрения компиляции правильного кода. Кстати, у sss в примере был char arry[sizeof(DWORD)]; в структуре (и это, к слову, лучше, чем arry[4]) Согласен, но так как мы обращаемся к старшему байту младшего слова, это не существенно.
|
|
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #40 : 28-08-2009 16:40 » |
|
Алексей1153++, а как бы ты решил следующую задачу со своей МЕГАбезопасностью? Переставить местами в строке первый и последний элементы. Интересно посмотреть char s[]="Hello word"; ...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #41 : 28-08-2009 16:44 » |
|
фигня задача ) char s[]="Hello word";
int len=::strlen(s); if(len) { char c=s[0]; s[0]=s[len-1]; s[len-1]=c; }
yanart, я ж к чему прицепился то ? Не из удовольствия, а справедливости ради: ты советуешь человеку public массив , вместо private массива+public методов. Только к этому, а так не на что обижаться
|
|
« Последнее редактирование: 28-08-2009 16:46 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 28-08-2009 16:47 » |
|
а про "со своей МЕГАбезопасностью? " зря язвишь - вот программы таких как ты хакеры и используют для распространения вирусов. Лучше я поманьячу с надёжностью, чем потом изза меня ограбят банк а типом char[] я не пользуюсь, только const char* или CString. Последнее часто экономит время и силы
|
|
|
Записан
|
|
|
|
yanart
Гость
|
|
« Ответ #43 : 28-08-2009 16:49 » |
|
Задача то простая, не ну согласись, код опасный, за пределы можно вылезти Ладно, предлагаю дружбу
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #44 : 28-08-2009 16:51 » |
|
да никто и не ссорился, заметь )
Насчёт опасного кода - так это же не член класса, поэтому и опасно ))
|
|
|
Записан
|
|
|
|
|