Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 20/08/2018 21:55:50
- trainvapeur
- Membre
initialisation d'un tableau avec des constantes en hexadecimal
Bonsoir,
je voudrais initialiser un tableau avec les 32 premières puissances de 2. Si je ne prend que les 3 premières, je peux écrire :
ctableau constant integer ARRAY[3] := '{1, 2, 4}';
Cela fonctionne. Mais cela devient un peu compliqué avec les grandes valeurs et pour être plus lisible, je voudrais écrire les constantes en hexadécimal. Quelquechose comme :
ctableau constant integer ARRAY[3] := '{X'00000001', X'00000002', X'00000004'}';
Je crois avoir essayé toutes les écritures possibles mais soit j'ai une erreur de syntaxe soit c'est à l'execution que j'ai une erreur.
Est-ce que vous auriez une idée ?
Par contre, la déclaration d'une variable simple fonctionne :
toto constant integer := X'00000004';
Merci d'avance !
Jean à Grenoble
Hors ligne
#2 21/08/2018 21:57:21
- Marc Cousin
- Membre
Re : initialisation d'un tableau avec des constantes en hexadecimal
C'est plus simple, je trouve, avec la syntaxe ARRAY[], dans ce cas là:
ARRAY[X'00000001', X'00000002', X'00000004'];
Sinon vous pouvez initialiser la variable avec une fonction, par exemple:
create or replace function genere_array () returns int[] language plpgsql as
$$
declare i int;
declare ctableau int[]:= array[]::int[];
begin
for i in 0..31 loop
ctableau := ctableau || (1<<i);
end loop;
return ctableau;
end
$$
;
Marc.
Hors ligne
#3 22/08/2018 10:28:51
- trainvapeur
- Membre
Re : initialisation d'un tableau avec des constantes en hexadecimal
Bonjour Marc,
avec la syntaxe
ctableau constant int[3]:= array[X'00000001', X'00000002', X'0000000F']::int[];
tout fonctionne !
Cela m'a permis de 'résoudre' un autre 'bug' ailleurs : si j'affiche les valeurs de ctableau dans un RAISE NOTICE, j'obtiens bien 1, 2 et 15. Mais si j'enlève le ::int[] à la fin de la ligne, le même RAISE donne 1, 10, 1111 ce qui représente la chaine de bit mais dans un nombre entier !! Si j'affiche 2 * ctableau[3], j'obtiens 2222 !!!!
Merci beaucoup pour ton aide.
Jean à Grenoble
Hors ligne