Объясните новичку.

Форум для изучающих FPC и их учителей.

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

Re: Объясните новичку.

Сообщение Paster Fob » 11.05.2011 10:57:02

Есть у меня ещё одна книга так и называется Free Pascal и Lasarus.Так вот возниклпи "непонятки" с целочисленным типом данных.Я изучал что тип integer имеет диапозон от -32768 до 32767 а в книге совсем другое.

Изображение

Разъясните пожалуйста.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Oleg_D » 11.05.2011 11:13:03

Уважаемый Paster Fob,
В разных компиляторах размеры типов данных могут отличаться, - это нормально, поскольку техника развивается и разрядность процессоров растет. Просто в работе надо учитывать это, читать документацию на конкретный компилятор.
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение informat » 11.05.2011 16:29:06

Paster Fob писал(а):
И Вас все преподаватели полюбят, как родного сына.

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


Сейчас век Интернета. И курсы и преподаватели доступны в там же. См. мою подпись.
Ни страна, ни город не имеет значения. А преподавателей хороших и в Москве ещё поискать нужно...

Добавлено спустя 1 минуту 53 секунды:
Paster Fob писал(а):Есть у меня ещё одна книга так и называется Free Pascal и Lasarus.Так вот возниклпи "непонятки" с целочисленным типом данных.Я изучал что тип integer имеет диапозон от -32768 до 32767 а в книге совсем другое.

Изображение

Разъясните пожалуйста.


А ещё во FP есть тип QWord.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Объясните новичку.

Сообщение Paster Fob » 11.05.2011 16:59:01

informat писал(а):
Сейчас век Интернета. И курсы и преподаватели доступны в там же. См. мою подпись.
Ни страна, ни город не имеет значения. А преподавателей хороших и в Москве ещё поискать нужно...


Я смотрел ваш сайт,для начала нужно иметь базовые знания о программировании,вот я и учусь...
Да,кстати,про цену я ничего не нашёл.Не думаю что вы благотворительностью занимаетесь
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Vadim » 11.05.2011 17:15:28

Paster Fob писал(а):Я изучал что тип integer имеет диапозон от -32768 до 32767 а в книге совсем другое.

Смотря где Вы это изучали. :)
Если взять, качестве примера, FreePascal, то у него есть несколько режмов компиляции:
1) {$mode tp} - режим компиляции для совместимости с Turbo\Borland Pascal. Этот режим для тех, кто писал раньше программы на ТР\ВР и его код ориентирован на особенности именно 16-ти битных программ, а переписывать лень.
Откомпилируйте и запустите такой пример:
Код: Выделить всё
{$mode tp}
Program sizeinteger;

Begin
  WriteLn(SizeOf(Integer));
  ReadLn;
End.

Программа выводит на экран целочисленный тип данных (Integer) в байтах. Программа покажет размер 2 байта. В 2 байта как раз влезают числа от -32768 до +32767, можете проверить.
2) {$mode objfpc} - это режим для современных, 32-ух или 64-ёх битных систем. При этом целочисленный тип уже ориентирован на 4 байта.
Откомпилируйте и запустите такой пример:
Код: Выделить всё
{$mode objfpc}
Program sizeinteger;

Begin
  WriteLn(SizeOf(Integer));
  ReadLn;
End.

Программа Вам покажет размер 4 байта, т.е. в переменную целочисленного типа влезут уже от - 2147483648 до +2147483647. Вы спросите, зачем это нужно? В этом кроется большой, но глубокий смысл. :) Дело в том, что 16-ти битной ОС быстрее и удобнее читать данные блоками по 16 бит или по 2 байта, а 32-ух битным, соответственно по 32 бита или по 4 байта. Теперь смотрите, если мы в 32-ух битной системе откомпилируем программу как 16-ти битную, то либо у нас в коде будут зиять дыры по 2 байта, т.к. заняты только 2, а ОС удобнее брать 4-ёх байтные блоки - нерациональное распределение памяти, либо программе придётся совершать лишние телодвижения для того, чтобы вернуться на 2 байта назад, чтобы прочитать те самые 2 байта, которые к 4-ёх байтному блоку уже не относятся - это сильно снижает быстродействие. Поэтому в 32-ух битной ОС нужно компилировать именно в 32-ух битном режиме.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Объясните новичку.

Сообщение Paster Fob » 11.05.2011 17:55:03

Vadim писал(а):Поэтому в 32-ух битной ОС нужно компилировать именно в 32-ух битном режиме.

Ну и как это сделать?

Я попробовал при типе данных integer сложить 32000 и 32000 и ни фига,а согласно таблице у меня ещё большой запас.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Vadim » 11.05.2011 19:00:45

Paster Fob писал(а):Ну и как это сделать?

Перечитайте ещё раз предыдущее моё сообщение, первую часть и обратите внимание на практические примеры. Не забвайте, что практика - единственный критерий истины. ;)

Добавлено спустя 1 минуту 37 секунд:
Скажите, а как уВас обстоит дело с английским языком?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Объясните новичку.

Сообщение Paster Fob » 11.05.2011 19:47:41

Перечитайте ещё раз предыдущее моё сообщение, первую часть и обратите внимание на практические примеры. Не забвайте, что практика - единственный критерий истины.

Перечитал,понял что есть разлчные режимы компиляции,для 16,32 и 64 битных систем.При компиляции в самом верху кода я должен писать {$mode tp} или {$mode objfpc} правильно?
Опять же появляется следующий вопрос: В фигурных скобках указывается коментарий к программе и не воспринимается компилятором,а здесь наоборот,почему?Или я что-то опять путаю?

Vadim писал(а):Скажите, а как у Вас обстоит дело с английским языком?

А ни как,я немецкий в школе учил.Правда по английски умею читать и знаю алфавит.Ну и некоторые слова(из фильмов).
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение VirtUX » 11.05.2011 20:11:53

Код: Выделить всё
{$mode tp}

это директива компилятору использовать режим совместимый с TurboPascal (16-бит). Поэтому и распознается им не как комментарий.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Объясните новичку.

Сообщение Mr.Smart » 11.05.2011 20:34:10

VirtUX писал(а):это директива компилятору использовать режим совместимый с TurboPascal (16-бит).

Только режим совместимости, но не как не 16 бит!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Объясните новичку.

Сообщение Vadim » 12.05.2011 04:30:55

Paster Fob писал(а):В фигурных скобках указывается коментарий к программе и не воспринимается компилятором,а здесь наоборот,почему?Или я что-то опять путаю?

В данном случае, сочетание фигурной собки и знака $, т.е. "{$", является указанием компилятору перключится в тот или иной режим. Далее следует ключевое слово "mode", т.е. по английски "режим", после чего указывается название режима: "tp" - режим совместимости c TurboPascal, "objfpc" - режим ObjectPascal, т.е. современный, 32-ух битный Паскаль с поддержкой объектов и прочими современными фенечками.
Режим компилятора "tp" действительно, компилирует на самом деле 32-ух битный код, но при этом размер базовых типов данных ориентирован на те размеры, которые были в TurboPascal. Это заставляет компилятор вводить лишние телодвижения для учёта 16-ти битных особенностей, что ухудшает быстродействие программы. С маленькими программами, вроде той, что я Вам написал выше, это будет незаметно, но вот с большими объёмами данных... Вдобавок, Вы не сможете использовать массивы больше 64 килобайт (так было в TurboPascal).
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Объясните новичку.

Сообщение informat » 12.05.2011 12:24:31

Paster Fob писал(а):
informat писал(а):
Сейчас век Интернета. И курсы и преподаватели доступны в там же. См. мою подпись.
Ни страна, ни город не имеет значения. А преподавателей хороших и в Москве ещё поискать нужно...


Я смотрел ваш сайт,для начала нужно иметь базовые знания о программировании,вот я и учусь...
Да,кстати,про цену я ничего не нашёл.Не думаю что вы благотворительностью занимаетесь


Написал в личку.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Объясните новичку.

Сообщение Paster Fob » 19.05.2011 21:04:13

Ну вот закончил с функциями.Сложного вроде бы ничего,вот только я не понял что значит вызов функции как процедуры и как это делается.
Аватара пользователя
Paster Fob
постоялец
 
Сообщения: 188
Зарегистрирован: 22.02.2011 21:53:36
Откуда: Новосибирск.

Re: Объясните новичку.

Сообщение Oleg_D » 20.05.2011 10:09:56

Paster Fob писал(а):Ну вот закончил с функциями.Сложного вроде бы ничего,вот только я не понял что значит вызов функции как процедуры и как это делается.

Посмотрите сообщение №14 здесь:
viewtopic.php?f=23&t=7029&start=15
Еще раз:
-----------
var B : boolean;
N1, N2 : integer;
...
B:= Swap(N1, N2); { вызов как функции (возвращаемый результат используется) }
Swap(N1, N2); { вызов как процедуры (возвращаемый результат НЕ используется) }
------------
Oleg_D
постоялец
 
Сообщения: 391
Зарегистрирован: 09.05.2011 11:28:36

Re: Объясните новичку.

Сообщение informat » 22.05.2011 06:56:54

Paster Fob писал(а):Ну вот закончил с функциями.Сложного вроде бы ничего,вот только я не понял что значит вызов функции как процедуры и как это делается.


Чтобы не было "вроде", я в курсе даю такие задачи.
Например:

Код: Выделить всё
program Plus_One;
var
  x1, x2, x3, x4, x5 :integer;

  procedure Plus(var a: integer; b: integer; var c: integer; d: integer; var e, f : integer);
  begin
    a:=a+1; b:=b+1; c:=c+1; d:=d+1; e:=e+1; f:=f+1;
  end;

begin
  readln(x1, x2, x3, x4, x5);
  Plus(x1, x2, x3, x4, x5, x5);
  writeln(x1,' ', x2,' ', x3,' ', x4,' ', x5);
end.   

:?: Как работает программа, если ввести все 9?
:?: Почему x5 стала равна 11, а не 10?
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru