Recherche de string ds un bloc mémoire sans type

Recherche de string ds un bloc mémoire sans type - Delphi/Pascal - Programmation

Marsh Posté le 11-05-2004 à 10:57:21    


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: ?

Reply

Marsh Posté le 11-05-2004 à 10:57:21   

Reply

Marsh Posté le 11-05-2004 à 11:11:16    

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
Reply

Marsh Posté le 11-05-2004 à 11:17:20    

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
Reply

Marsh Posté le 11-05-2004 à 11:52:04    

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
Reply

Marsh Posté le 11-05-2004 à 11:59:19    

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:

Reply

Marsh Posté le 11-05-2004 à 12:14:01    

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
Reply

Marsh Posté le 11-05-2004 à 12:29:05    

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.  
 

Reply

Marsh Posté le 11-05-2004 à 14:53:26    

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
Reply

Marsh Posté le 11-05-2004 à 18:39:45    

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:

Reply

Marsh Posté le 11-05-2004 à 18:41:14    

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
Reply

Marsh Posté le 11-05-2004 à 18:41:14   

Reply

Marsh Posté le 11-05-2004 à 18:50:25    

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".  

Reply

Marsh Posté le 11-05-2004 à 19:01:01    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed