Здравствуйте, Schade, Вы писали:
S>Здравствуйте, Bigger, Вы писали:
B>>а чего смешного
S>
B>>memcpy(dest, src, sizeof(src));
S>
S>Предлагаю подумать, что получится в случае, когда dest и src имеют тип char* и вообще указатель (что и имеет место быть в примере jazzer'а). И вообще, что такое sizeof.
В примере не было ни чего видно, там вообще не было объявлений.
Там вообще-то копирование массива.
Про функцию
Copies characters between buffers.
void *memcpy(
void *dest,
const void *src,
size_t count
);
wchar_t *wmemcpy(
wchar_t *dest,
const wchar_t *src,
size_t count
);
Parameters
dest
New buffer.
src
Buffer to copy from.
count
Number of bytes to copy.
Return Value
The value of dest.
Remarks
Copies count bytes of src to dest. If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions.
Security Note Make sure that the destination buffer is the same size or larger than the source buffer. For more information, see Avoiding Buffer Overruns.
Requirements
Routine Required header Compatibility
memcpy
sizeof
The sizeof operator yields the size of its operand with respect to the size of type char.
Grammar
unary-expression:
sizeof unary-expression
sizeof ( type-name )
The result of the sizeof operator is of type size_t, an integral type defined in the include file STDDEF.H. This operator allows you to avoid specifying machine-dependent data sizes in your programs.
The operand to sizeof can be one of the following:
A type name. To use sizeof with a type name, the name must be enclosed in parentheses.
An expression. When used with an expression, sizeof can be specified with or without the parentheses. The expression is not evaluated.
When the sizeof operator is applied to an object of type char, it yields 1. When the sizeof operator is applied to an array, it yields the total number of bytes in that array, not the size of the pointer represented by the array identifier. To obtain the size of the pointer represented by the array identifier, pass it as a parameter to a function that uses sizeof. For example:
Example
// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
char szHello[] = "Hello, world!";
cout << "The size of a char is: "
<< sizeof( char )
<< "\nThe length of " << szHello << " is: "
<< sizeof szHello
<< "\nThe size of the pointer is "
<< getPtrSize( szHello ) << endl;
}
Output
The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4
When the sizeof operator is applied to a class, struct, or union type, the result is the number of bytes in an object of that type, plus any padding added to align members on word boundaries. The result does not necessarily correspond to the size calculated by adding the storage requirements of the individual members. The /Zp compiler option and the pack pragma affect alignment boundaries for members.
The sizeof operator never yields 0, even for an empty class.
The sizeof operator cannot be used with the following operands:
Functions. (However, sizeof can be applied to pointers to functions.)
Bit fields.
Undefined classes.
The type void.
Dynamically allocated arrays.
External arrays.
Incomplete types.
Parenthesized names of incomplete types.
When the sizeof operator is applied to a reference, the result is the same as if sizeof had been applied to the object itself.
If an unsized array is the last element of a structure, the sizeof operator returns the size of the structure without the array.
The sizeof operator is often used to calculate the number of elements in an array using an expression of the form:
sizeof array / sizeof array[0]
[поскипано]
Ну вот, сейчас начнем в этом топике обсуждать, придет Губанов и скажет "какая гадость этот ваш C++"
Итак, пример jazzer'а:
while(*dest++ = *src++);
Поскольку есть операция разыменования, то src и dest — либо указатели, либо типы, ведущие себя как указатели. И копируется из src в dest, пока не встретится нулевое значение, что характерно для сишных строк.
Что получается в таком случае:
memcpy(dest, src, sizeof(src));
ПОлучается копирование sizeof(src) байт из src в dest, то есть 4-х байт (размер указателя) на x86 платформе.
Не говоря уже о том, что в принципе тип, на который указывают src, dest может быть любым типом, приводимым к bool, в том числе и недопускающим побитовое копирование. В случае while(*dest++ = *src++); имеем правильное использование оператора присваивания, а в случае memcpy — нет.
В случае со строками можно говорить о таком варианте:
memcpy(dest, src, (strlen(src)+1)*sizeof(*src));
но он ничуть не эффективнее (поскольку strlen внутри также содержит цикл).
Здравствуйте, Schade, Вы писали:
S>Здравствуйте, Bigger, Вы писали:
B>>The length of Hello, world! is: 14
S>Так или иначе, sizeof — константа, определяемая во время компиляции.
When the sizeof operator is applied to a class, struct, or union type, the result is the number of bytes in an object of that type, plus any padding added to align members on word boundaries. The result does not necessarily correspond to the size calculated by adding the storage requirements of the individual members. The /Zp compiler option and the pack pragma affect alignment boundaries for members
Здравствуйте, Cyberax, Вы писали:
C>А большинство пишущих на Паскале/Дельфи — студенты и школьники. Говорить
нескажи...
в одном из местных ВУЗов есть хорошая традиция
старшекурсники отдают младшим свои лабы\конспекты итд
но преподаватели они тоже не дураки
если в этом году курс программирование к примеру был на Делфи, то в следующем уже на билдере потом вижуал c
вобщем, вот такая защита от взлома
... <<silent Rsdn@Home 1.1.4 beta 1 Windows XP 5.1.2600.0 >>
Gust,
> Мой бывший преподаватель был в жюри (не знаю как точно называется, может орг. комитет) всероссийских олимпиад по программированию. Так он мне рассказывал об интересной статистике. Оказывается что бОльшая часть участников использует Паскаль.
Во всероссийских олимпиадах по программированию не участвовал. Участвовал во всеукраинских. Могу подтвердить: да, большинство участников писало на Паскале. Немного писало на Бэйсике, плюс еще сколько-то на Си. Я в числе большинства писал на Паскале. Но то были олимпиады, совсем другая, чем промышленное программирование, песня. Сегодня пишу на C++.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Кодёнок, Вы писали:
Кё>interface в Borland Pascal 100% инкапсуляцию тоже не обеспечивает.
Как это так?
То, что не вынесено в секцию interface, недоступно из других модулей.
Это ли не инкапсуляция на уровне модулей?
Кё>И зачем оно? Напусти на исходник простой процессор, и он выдаст вам .int — файл, где есть действительно только интерфейсная часть.
1) Дядя, а где достать этот самый "простой процессор"?
2) Зачем мне нужен этот "процессор", если его нет в поставке рабочей IDE, и он не является стандартным?
Кё>В компиляции такой файл все равно не участвует. А вот дублирование заголовков функций в interface и implementation сильно портит жизнь.
Если многие заголовки функций идут на экспорт, то таки да, и мне лень дублировать...
Кё> Поменял определение — ищи в большом файле реализацию.
А что, руки мешают нажать "Ctrl+Shift+Вверх"? Это для дельфей, ибо паскаль (91 года выпуска) не юзаю, хотя и там, дожен быть шорткут для перехода между имплементацией и интерфейсной частью.
Кё>Приходилось мне поддерживать и дорабатывать код на Delphi, так что я очень злой на эту фигню
Уж на дельфях то как раз всё пучком.
G>>Я думаю эти ребята умеют программировать
AVK>Далеко не факт.
G>> ), а потому что в условиях дефицита времени важно иметь возможность отловить большинство ошибок на момент компиляции.
AVK>Думаю все намного проще — важнее всего скорость компиляции, а она у Паскаля на порядок выше.
У меня совсем не так Я тоже участвовал в олимпиадах, одной всероссийской. Выбор там был между Borland Pascal 7 и Borland C++ 3.1 (Бейсики-Фортраны не в счет...). А в те времена C++ — это просто C с объектами, по крайней мере программирование на нем преподавали именно в таком стиле. Шаблоны хоть и были, но на уровне функции T max<T>(const T, const T) и простых контейнеров. Ни о каких функторах, operator TYPE (), автоматическом преобразовании типов и создании временных объектов (ну когда void f(const CString&) вызывается как f("yes") и мы имеем CString в функции) никто не знал наверное я имею ввиду преподов и доступные нам книжки по C++. Я даже не знаю, есть ли в Borland C++ 3.1 поддержка этого. Об умных указателях и map<> молчу
А самое главное, не было STL! Паскаль имел огромное преимущество благодаря встроенным строкам и множествам... Работа с динамическими массивами char* неибежно вызывала какие-нибудь глюки с забытыми нулями, AV и прочее. А кому это нужно, на олимпиаде-то?
Сейчас я бы выбрал С++ однозначно — на современном компиляторе и с STL
Здравствуйте, DJ KARIES, Вы писали:
Кё>>interface в Borland Pascal 100% инкапсуляцию тоже не обеспечивает.
DK>Как это так? DK>То, что не вынесено в секцию interface, недоступно из других модулей. DK>Это ли не инкапсуляция на уровне модулей?
Там есть заморочка:
unit Unit1;
interface
type
TB = class; (* forward declaration *)
TA = class
private
b: TB;
...
end;
TB = class
private
a: TA;
public//...end;
implementation//...end.
в объектах класса TB есть приватная переменная a: TA, поэтому мы ОБЯЗАНЫ дать определение для TA тоже там же — в интерфейсной части юнита, хотя, быть может, мы вовсе и не хотим чтобы класс TA был доступен для остальных юнитов.
Мы не хотим делать TA доступным из других юнитов, но мы обязаны это сделать, так как обязаны описать его именно в разделе interface — иначе мы не сможем описать переменную a: TA в классе TB.
Вот с этим и связана одна из бед компании Борланд — в то время когда Никлаус Вирт уже придумал язык следующего поколения — Modula, Борланд зачем-то реализовала компилятор для устаревшего Pascal (добавив в него свое собственное изобретение кривые — interface/implementation и обозвав его Turbo Pascal), а не для Modula свободной от этих недостатков.
Как надо правильно делать:
MODULE Module1;
TYPE
A = POINTER TO RECORD(* Какой-то приватный тип - он не экспортируется этим модулем *)
b: B;
...
END;
B* = POINTER TO RECORD(* Символ "*" после имени типа означает, что этот тип экспортируется *)
a: A;
...
END;
END Module1.
СГ>Вот с этим и связана одна из бед компании Борланд — в то время когда Никлаус Вирт уже придумал язык следующего поколения — Modula, Борланд зачем-то реализовала компилятор для устаревшего Pascal (добавив в него свое собственное изобретение кривые — interface/implementation и обозвав его Turbo Pascal), а не для Modula свободной от этих недостатков.
Как интересно, на языке самого последнего поколения будет выгляеть передача callback-функций с разными типами вызова (pascal и cdecl), использование API, требующего определенного выравнивания полей, реализация COM-объекта, реализация COM VARIANT (unions там есть?)? Как только добавят в Component Pascal все такие мелочи, так и получится та же фигня, что у Борланд, только другим боком. Если только философия Оберона тут не сводится к "все что не может работать с Обероном — выбросить, и переписать на Обероне".
Здравствуйте, Кодёнок, Вы писали:
Кё>Как интересно, на языке самого последнего поколения будет выгляеть передача callback-функций с разными типами вызова (pascal и cdecl), использование API, требующего определенного выравнивания полей, реализация COM-объекта, реализация COM VARIANT (unions там есть?)?
А вот интересно, почему, например, я не задаю аналогичных глупых вопросов: "А есть ли в Вашем языке/системе ХХХ средство УУУ". Почему я просто беру и читаю соответствующие доки, в то время как Вы этого делать не желаете?
Вот, читайте на здоровье:
BlackBox -->-- Help -->-- Context -->--
Platform-Specific Issues (Windows)
Module SYSTEM
Using DLLs in BlackBox modules
Using COM without special Direct-To-COM compiler
Windows programming interfaces
OLE Automation
Windows-specific information in BlackBox
Differences between different Windows versions
The BlackBox linker
Linking BlackBox applications
Startup of BlackBox
module contents
WinApi basic data types, error codes, basic Win32 functionality
WinDlg common dialog box library
WinCtl common controls
WinOle basic COM and OLE interfaces
WinOleDlg OLE dialogs (OleUI...)
WinOleAut OLE automation interfaces
WinOleCtl OLE controls interfaces
WinRpc remote procedure call functions
WinNet networking and socket functions
WinMM multimedia services
WinCmc Messaging Application Programming Interface (MAPI)
WinSql Database services (ODBC)
Map to the Ctl Subsystem
Developer Manual
Excel5 MS Excel 5.0 automation interface
Excel8 MS Excel 8.0 automation interface
Excel9 MS Excel 9.0 automation interface
Word8 MS Word 8.0 automation interface
Word9 MS Word 9.0 automation interface
Outlook8 MS Outlook 8.0 automation interface
Outlook9 MS Outlook 9.0 automation interface
PowerPoint8 MS PowerPoint 8.0 automation interface
PowerPoint9 MS PowerPoint 9.0 automation interface
Access8 MS Access 8.0 automation interface
Access9 MS Access 9.0 automation interface
Graph8 MS Graph 8.0 automation interface
Graph9 MS Graph 9.0 automation interface
Office MS Office 9.0 automation interface
OfficeBinder MS Binder 9.0 automation interface
MSForms MS Forms 2.0 automation interface
DAO35 MS Data Access Objects 3.5 automation interface
DAO36 MS Data Access Objects 3.6 automation interface
ADODB MS ActiveX Data Objects 2.0 automation interface
VBIDE MS Visual Basic automation interface
Здравствуйте, DEMON HOOD, Вы писали:
DH>Чегото вспомнилось сегодня, решил запостить...
DH>Начинал программировать на паскале, причина тривиальная — в наличии был только компилятор паскаля. IDE Borland Pascal DH>потом появилась у меня IDE Borland C. И там и там были жёлтые буквы на синем фоне да и паскаль от си не сильно отличается, DH>но единственная фича которая перевесила в пользу си — это возможность обьявлять переменные в произвольном месте , а не где-то там, в блоке var.
А я под спектрумом в 1994м ни о Си, ни о Паскале ничего не знал. Писал на Васике и в машинных кодах , потому что грузить асм с кассеты было жутко долго.
А когда аж в 1996м появился Пеньтюх, 95-е винды на нее ставил перец — мегакрутой оплачиваемый (!!) программер одной из местных контор. Он был такой молохой, худой, и всё время пускал пузырями слюни.
Он мне сказал, что стоит смотреть либо на Си, либо на Дельфи. Под Си он подразумевал Borland 5.02, а под Дельфи — Delphi 3.0. Я так и не смог допытаться от него, что же лучше. Он очень так вяло говорил, что и то и то одна фигня, но Си в принципе сложнее, но перспективнее. Я перекрестился и сказал ставить Си .
В качестве примера работы Си чел создал визардом OWL приложение типа нотепада. Я был в шоке! Казалось, программирование ушло без меня куда-то ваще в другую сторону .
А потом была книжка что-то типа "Эдвард Нортон. Программирование на языке Си". Я не стал писать Hello World, а приступил сразу к "серьезным вещам " — игрушка-викторина. Набил кода на страницу и попытался запустить. Ошибка компиляции — функция не определена!! Как?!!! Где?? Дело оказалось не в case sensitive, как можно подумать. Была другая ошибка новичков — первой я написал main, а под ней остальные функции . Мрак! Что делать? На поиск ошибки ушло два дня!!!!! Книга Нортона была настолько убогой, что, как я помню, в ней не было ни слова о важности определения функции. Возможно, там вообще нигде не определялись функции, а может я прошляпил.
В моей книжке по Си не было ни указателей, ни выделения памяти. Других книг "по компьютерам", кроме Фигурнова и Нортона в продаже в 1996м году в городе Адлере не было . И интернета не было. Я был "не в комьюнити". Тяжелые времена . Как я потом узнал, люди специально ездили за книгами в Краснодар и Таганрог.
Короче, Си и С++ я учился по исходникам стандартной библиотеки. Память я выделалял и распределял сам в огромных статических массивах Как же я ругался тогда на "этот долбаный Си" .
Здравствуйте, Poudy, Вы писали:
P>А потом была книжка что-то типа "Эдвард Нортон. Программирование на языке Си".
Вот это серьезно. Это та, которую он в соавторстве с Бредом Питтом написал?
сам слушаю и вам рекомендую: Полковник и однополчане — Сто лет одиночества
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>Здравствуйте, Poudy, Вы писали:
P>>А потом была книжка что-то типа "Эдвард Нортон. Программирование на языке Си". ЗХ>Вот это серьезно. Это та, которую он в соавторстве с Бредом Питтом написал?
Нет. На самом деле книга была Эндрю Нортона, кажется, и писалась одним человеком.
Всем привет
A>>НО! Если нужно писать прикладные программы не критичные по скорости, не затрагивающие низкоуровневое программирование — Паскаль — очень даже неплохой выбор. В Delphi многие огрехи паскаля исправили, но далеко не все.
G>Не всегда скорость конечного продукта является определяющей. Важнее остаются показатели скорость разрабоки/качество или стоимость/качество.
G>Информация к размышлению: G>Мой бывший преподаватель был в жюри (не знаю как точно называется, может орг. комитет) всероссийских олимпиад по программированию. Так он мне рассказывал об интересной статистике. Оказывается что бОльшая часть участников использует Паскаль. И не потому что это студенты и они на нем обучались (Ведь для умеющего программировать — выбор языка не первая задача. Я думаю эти ребята умеют программировать ), а потому что в условиях дефицита времени важно иметь возможность отловить большинство ошибок на момент компиляции.
Насколько я знаю для соревнований ACM выбор многих команд обусловлен тем, что на финале будут предложены среды Kylix для Delphi и gcc/gdb для C++. Вот тут уж действительно выбор очевиден. А та команда, которая не ставит перед собой цели поехать в финал, много не стоит
PS Хотя лично я считаю что среда VS 6 более приспособлена для соревнований, чем Delphi 7.
PPS А вообще разница между C++/Delphi'стами почти нивелирована уже давно.
Здравствуйте, Poudy, Вы писали:
P>Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>>Здравствуйте, Poudy, Вы писали:
P>>>А потом была книжка что-то типа "Эдвард Нортон. Программирование на языке Си". ЗХ>>Вот это серьезно. Это та, которую он в соавторстве с Бредом Питтом написал? P>Нет. На самом деле книга была Эндрю Нортона, кажется,
О, Андре Нортон, это ещё круче P>и писалась одним человеком.
Ну, результат соавторства Нортона/Питта тоже за одного человека считать можно