Probleme avec pchar et int

knetus Messages postés 15 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 21 août 2009 - 21 août 2009 à 09:44
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 22 août 2009 à 02:23
bonjour a vous tous

je débute en delphi et je n'arrive pas a comprendre ou est l'erreur dans ce petit bout de code :

var
  currentBuffer : Pchar;
  BufferCounter : integer;

function TForm1.essai():integer;
var
  c1,c2 : integer;
begin

  c1 := 0;
  c2 := 0;

  c1 := StrToInt(currentBuffer[BufferCounter]);
  c2 := StrToInt(currentBuffer[BufferCounter + 1]);

  BufferCounter := BufferCounter + 2;

  c1 := c1 + c2 shl 8;

  if(c1 > 32767) then
    c1 := c1 - 65536;

  result := c1;

end;


la variable BufferCounter est initialisé a 0 avant cette procédure.
a chaque fois ca me créer une erreur 'access violation' au niveau de :
c1 := StrToInt(currentBuffer[BufferCounter ]);


j'ai essayé beaucoup de choses mais rien n'y fait !!
merci d'avance pour votre aide.

19 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
21 août 2009 à 11:26
Salut,

currentBuffer pointe sur rien...
Qu'essaies-tu de faire ?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 12:57
CurrentBuffer n'a effectivement pas encore été initialisé.
Je ne sais pas ce que tu cherches à faire mais à tout hasard :

var
  currentBuffer : Pchar;
  BufferCounter : integer;

function TForm1.essai():integer;
var
  c1,c2 : integer;
begin

  c1 := 0;
  c2 := 0;

  CurrentBuffer := StrAlloc(LONGUEUR + 1);
  CurrentBuffer := 'Quelque chose qui ne dépasse pas LONGUEUR en taille';

  c1 := StrToInt(currentBuffer[BufferCounter]);
  c2 := StrToInt(currentBuffer[BufferCounter + 1]);

  BufferCounter := BufferCounter + 2;

  c1 := c1 + c2 shl 8;

  if(c1 > 32767) then
    c1 := c1 - 65536;

  result := c1;

  StrDispose(CurrentBuffer);

end;


Mais encore une fois, tu ne donnes aucune valeur à CurrentBuffer

Cordialement, Bacterius !
0
knetus Messages postés 15 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 21 août 2009
21 août 2009 à 13:22
merci pour vos reponses !
j'ai oublié de vous preciser :

  bufferSize := WaveHeader[1].dwBufferLength;
  hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, bufferSize);
  WaveHeader[1].lpData :=  GlobalLock(hBuf);


et plus loin avant la routine :
 currentBuffer := (PWaveHdr(Msg.lParam)^.lpData)
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 13:29
Tu essaye de lire un fichier WAVE ?
Pourquoi utiliser un PChar ? Si, comme tu l'indiques dans ton code, tu n'utilises que deux entiers c1 et c2, pourquoi ne pas utiliser un Int64 ?

Sinon :

hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, bufferSize);
Ca ne serait pas plutôt "GMEM_MOVEABLE or GMEM_SHARE" ?
Ca peut paraître peu intuitif mais le "and" ne veut pas dire que l'on veut que les deux flags soient respectés ... d'où l'erreur de VA peut-être ?


Cordialement, Bacterius !
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 13:30
[quote= rt15]currentBuffer pointe sur rien...
Qu'essaies-tu de faire ?/quote
et il a raison mais même si currentBuffer pointait sur quelque chose le code ne fonctionnerait pas !!!

bon d'ici à ce qu'on sache ce que tu désires faire avec ce code voici une modif qui le rend fonctionnel mais a quelle fin ... ???
[hr][b]var

  /bcurrentBuffer: Pchar = 'Une chaine de teste';
  BufferCounter: integer;

function  TForm1.essai: integer;
[b]var
  /bc1, c2: integer;
[b]begin
  /bc1 : = 0;
  c2 :=  0;

  c1 := Ord(currentBuffer[BufferCounter]);
  c2 := Ord(currentBuffer[BufferCounter + 1]);

  BufferCounter := BufferCounter + 2;

  c1 := c1 + c2  shl  8;

  if (c1 > 32767) [b]then
    /bc1 : = c1 - 65536;

  result := c1;
end;



[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 13:32
Et si BufferCounter était indéfini ? Pourtant je crois que les variables globales sont initialisées à 0

Cordialement, Bacterius !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 13:33
pourtant j'avais rafraichi

bref ... les deux lignes :
c1 := 0;
c2 := 0;
ne servent à rien


[hr]@+Cirec
[hr]
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 13:36
le problème vient de la:
currentBuffer[BufferCounter]
pointe sur un Char ... de ce fait on ne peut pas le passer à StrToInt sauf == "0".."9"
mais si c'est une chaine de caractère il y aura une erreur

[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 13:40
Oui mais il a eu une EAccessViolation, pas une EConvertError ...
Et c1 et c2 sont des variables locales, donc le compilateur (si je fais ça sur mon D6/D7) me prévient qu'ils ne sont peut-être pas initialisés

Cordialement, Bacterius !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 13:49
ton D7 ne doit pas être à jour

le mien ignore ces deux lignes et si je commentes je n'ai pas d'avertissements ... je présice que tous les messages sont activés chez moi

oui si tu avais lu correctement [quote=Cirec][quote=rt15] currentBuffer pointe sur rien...
Qu'essaies-tu de faire ?
/quote
et il a raison mais même si currentBuffer pointait sur quelque chose le code ne fonctionnerait pas !!!
/quote

j'ai une violation d'accès si CurrentBuffer ne pointe sur rien

il faut donc faire une vérification sur CurrentBuffer <> nil

[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 13:52
if Assigned(CurrentBuffer) then ...



Cordialement, Bacterius !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 13:54
et le hBuf renvoyé est il valide ?
il y a beaucoup de point ou peut se situer le problème ... il faut les éliminer un à un


[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 13:57
Le hBuf j'avais fait signaler que la combinaison "and" est improbable (ça serait plutôt "or" pour ce genre de paramètres). Ca vient probablement de là, et l'invalidité de ce handle se répercute sur toute la suite (en donnant un PChar nul => VA).

if hBuf <> 0 then ...


Cordialement, Bacterius !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 14:11
et quand le problème de buffer sera résolu
tu peux modifier ton code comme suit (pour éviter toutes erreurs de convertions):
[hr]function TForm1.essai: integer;

[b]var
  /bc1, c2: integer;
[b]begin
  /b//c1 :=  0;
   //c2 := 0;

  [i]{l'utilisation de StrToIntDef à la place de StrToInt
  évite les erreurs de convertions au cas ou et renvoie 0 dans ce cas}/i
  c1 : = StrToIntDef(currentBuffer[BufferCounter], 0);
  c2 := StrToIntDef(currentBuffer[BufferCounter + 1], 0);

  BufferCounter := BufferCounter + 2;

  c1 := c1 + c2  shl  8;

  if (c1 > 32767) [b]then
    /bc1 : = c1 - 65536;

  result := c1;
end;
[hr]


[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 14:21
@Cirec : ça m'étonnerait que le header d'un Wave contienne des caractères numériques. je pense qu'il contient plutôt des octets, interprétés comme des caractères.

Cordialement, Bacterius !
0
knetus Messages postés 15 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 21 août 2009
21 août 2009 à 15:08
en gros je veux récupérer tous les bytes sortant de la carte son et leur faire un traitement !
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
21 août 2009 à 15:46
@Bacterius:
dans le cas présent on s'en fout ... et indépendamment du travail a effectuer, dans le code qu'il nous donne,
il a un Buffer déclaré comme PChar donc
un appel à StrToInt(Buffer[n]) donnera toujours un caractère et si ce dernier n'est pas dans intervalle 0..9 ben StrToInt plante ... voilà pourquoi le StrToIntDef.


[hr]@+Cirec
[hr]
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 août 2009 à 16:32
Oui je comprends ...
D'après le code que tu nous donnes, et ce que tu veux faire, intuitivement je dirais que CurrentBuffer doit contenir les bytes sortant de la carte son ... Dans ce cas :

for I := 0 to Length(CurrentBuffer) - 1 do
  // Traitement (faire Byte(CurrentBuffer[I]) pour obtenir le byte et pas le caractère).


Ou sinon, passer par les pointeurs

Cordialement, Bacterius !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
22 août 2009 à 02:23
@knetus
« en gros je veux récupérer tous les bytes sortant de la carte son et leur faire un traitement! »

C'est pas vraiment pour les débutants...
Mais si t'as pas froid aux yeux, regarde du côté de TStream.
0
Rejoignez-nous