Все вопросы связанные с программированием. Языки программирования. Средства разработки.
Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Borr,
Здесь следует уточнить, как выделялась память...
На примере char, опять же, что не принципиально важно:
Если простым объявлением char с. - то, как только переменная попытается увеличить значение при 127 - ее значение станет -128, т.е. - обычное переполнение.
В NULL она никогда не уйдет.. это не указатель.
0+(-0) - это просто ЗНАЧЕНИЕ переменной.
char* c;
c = malloc(1300);
c[1299] = 'a'; - правильно.
с[1300] = ошибка....
вот здесь именно и будет выход за рамки диапазона, точнее - за рамки выделенной памяти.
А вообще, советую почитать хотя бы Страуструпа... Это - основа основ. В С нужно уметь работать с памятью и четко представлять себе разницу между указателем/обычной переменной.
Visual Basic 6<, кажется при значении переменной, выходящим за рамки ее максимального значения (127>) выдал бы переполнение.... Но это уже совсем другая история.
А если не совсем понятен смысл топика - так еще раз повторюсь:
Тема именно в математическом c+(-c) !=0 - срабатывает....

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

Все теперь понял. У меня действительно смешались кони, люди. А Страус Трупа надо не читать а перечитывать.
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

tAZAR,
В С нужно уметь работать с памятью и четко представлять себе разницу между указателем/обычной переменной.
еще одно приемущество делфи - относительно строгая типизация данных, что упрощает отлов утечек памяти и т.п. :cheesy:
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
Borr
Не в сети
Частый гость
Частый гость
Сообщения: 338
Зарегистрирован: Ср сен 15, 2004 17:14
Откуда: Шахты
Контактная информация:

Сообщение Borr »

Eraser писал(а): еще одно приемущество делфи - относительно строгая типизация данных, что упрощает отлов утечек памяти и т.п. :cheesy:
Что в делфи нет указателей на адрес памяти, скажем с переменной?
Стой там, иди сюда

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

Borr,
есть конечно! )

но более строгая типизация позволяет избегать некоторых серьезных ошибок начинающим.

"Писать плохой код на C++ гораздо проще чем хороший" (c) не дословно, не_помню_кто.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Eraser писал(а):"Писать плохой код на C++ гораздо проще чем хороший" (c) не дословно, не_помню_кто.
Цто пудов :-)
Но это не значит, что у всех кривые, простите, руки. :-) После некоторого времени, перестаешь брать проблему лбом и разбираешься. Ничего сложного, в принципе, нет. Для новичка в программировании вообще - понятно, что Delphi изучить гораздо проще, чем с++.
1) И вообще, если честно, я стесняюсь назвать указатель в делфи указателем... POINTER - это, кажется, явно гораздо медленнее, чем указатель в с++.
2) С/С++ - языки более низкого уровня. понятно, что разобраться будет сложнее. здесь уже нужно более детально знать устройство работы ОС и устройства, для которого пишешь.
И вообще, Eraser - при чем тут "более строгая типизация" Delphi, если int a; - переменная
int* a; - указатель / если я не ошибаюсь (на паскале писал лет 5 назад):
var a:integer;
var b:Pointer (или что - то в этом духе) - и где тут путаница?. Кстати - остальные объекты "указатель" (явно типизированные), как я понял, в делфи обернуты в объекты...
Делфи - отличный язык как для начинающего программиста, так и для профессионала, это понятно. Но вот возможностей по работе с памятью в С явно больше. С этим не поспоришь.
. OFFTOPIC:
Кстати, Eraser, если не заходил читать про точкунет - я там выложил пост по поводу managed+native code в С++. Там интересно ;-)
А плохой код на самом деле, можно на любом языке писать. Главное - уметь это делать :-)

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

tAZAR,
1) И вообще, если честно, я стесняюсь назвать указатель в делфи указателем... POINTER - это, кажется, явно гораздо медленнее, чем указатель в с++.
указатель он и в африке указатель )) с чего бы ему быть медленнее.. это всего лишь 4 байтная переменная, которая указывает на опр. участок кода.
2) С/С++ - языки более низкого уровня. понятно, что разобраться будет сложнее. здесь уже нужно более детально знать устройство работы ОС и устройства, для которого пишешь.
согласен, многие называют C++ высокоурвневым ассемблером.
int* a; - указатель / если я не ошибаюсь (на паскале писал лет 5 назад):
var a:integer;
var b:Pointer (или что - то в этом духе) - и где тут путаница?.

Код: Выделить всё

var
  a: Integer; // переменная.
  b: ^Integer; // указатель на переменную Integer.
Кстати - остальные объекты "указатель" (явно типизированные), как я понял, в делфи обернуты в объекты...
чего только не услышишь )) нет, эт в C# что-то подобное, там даже простые типы данных являются своеобразными классами, в делфи это не так.
Но вот возможностей по работе с памятью в С явно больше.
я б не сказал, что возможностей больше, C просто больше позволяет, отсюда и гибкость. Хотя в общих случаях разницы не вижу.. сейчас пробовал придумать некий пример работы с памятью, чтобы его нельзя было реализовать в делфи.. так и не придумал.
Для новичка в программировании вообще - понятно, что Delphi изучить гораздо проще, чем с++.
согласен, в какой-то степени это связано с тем, что в C криво организована работа со строками.. вернее не то чтобы криво, скорее низкоуронего, что отвлекает новичков от основного процесса кодинга.
но в большей степени на Delphi новичку проще из-за IDE, ну очень уж убогий этот самый IDE у продуктов MS... + MFC, исправились только в MSVS2005 во многом он мне нравится больше чем BDS2006.
А программирование на BC++ Builder (от Borland) думаю и для новичка будет не намного сложнее, чем на Делфи, хотя язык C++.

В общем кто на чем привык, тот тем и пользуется )) с выходом .NET выбор языка становится все менее принципиальным.
Кстати, Eraser, если не заходил читать про точкунет - я там выложил пост по поводу managed+native code в С++. Там интересно ;-)
угу, глянул, действительно интересно, жаль проверить не удалось, т.к. MSVS не установлена сейчас. Но все же я пока что за C#. Хотя кто знает, что будет когда займусь реальным проектом под эту платформу.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

новичку проще из-за IDE, ну очень уж убогий этот самый IDE у продуктов MS... + MFC...
Ну уж, блин, да :-)
В Delphi 7 - MDI интерфейс даже путем не сделали... Так - псевдо MDI, standalone окна, рабочий стол вынь - за заднем плане. Мне лично такое не очень нравится...
IDE у M$ уже начиная с VS5 была достаточно удобной, и мне приходится очень по вкусу (сейчас, конечно, работаю в VS2005, но и в 2003 пришлось долго сидеть)....
указатель он и в африке указатель ))
Ой как не уверен :-) Хотя - все может быть...
Явно int * a;...... int i = *a;
гораздо быстрее, чем var a:^Integer; i:integer;..... i:=Addr(a);

В с работа со строками не организована криво - там они представлены как указатели на char...(уровень ЯП!)
В С++ есть тип string; для работы с ним есть спец. строковые функции. ничем не хуже Delphi или VB.
Также - класс CString, который все умеет :-)
А насчет С# - у меня в С++ по CLR (Windows Forms, .NET FW2.0, как и в C#) получилось то же, что и на C#, в таком же объеме кода со всей гибкостью С++:-). Так что - выбор языка теперь явно не принципиален. Ну, кроме сервисов и резидентов ;-)

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

tAZAR,
Также - класс CString, который все умеет :-)
не знал, учту.
Ой как не уверен :-) Хотя - все может быть...
а.. если имелась ввиду не скорость работы, скорость написания :D ,то
var a:^Integer; i:integer;..... i:=Addr(a);

Код: Выделить всё

a := @i;
:cheesy:
В Delphi 7 - MDI интерфейс даже путем не сделали
в делфи вообще нету MDI интерфейса, там другая концепция... когда привыкаешь - очень удобно.
кстати начиная с Д8 - переделали существенно.
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Eraser,
если имелась ввиду не скорость работы
именно она и имелась :-)
Eraser писал(а):в делфи вообще нету MDI интерфейса...
А есть :-)
MDI -> Multiple Top Level Documents: Есть такое понятие как разновидность MDI интерфейса...
SDI - это когда notepad или wordpad....

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

tAZAR,
А есть :-)
тогда нету той разновидности, когда в рамках одного главного окна располагаются дочерние окна с открытыми документами :wink:
именно она и имелась :-)
и чем же
int * a;...... int i = *a; быстрее var a:^Integer; i:integer;..... i:=a^; ?
по-моему выполняются одни и те же ассмблерные инструкции.

Код: Выделить всё

Unit2.pas.30: a^ := 0;
00457DF4 33D2             xor edx,edx
00457DF6 8910             mov [eax],edx
Unit2.pas.31: i := a^;
[u]00457DF8 8BDA             mov ebx,edx[/u]
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Код: Выделить всё

00457DF4 33D2             xor edx,edx 
00457DF6 8910             mov [eax],edx 
Unit2.pas.31: i := a^; 
[u]00457DF8 8BDA             mov ebx,edx[/u]
Во как :-)
Я об этом и говорил. А вдруг там все бы замудренно было сделано :-) Все - таки указатели, Delphi. Ну, защита - типа и все такое. Убедил!!! :-)
ТОлько чем же тогда писать подобные вещи безопаснее по сравнению с С++? У меня чисто проф. интерес возник :-) Все таки в работе с Delphi опыт очень мал, и я никогда не вдавался, как там все устроено, и как работает компилятор...

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Оффтоп:
Eraser, есть предложение обменяться Асями... Вдруг когда пригодится :-)

Аватара пользователя
Hank
Не в сети
Почётный форумщик
Почётный форумщик
Сообщения: 4299
Зарегистрирован: Чт май 05, 2005 19:35
Откуда: RnD

Сообщение Hank »

tAZAR,
Я об этом и говорил. А вдруг там все бы замудренно было сделано :-)
многие кстати думают, что Делфи это какое-то подобие VB, где действительно все намудрено, на самом деле это полноценный x86 компилятор, который создает полноценный код, который, в свою очередь, работает без всяких виртуальных машин и эмуляторов, как и код, создаваемый в MSVS. До верссии 3 включительно, на Длефи можно было даже драйвер ядра написать, при умелых настройках компилятора... хотя конечно драйвер на делфи это бред ))
ТОлько чем же тогда писать подобные вещи безопаснее по сравнению с С++?
в конкретном данном случае - ничем. Но C++ (а особенно C) предоставляет слишком широкие возможности неявного приведения типов, большинство ошибок новичков из-за этого.
есть предложение обменяться Асями
216523947
Люблю повеселиться, особенно пожрать,
Люблю и поработать, особенно поспать )

Аватара пользователя
tAZAR
Не в сети
Модератор
Модератор
Сообщения: 567
Зарегистрирован: Ср июн 23, 2004 8:13
Откуда: г.Шахты

Сообщение tAZAR »

Но C++ (а особенно C) предоставляет слишком широкие возможности неявного приведения типов
Но это ж и хорошо :-), если умело пользоваться...

Ответить