Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];




Вниз

Помогите с массивами 


помогите   (2002-01-02 13:42) [0]

Почему в Паскаля, когда я объявляю массив получается ошибка массив
a,b,c:array [0..240] of string;

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



Андрей Сенченко   (2002-01-02 13:48) [1]

1. Какая то ошибка - это какая ? Можешь привести текст ?
Случаем не Error 96: Too Many Variables ?
2. Как заполяешь массив ? Приведи код, который приводит к переполнению.



помогите   (2002-01-02 13:50) [2]


program 47;
uses crt;
label 1,2;
var a:string;
b,c,f:array [0..240] of string; // Вот тут оштбка если несколько массивов, если объявлять один, то нормально
del,i,k:integer;
begin
ClrScr;
del:=0;
readln(a);
for i:=1 to 9 do
begin
b[i]:=a;
delete(b[i],i+1,length(a));
delete(b[i],1,i-1);
end;
for i:=1 to 9 do c[i]:=b[i];
for i:=1 to 9 do
begin
for k:=1 to i-1 do
begin
if c[i]=b[k] then goto 1
end;
f[i]:=c[i];
goto 2;
1:
del:=del+1;
2:
end;
Writeln("Полученная строка");
for i:=1 to 9 do write(" ",f[i]);
writeln;
write("Число удаленных символов ",del);
readln;



Андрей Сенченко   (2002-01-02 13:55) [3]

Выдержка из HELP BP 7.0

Too many variables
Global: The total size of the global variables
declared within a program or unit can"t exceed
64K.

Local: The total size of the local variables
declared within a procedure or function can"t
exceed 64K.

Не поленись - посчитай сколько памяти занимают объявленные Тобой
a,b,c:array [0..240] of string;
и все сам поймешь



!   (2002-01-02 13:57) [4]

A kak mne eto ispravit????



Андрей Сенченко   (2002-01-02 14:01) [5]

В первом же проходе цикла

for i:=1 to 9 do
begin
for k:=1 to i-1 do
begin
if c[i]=b[k] then goto 1
end;
...


Получаешь неизвестно что. Перевожу:
От i, равного 1 до 9
От k, равного 1 до 0 ( то есть до i - 1 )
...

А за Goto LABEL ... Щас Тебя MJH вообще съест




Андрей Сенченко   (2002-01-02 14:04) [6]

> !
В приведенном коде я лично не вижу необходимости объявлять эти массивы в размерах [0..240].



!   (2002-01-02 14:07) [7]

Просо мне потом нужно будет массив с размером [0..240].
А можно и сделать типа что-то вроде выделения памяти если памяти не хватает???????



Андрей Сенченко   (2002-01-02 14:24) [8]

program 47;
uses crt;
label 1,2;

Объявление меток в Pascal может потребоваться только в совсем уж уникальных случаях ... учись от этого отказываться.
var
а:string;
b,c,f:array [0..240] of string;
del,i,k:integer;

Судя по дальнейшему коду ( если его в корне не переписывать ) достаточно объявить array [1..9] значения "0" и "10" .. "240" Ты все-равно не используешь

Дальше не вдаваясь в исправление алгоритма:
begin
ClrScr;
del:=0;
readln(a);
for i:=1 to 9 do
begin
b[i]:=a;
delete(b[i],i+1,length(a));
delete(b[i],1,i-1);
end;
for i:=1 to 9 do c[i]:=b[i];
for i:=1 to 9 do
begin
for k:=1 to i-1 do
begin
if c[i]=b[k] then goto 1
end;
f[i]:=c[i];
goto 2;
1:
del:=del+1;
2:
end;


1. Безусловно цикл "for k:=1 to i-1 do " работать не будет, потому что верхняя граница в большинстве случаев меньше нижней.
2. Вместо использования меток гораздо естественнее использовать полностью конструкцию ( ЕСЛИ - ТО - ИНАЧЕ ):

begin
for k:=1 to i-1 do
begin
if c[i]=b[k]
then
del:=del+1 // Твоя МЕТКА 1
else // То есть ИНАЧЕ выполняем то, что обходили МЕТКОЙ 1
f[i]:=c[i];
end;
end;

Ну и здесь

Writeln("Полученная строка");
for i:=1 to 9 do write(" ",f[i]);
writeln;
write("Число удаленных символов ",del);
readln;


Если уж используешь CRT, то для ожидания нажатия клавиши пиши конструкцию типа
Repeat Until KeyPressed;

...
Это безусловно не все.



!   (2002-01-02 14:27) [9]

Спасибо вм Большле, Но если у меня цикл будет от 1 до 254 и мне нужен массив с размером [0..254], то что мне делать?? Может можно сделать без массива???

И на том вам большое спасибо!



Adder   (2002-01-02 14:34) [10]

хм... используй "кучу" :)
Вот тебе пример:
program example;
type
PMyArray=^MyArray;
TMyArray=array[0..240] of string;
var
a,b,c:PMyArray;
begin
a:=New(PMyArray);
b:=New(PMyArray);
c:=New(PMyArray);
a^[0]:="Pascal";
writeln(a^[0]);
Dispose(a);
Dispose(b);
Dispose(c);
end.



!   (2002-01-02 14:37) [11]

Вот то что мне и нужно было СПАСИБО!!!!



Андрей Сенченко   (2002-01-02 14:38) [12]

А можно как-то увидеть полностью собственно условие задачи ?



Андрей Сенченко   (2002-01-02 14:42) [13]

> Adder
А объяснить ? Хотя-бы в общих словах - что такое куча или где про это прочитать ? Сейчас человек вставит это в программу а что такое a^[0] - просто не поймет ...
:::)))Да и символ ^ несколько различается здесь и в Досовском редакторе ( паскаль же )



Adder   (2002-01-02 14:53) [14]

>Андрей Сенченко ©
Имхо, главное - "подтолкнуть" в нужном направлении...
Если человек действительно интересуется - догадается посмотреть в хелпе хотя-бы Type, New и Dispose :))
А в досовский редактор прямо отсюда вставить не получится - всё равно "ручками" набирать будет. Так что (имхо) проблемы с ^ не будет.



Андрей Сенченко   (2002-01-02 14:59) [15]

OFF TOPIC
Я помниться как-то минут 15 потратил, чтобы понять и ответить на вопрос "А как нарисовать снежинку" ( shift-8 )



Вадим   (2002-01-03 01:16) [16]

А если юзать динамические массивы?

program SuperPuperProga;
var
a: array of integer;
begin
SetLength(a, 15); // Теперь a содержит 15 элементов, нумерация начинается с 0.
a[0] := 5;
a[10] := a[0];
WriteLn(a[10]);
end.



Adder   (2002-01-03 01:26) [17]

2 Вадим © В Паскале ?



Вадим   (2002-01-03 01:44) [18]

Ага :). Не внимательно прочитал.



Anatoly Podgoretsky   (2002-01-03 08:10) [19]

А почему ты жирным выделил, или мы не в Паскале программируем?
Может ты хочешь сказать TPx, BPx, D1 в тех версиях Паскаля есть ограничение на размер сегмента в 64К, что легко обходится для данного размера массива



Сенченко Андрей   (2002-01-03 10:00) [20]

> Anatoly Podgoretsky ©

Возможно, я что-то не так понимаю, но открытые ( динамические или как их еще ) массивы появились с D4. В Turbo Pascal и Borland Pascal их не было.
Но, судя по тому что написано в коде, здесь можно обойтись без трех массивов. Поэтому я и просил привести задачу



Adder   (2002-01-03 11:42) [21]

>Anatoly Podgoretsky © (03.01.02 08:10)
Ну... если учесть, что ветка сюда перекочевала из основной конференции, программируем мы не не Паскале :)))
В остальном - согласна с Сенченко Андрей (03.01.02 10:00)
Но: вопрос поставлен так:
А можно и сделать типа что-то вроде выделения памяти если памяти не хватает???????
ответ: А зачем это тебе ? :-)



Val   (2002-01-03 12:04) [22]

Недавно помогал брату осваивать BP7, так вот - листаю книжку по нему - и что же вижу? - как раз массивы открытого типа :), сказать откуда они там-затрудняюсь, просто помню что удивился...



Андрей Сенченко   (2002-01-03 19:55) [23]

> Val ©(03.01.02 12:04)

Тогда совсем интересно. У меня стоит BP 7.0. На нем вот этот код:
program test;
var
a : array of integer;
i : integer;
begin
for i := 1 to 10000 do a[i]:=i+1;
end.

Выдает Error 92 ( "[" or "(." is expected ). Что собственно и показывает, что компилятор холчет увидеть границы. Или я не прав ? Каково же тогда описание и использование открытых массивов ? У меня есть литература только по версиям 5.0 и 5.5



Adder   (2002-01-03 21:27) [24]

>Андрей Сенченко © (03.01.02 19:55)
{$P+} или {$P-}
Options/Compiler/Open parameters
Данная директива компилятора , в зависимости от режима, позволяет или запрещает использование в качестве параметров в тексте программы массивов открытого типа.
По умолчанию {$P-}.
Имхо и всё...



Anatoly Podgoretsky   (2002-01-03 23:56) [25]

Сенченко Андрей (03.01.02 10:00)
Причем тут открытые массивы, речь об ограничении на размер сегмента, от открытые массивы появились в Паскале начиная с {T/B} Pascal 7



Андрей Сенченко   (2002-01-04 10:52) [26]

Там выше речь шла об объявлении
var
a: array of integer;

о нем я и интересовался, потому что у меня это не получалось



Anatoly Podgoretsky   (2002-01-04 21:14) [27]

Андрей Сенченко © (04.01.02 10:52)
Это не открытый, а динамический массив



Андрей Сенченко   (2002-01-05 10:58) [28]

Згачит полез читать про разницу. ... Спасибо




Форум: "Потрепаться";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.77 MB
Время: 0.02 c
7-79476           volph                 2001-11-13 15:44  2002.02.25  
Как вывести ролик на весь экран в TMediaPlayer????


3-79289           nobody2002            2002-01-31 13:08  2002.02.25  
Транзакции и ADO: не работает RollbackTrans


1-79371           Aleksandr             2002-02-08 19:23  2002.02.25  
Как из программы узнать формат строки с датой/временем для SQL-сервера


14-79444          fliz                  2001-12-27 14:48  2002.02.25  
Эй, московские! может встретимся по поводу ..


14-79433          _SnAke_               2002-01-03 13:16  2002.02.25  
Профессиональный праздник