Передача массива в функцию или процедуру
Primary tabs
Столкнулся с такой проблемой:
При передаче (по ссылке или по значению неважно) в функцию или процедуру массива
происходит сдвижение номеров ячеек массива. Иногда пропадают или добавляются значения.
Например массив из тела программы:
a[1] = 1; a[2] = 2; a[3] = 3;
превращается в:
a[0] = 1; a[1] = 2; a[2] = 3;
Так происходит и в этом коде. В процедуре происходит смещение номеров ячеек. Первое
значение вообще пропадает, а последнее значение повторяется в двух последних ячейках :
type randArr = array[1..7] of integer; var r:randArr; i:integer; procedure moveZero(var r: array of integer;k,k2:integer); var j:integer; begin for j:= k2 to 6 do r[j]:= r[j + 1]; r[high(r)]:= 0; for j:= k to 6 do r[j]:= r[j + 1]; r[high(r)]:= 0; end; function chekArr(funArr:randArr):integer; var n,m:integer; begin for n:= 1 to 7 do begin m:= n + 1; while ((m>=1)and(m<=7)) do //begin if funArr[n] = funArr[m] then begin moveZero(funArr,n,m); m:= n + 1; end else m += 1; //end; end; end; BEGIN r[1]:= 2; r[2]:= 26; r[3]:= 12; r[4]:= 2; r[5]:= 22; r[6]:= 11; r[7]:= 18; randomize(); //for i:= low(r) to high(r) do //r[i]:= 1 + random(15); for i:= low(r) to high(r) do write(r[i],'|'); writeln(); chekArr(r); for i:= low(r) to high(r) do write(r[i],'|'); readln; END.
В этом коде была похожая ситуация, но я исправил проблему,
а как не понял :
var i:integer; a:array [1..7] of integer; function fff(a:array of integer):string; var c:array [1..7] of integer; i,j,n,m:integer; s:string; begin c:=a; for i:= low(c) to high(c) do begin if (s = 'NE unikalnii') then break else begin for j:= i+1 to high(c) do begin if c[i] = c[j] then begin s:= 'NE unikalnii'; break; end; end; end; end; if (s <> 'NE unikalnii') then s:= 'unikalnii'; result:= s; end; BEGIN randomize(); for i:=low(a) to high(a) do a[i]:= 1 + random(15); for i:=low(a) to high(a) do write(a[i],'|'); writeln(); writeln('massiv - ', fff(a)); readln(); END.
Помогите пожалуйста разобраться как правильно передавать массив в процедуру/функцию.
- Log in to post comments
- 1371 reads
vedro-compota
Thu, 01/25/2024 - 10:18
Permalink
В этом коде была похожая
добавьте распечатку консолей, чтобы было понятно в чем там исправление именно
Кстати, вот такой код в вашем случае:
- не выведет последний элемент массива (т.е. сокрее всего это не полное исправление проблемы)
Но в целом вопрос понятен, подготовлю разбор
_____________
матфак вгу и остальная классика =)
Andrey
Thu, 01/25/2024 - 12:59
Permalink
Второй код рабочий
Второй код нормально работает. Выложил его как пример рабочего для сравнения
(может ни к чему).Просто с ним было то же, что и с первым. Что исправил не смогу
сказать потому как с ним бился дня2)) методом "тыка" и с отладчиком не понимая
до конца в чем причина.
Первый код работает если нет одинаковых значений в массиве. Если есть
одинаковые числа, что то ломается. Выяснил что в процедуре идёт смещение
номеров ячеек массива и обратился за помощью. Хочется понимать, а не применять
"научный тык"))).
Andrey
Thu, 01/25/2024 - 13:41
Permalink
Почему так
Такая строка тоже получилась после ошибок, из за которых
не запускалась программа.
Изначально было скорее всего так :
Потом как- нибудь:
В общем оставил, как работать стало. Я ж учусь)
Andrey
Thu, 01/25/2024 - 16:13
Permalink
KOD
В этом коде на строке 40( в сигнатуре функции ) при передаче массива
с именем "с" массив не меняется. А с именем "а" происходит смещение
и массив начинается с [0].
В этом коде на строке 40( в сигнатуре функции ) при передаче массива
с именем "с" массив не меняется. А с именем "а" происходит смещение
и массив начинается с [0].
Andrey
Fri, 01/26/2024 - 13:23
Permalink
Дополнительный вопрос
Объясните пожалуйста дополнительно в разборе зачем массиву в
объявлении переменных присваивать другое имя. То есть:
Зачем строка 3? Почему в строке 20 нельзя написать так :
Andrey
Sat, 01/27/2024 - 14:23
Permalink
Почему массив пустой
Удалил вопрос
vedro-compota
Sat, 01/27/2024 - 17:00
Permalink
Разбор проблемы по потере
Разбор проблемы по потере индекса добавлен в 15 урок - немного примеров в тексте + два видео: https://fkn.ktu10.com/?q=node/8614
Видео дополнительно сюда скопирую:
Основной вопрос про индексы это должно закрыть, остальные вопросы если остануться - оформляем отдельно
_____________
матфак вгу и остальная классика =)