Recherche de string ds un bloc mémoire sans type - Delphi/Pascal - Programmation
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.
Marsh Posté le 11-05-2004 à 11:17:20
antp a écrit : J'ai pas tout compris. |
Oui : Delphi. (Au passage : ton paquet de VCL est super )
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...
Marsh Posté le 11-05-2004 à 11:52:04
HERIBERT a écrit : Oui : Delphi. (Au passage : ton paquet de VCL est super ) |
pourtant y a pas grand chose à part des trucs récupérés dans la JVCL
HERIBERT a écrit : |
bah ici c'est simple aussi, les string Delphi sont des char * camouflés (gestion mémoire automatisée)
HERIBERT a écrit : |
Poste ton code
HERIBERT a écrit : |
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é).
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 |
Moi qui suis pas clair 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
Marsh Posté le 11-05-2004 à 12:14:01
Builder c'est du C++, pas du C 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
Pour trouver ta chaîne, tu peux essayer StrPos. Tu comptais utiliser quoi en C ?
Marsh Posté le 11-05-2004 à 12:29:05
antp a écrit : Builder c'est du C++, pas du C Et en Builder t'as toute la VCL. |
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.
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 ?
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) |
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.
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.
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. |
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".
Marsh Posté le 11-05-2004 à 19:01:01
heu si dans Delphi et dans tous les autres on peut suivre en pas à pas
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
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
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) ?
}
?