Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
736 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Recherche de string ds un bloc mémoire sans type

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recherche de string ds un bloc mémoire sans type

n°721589
HERIBERT
Posté le 11-05-2004 à 10:57:21  profilanswer
 


Ptr_Bloc_Mem : pointer
 
     Ptr_Bloc_Mem := AllocMem(50000);       // alloc mémoire avant lecture
     AssignFile(F, 'Fichier.bin');
     Reset(F, 1);                           // Ouverture fichier
     BlockRead(F, Ptr_Bloc_Mem^, 100);      // Lecture du bloc
     CloseFile(F);                          // Fichier fermé
 
{
J'ai écrit, ds Fichier.BIN, la chaîne (string) 'ABCDEFGH' en position 10 (à partir du dixième octet).  
 
A la lecture du fichier : comment calculer la position  d'une chaîne (de type string) en me servant de Ptr_Bloc_Mem (pointer) ?  
}
 :heink: ?

mood
Publicité
Posté le 11-05-2004 à 10:57:21  profilanswer
 

n°721601
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 11:11:16  profilanswer
 

J'ai pas tout compris.
Déjà pourquoi tu alloues 50 000 octets ?
Tu écris ta chaîne comment ?
Tu veux écrire une chaîne de longueur fixe ou de longueur "inconnue" ?
Si elle a une longueur fixe, tu déclares une chaîne (string/AnsiString) sur laquelle tu fais un SetString, puis tu passes à la fonction Read/BlockRead @s[1] en supposant que s soit la chaîne.
Si elle a une longueur variable tu dois écrire/lire sa longueur avant la chaîne elle-même.
Si tu veux transférer x octets de ton bloc mémoire vers une chaîne plutôt que depuis un fichier, tu peux utiliser Move plutôt que Read (toujours à balancer vers @s[1]).
 
Note: ce que je dis est valable en Delphi. Pour le Pascal je ne sais pas exactement ce qu'il y  a comme types de chaînes dispo.


Message édité par antp le 11-05-2004 à 11:12:50

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°721608
HERIBERT
Posté le 11-05-2004 à 11:17:20  profilanswer
 

antp a écrit :

J'ai pas tout compris.
Déjà pourquoi tu alloues 50 000 octets ?
Tu écris ta chaîne comment ?
Tu veux écrire une chaîne de longueur fixe ou de longueur "inconnue" ?
Si elle a une longueur fixe, tu déclares une chaîne (string/AnsiString) sur laquelle tu fais un SetString, puis tu passes à la fonction Read/BlockRead @s[1] en supposant que s soit la chaîne.
Si elle a une longueur variable tu dois écrire/lire sa longueur avant la chaîne elle-même.
Si tu veux transférer x octets de ton bloc mémoire vers une chaîne plutôt que depuis un fichier, tu peux utiliser Move plutôt que Read (toujours à balancer vers @s[1]).
 
Note: ce que je dis est valable en Delphi. Pour le Pascal je ne sais pas exactement ce qu'il y  a comme types de chaînes dispo.


Oui : Delphi. (Au passage : ton paquet de VCL est super :love: )
 
Je vais devoir chercher des chaînes de caractères ds différents types de fichiers. Donc, j'utilise un Pointer (void en C) pr désigner l'adresse du buffer où je charge les octets lus.  
 
Je connais donc l'adresse du buffer... mais comment y chercher une chaîne de type string :??: C'est pas comme avec les tableaux de caractères du C sous DOS, où l'on n'avait pas de type string. Tout était plus simple !  
 
Là, j'ai un pb de transtypage, on dirait.  
 
Je cherche donc la position d'une chaîne (string) ds le buffer (void). Pas évident...


Message édité par HERIBERT le 11-05-2004 à 11:18:00
n°721684
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 11:52:04  profilanswer
 

HERIBERT a écrit :

Oui : Delphi. (Au passage : ton paquet de VCL est super :love: )


 
:??: pourtant y a pas grand chose à part des trucs récupérés dans la JVCL :D
 

HERIBERT a écrit :


Je connais donc l'adresse du buffer... mais comment y chercher une chaîne de type string :??: C'est pas comme avec les tableaux de caractères du C sous DOS, où l'on n'avait pas de type string. Tout était plus simple !  


 
bah ici c'est simple aussi, les string Delphi sont des char * camouflés (gestion mémoire automatisée)
 

HERIBERT a écrit :


Là, j'ai un pb de transtypage, on dirait.  


 
Poste ton code :o
 

HERIBERT a écrit :


Je cherche donc la position d'une chaîne (string) ds le buffer (void). Pas évident...


 
Si tu sais pas où est la chaîne, que ce soit en C ou en Pascal je ne vois pas trop comment tu peux le deviner :??:
À moins que tu veuilles chercher une chaîne précise dans un bloc de données ? (je ne sais pas si c'est toi qui n'est pas clair, ou si c'est moi qui ne suis pas bien réveillé).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°721695
HERIBERT
Posté le 11-05-2004 à 11:59:19  profilanswer
 

antp a écrit :

:??: pourtant y a pas grand chose à part des trucs récupérés dans la JVCL :D
 
 
 
bah ici c'est simple aussi, les string Delphi sont des char * camouflés (gestion mémoire automatisée)
 
 
 
Poste ton code :o
 
 
 
Si tu sais pas où est la chaîne, que ce soit en C ou en Pascal je ne vois pas trop comment tu peux le deviner :??:
À moins que tu veuilles chercher une chaîne précise dans un bloc de données ? (je ne sais pas si c'est toi qui n'est pas clair, ou si c'est moi qui ne suis pas bien réveillé).


Moi qui suis pas clair :D Je "pense" en C, mais utilise Delphi. Pratique, parfois, mais l'habitude du C (ANSI) est restée. Ah ! Si je pouvais trouver un Builder récent Personal Edition :( ! Cela dit, passer par les API pr gérer les fichiers, c'est moins commode qu'en Delphi.  
 
En C, avec les pointeurs, les tableaux de caractères et les structures, on faisait ce qu'on voulait...  
 
Je cherche une fonction me permettant de trouver, ds un buffer pointé par un pointeur void (type : pointer) une suite de caractères. Chaîne ou  tableau de caractères. C'est faisable, ou je suis bon pour chercher un Builder récent ?
 
Je vais poster le code, on verra bien  :heink:

n°721721
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 12:14:01  profilanswer
 

Builder c'est du C++, pas du C :o Et en Builder t'as toute la VCL.
En Delphi tu peux faire la même chose qu'en C. Rien ne t'interdit d'utiliser des PChar plutôt que les chaînes de Delphi :o
Pour trouver ta chaîne, tu peux essayer StrPos. Tu comptais utiliser quoi en C ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°721739
HERIBERT
Posté le 11-05-2004 à 12:29:05  profilanswer
 

antp a écrit :

Builder c'est du C++, pas du C :o Et en Builder t'as toute la VCL.
En Delphi tu peux faire la même chose qu'en C. Rien ne t'interdit d'utiliser des PChar plutôt que les chaînes de Delphi :o
Pour trouver ta chaîne, tu peux essayer StrPos. Tu comptais utiliser quoi en C ?


 
Voici le code :
 
procedure Afficher;
var Pos_Chn : PChar;
    T_Buffer : array[0..500] of Char;
 
 
begin
     AssignFile(F, 'Fichier.bin');
     Reset(F, 1);
     BlockRead(F, T_Buffer, 500);  // Lit correctement. ABCDEFGH commence au 10° octet
     CloseFile(F);
 
 
     // Recherche Chn
     Pos_Chn := StrPos(T_Buffer, 'ABCDEFGH'); // marche pas !  
 
Retourne nil au lieu de 10. Je voudrais la position de la chaîne ABCDEFGH ds T_Buffer.  
 

n°721963
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 14:53:26  profilanswer
 

Et dans ton T_Buffer, tu as des caractères imprimables ou bien de tout et n'importe quoi ? Parce que s'il y a des 0 et des choses de ce genre, StrPos n'y arrivera pas (tu devrais alors déclarer ton tableau comme un tableau de Byte et non de Char, ça serait plus logique vu que ce ne sont pas spécialement des caractères imprimables)
 
En C t'aurais fait comment ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°722313
HERIBERT
Posté le 11-05-2004 à 18:39:45  profilanswer
 

antp a écrit :

Et dans ton T_Buffer, tu as des caractères imprimables ou bien de tout et n'importe quoi ? Parce que s'il y a des 0 et des choses de ce genre, StrPos n'y arrivera pas (tu devrais alors déclarer ton tableau comme un tableau de Byte et non de Char, ça serait plus logique vu que ce ne sont pas spécialement des caractères imprimables)
 
En C t'aurais fait comment ?


1/ La chaîne test est : 'ABCDEFGH' -> mais la trouve pas.
2/ En C, je lisais ds un buffer, et traitais les données en fonction du contexte. Je lisais soit ds une structure, soit un tableau de char...
 
Je vais voir avec des bytes. :jap:

n°722317
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 18:41:14  profilanswer
 

Les bytes ne changeront rien, c'est juste au niveau logique par rapport au contenu que je disais ça.
En C tu aurais utilisé quoi ? strpos ou autre chose ? A priori si ça marche en C ça doit marcher en Delphi.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 11-05-2004 à 18:41:14  profilanswer
 

n°722339
HERIBERT
Posté le 11-05-2004 à 18:50:25  profilanswer
 

antp a écrit :

Les bytes ne changeront rien, c'est juste au niveau logique par rapport au contenu que je disais ça.
En C tu aurais utilisé quoi ? strpos ou autre chose ? A priori si ça marche en C ça doit marcher en Delphi.


Je ne me souviens plus exactement : le C que j'utilisais, c'était ds les années 90, Borland C++ avec Turbo Assembleur et Turbo Debugger.  
 
Au passage : jamais retrouvé un Debogueur aussi puissant que TD. Pas un seul avec lequel on puisse suivre le source pas à pas ? Le débogueur intégré de Delphi :??:  
 
Effectivement, les bytes ça ne passe pas. Il me faut trouver autre chose. En C, ce qui était pratique (entre autres) c'était le type void des pointeurs. On assignait leur valeur au pointeur du type qu'on voulait, et ça passait. Delphi est bcp plus rigide au niveau des "type mismatch".  

n°722355
antp
Super Administrateur
Champion des excuses bidons
Posté le 11-05-2004 à 19:01:01  profilanswer
 

heu si dans Delphi et dans tous les autres on peut suivre en pas à pas :o
Suffit de mettre un breakpoint quelque part (clic dans la marge) et ensuite quand il s'arrête à cet endroit tu fais du pas à pas avec les commandes des menus ou les touches de raccourci.
 
En Delphi tu passes n'importe quoi en n'importe quoi aussi, la seule différence c'est que tu dois le dire explicitement :
 
a: Integer;
 
a := Integer(Pointer(Button1));
TForm(Pointer(a)).Show;
 
bon évidemment ici ça plantera, mais c'est pour montrer qu'on peut faire comme en C :D
Si tu me donnes le code que tu ferais en C je peux éventuellement te le traduire en Delphi.
"void*" du C = "Pointer" de Delphi


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Recherche de string ds un bloc mémoire sans type

 

Sujets relatifs
[C++]Fonction pour passer d'une string vers une var numérique ?[java]Efficacité pour la lecture d'un fichier texte --> String
Expression reguliere checker si un string est borne par ','[C#] Recherche moteur SMTP, et conseil pour intégration dans un prog
Pb de recherche dans un fichierexplication de bloc "static" en java
execution de stringconvertir un double ou un float en string ou en char
recherche de stringsThread, prob libération mémoire
Plus de sujets relatifs à : Recherche de string ds un bloc mémoire sans type


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR