PSingle

Résolu
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005 - 23 avril 2005 à 17:07
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005 - 25 avril 2005 à 10:23
Bonjour,

Je doit lire un buffer de type PSingle (c'est à dire ^Single) qui
contient 512 valeurs réelles (de type single), or je ne voit pas
comment un pointeur vers un single peut contenir autant de valeurs.



Même une piste m'aiderais beaucoup.

Merci d'avance.

9 réponses

cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
24 avril 2005 à 11:22
Première solution:



Var

i:integer;

x: PSingle;

begin

//Allocation memoire de 512 Single

x := AllocMem(512*SizeOf(Single));

//On rempli avec une valeur de base pour l'exemple

For i : = 511 DownTo 0 Do

PSingle(Integer(X)+SizeOf(Single)*i)^:= 1.1;



//Et On reli derrière

{PSingle(OffSet) avec Offset=Adresse du Single Voulu

X pointe simplement sur l'OffSet le debut du tableau de 512

PSingle(Addr_Debut+Index)^ Renvoi donc le Index Ième Single}

For i : = 511 DownTo 0 Do

memo1.Lines.Add(IntToStr(i)+': '+FloatToStr(PSingle(Integer(X)+SizeOf(Single)*i)^));

end;



Cette solution est surtout pour te montrer comment ça se passe en mémoire elle est trop complexe





Deuxieme solution:

Type

SingleArray= Array [0..511] Of Single;

PSingleArray =^SingleArray;



Var

i:integer;

x: PSingle;

begin

x := AllocMem(512*SizeOf(Single));

For i : = 511 DownTo 0 Do

PSingleArray(x)[i]:= 1.1;

//Ici on retrouve notre Ième Single en Faisant simplement PSingleArray(x)[i]

For i : = 511 DownTo 0 Do

memo1.Lines.Add(IntToStr(i)+': '+FloatToStr(PSingleArray(x)[i]));

end;

bouh
3
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
24 avril 2005 à 14:51
Merci beaucoup , j'ai enfin reussit grâce à ton code, voici ce que j'obtient (et qui marche impec) :



Type

PSingleArray = ^TSingleArray;

TSingleArray = Array[0..511] of Single;



// On considerer que "Ancien" est le tableau de type ^Single à lire

Var

Temp : PSingleArray;

Nouveau : TSingleArray; // où je vais stocker les valeurs

i : Integer;

begin

Temp : = PSingleArray(Ancien);

for i := 0 to 511 do

Nouveau[i] := Temp^[i];

end;



Une deniere question tant qu'à faire : si je ne connait pas le nombre d'éléments contenue dans le PSingle, y a t-il un moyen pour le savoir? Merci.
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
25 avril 2005 à 00:53
Non, tu ne peux pas le retrouver si tu ne le sais pas à l'avance. Un pointeur est une adresse mémoire, donc comment savoir ce qu'il y a derrière ? Un single seul, 10 ou 2000 ? voir même une structure, un type utilisateur, etc....

Bref, une adresse mémoire nous renseigne sur l'adresse d'un "objet" mais pas sur le type de cet "objet".

Donc, non aucun moyens

Cordialement.
3
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
23 avril 2005 à 18:24
Tout d'abord :
  T[i]
est équivalent à Pointeur
(T+i)
.
Donc PSingle ^Single Pointeur peut très bien un pointeur sur un tableau de single.

Cependant il aurait était préférable, pour une raison de clarté de déclarer les types suivant :

type
PArraySingle = ^TArraySingle ;
TArraySingle = array[0..151] of Single ;

Cordialement.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
24 avril 2005 à 02:24
Merci mais je n'ai toujours pas reussit à lire dans ce tableau.
Pouvez-vous me donner un exemple de code pour lire dans de tel tableau
svp?



Merci.
0
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
24 avril 2005 à 11:01
Si je ne dis pas de bêtises le PSingle pointe sur le 1er élément du tableau.
Pour lire le suivant il faut faire Inc(pMonSingle); et là tu devrai passer à l'élément suivant. (où pMonSingle est déclaré comme ceci : pMonSingle: PSingle; ).

Tout problème a sa solution... Mais en général, c'est jamais la bonne...
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
24 avril 2005 à 15:16
Non, pas de moyens.

Cordialement.
0
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
24 avril 2005 à 19:56
Arrg , et en utilisant les fonctions de gestion de la mémoire (alloc, get etc?) ou même pourquoi pas de l'assembleur?
0
FleX2009 Messages postés 22 Date d'inscription mercredi 15 décembre 2004 Statut Membre Dernière intervention 5 mai 2005
25 avril 2005 à 10:23
Ok merci beaucoup, ca m'a vraiment aidé!
0
Rejoignez-nous