Carlos Rocha Posted October 14, 2012 at 03:58 PM Report #479102 Posted October 14, 2012 at 03:58 PM Desejo passar uma constante, na verdade uma varivel por parametro com a intensão de identicar o tamanho de um array procedure remove_repetidos(array_repeti:array of real; quantos_campos:integer); var novo_array:array[1..quantos_campos] of real; begin for i:=0 to quantos_campos do begin for j:=i+1 to quantos_campos do begin if array_repeti[j]<>array_repeti[i] then novo_array[i]:=array_repeti[i]; end; end; end; A ideia é criar um novo array com quantos_campos forem passados por parametros. Mas, o pascal diz que não pode passar constante na expressão. Como sair dessa? Carlos Rocha
thoga31 Posted October 14, 2012 at 04:26 PM Report #479108 Posted October 14, 2012 at 04:26 PM https://wiki.portugal-a-programar.pt/dev_geral/pascal/passagem_parametro_referencia/ Se queres que seja uma constante, então tens de explicitar que assim será. Exemplo: procedure exemplo(const c : string); Knowledge is free!
Carlos Rocha Posted October 14, 2012 at 05:07 PM Author Report #479115 Posted October 14, 2012 at 05:07 PM (edited) Esse é que é o problema. Não será uma constante. Será uma variavel. Mas, não estou sabendo como determinar o tamanho do array através de parametro. Será que dá? Edited October 14, 2012 at 05:08 PM by carcleo
thoga31 Posted October 14, 2012 at 05:09 PM Report #479116 Posted October 14, 2012 at 05:09 PM O parâmetro "quantos_campos" vai ser alterado dentro do procedimento? Knowledge is free!
Carlos Rocha Posted October 14, 2012 at 05:38 PM Author Report #479121 Posted October 14, 2012 at 05:38 PM (edited) Não. Ele vai ser usado. A ideia seria criar um array de 'n' elementos tantos quantos o parametro quantos_campos receber. Na verdade, nem seria criar. Pois isso ficaria dento de begin end. No caso de var, seria declarar mesmo. Edited October 14, 2012 at 05:39 PM by carcleo
thoga31 Posted October 14, 2012 at 05:46 PM Report #479123 Posted October 14, 2012 at 05:46 PM (edited) "Usado" é diferente de "alterado". Se quantos_campos não for alterado, então podes declará-lo constante tal como indiquei no exemplo. Edited October 14, 2012 at 05:46 PM by thoga31 Knowledge is free!
Carlos Rocha Posted October 14, 2012 at 06:13 PM Author Report #479128 Posted October 14, 2012 at 06:13 PM Ficaria assim então? procedure remove_repetidos(var array_repeti:array of real; const quantos_campos:integer); var novo_array:array[1..quantos_campos] of real; begin for i:=0 to quantos_campos do begin for j:=i+1 to quantos_campos do begin if array_repeti[j]<>array_repeti[i] then novo_array[i]:=array_repeti[i]; end; end; end; Esta dando esse erro: 32 / 37 questo~1.pas Error: Can't evaluate constant expression
pwseo Posted October 14, 2012 at 06:57 PM Report #479132 Posted October 14, 2012 at 06:57 PM Investiga sobre a função SetLength. O que tu queres é uma array dinâmica, provavelmente.
thoga31 Posted October 14, 2012 at 07:16 PM Report #479136 Posted October 14, 2012 at 07:16 PM (edited) De facto fiz alguns testes e não funciona. É uma inconsistência da linguagem (compilador), mas temos de nos adaptar. Tens de utilizar Arrays Dinâmicos para fazeres o que queres dessa forma. var array1 : array[1..5] of real; // array estático array2 : array of real; // array dinâmico Length(array1); // (function) Retorna o número de elementos de uma array SetLength(array2, nova_dimensao); // (procedure) Define uma nova dimensão à array - AVISO! dimensão de base 0 EDIT: não tinha visto o post do @pwseo, ele recomendou precisamente o mesmo 🙂 Edited October 14, 2012 at 07:17 PM by thoga31 Knowledge is free!
pwseo Posted October 14, 2012 at 08:38 PM Report #479147 Posted October 14, 2012 at 08:38 PM thoga31, Penso que a dimensão não é de base 0 (ou seja, 5 elementos são sempre 5); o que é de base 0 é o acesso aos elementos armazenados (o elemento 5 é acedido através de array[4]) 🙂
thoga31 Posted October 14, 2012 at 08:51 PM Report #479149 Posted October 14, 2012 at 08:51 PM Penso que a dimensão não é de base 0 (ou seja, 5 elementos são sempre 5); o que é de base 0 é o acesso aos elementos armazenados (o elemento 5 é acedido através de array[4]) 🙂 Sim, é isso mesmo. Quando disse "dimensão de base 0" queria dizer precisamente isso. 😉 Aproveito e acrescento que o array que sofre um SetLength não pode ter uma dimensão definida aquando a sua declaração. Este método só se aplica a arrays dinâmicos, e quando se define uma dimensão logo à partida este será estático até ao fim, excepto em casos muito específicos que não interessam agora para o caso. Knowledge is free!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now