Résultats de 1 à 2 sur 2

Sujet : grandes listes chaînées

  1. #1
    Visiteur MP
    Visiteur MP

    grandes listes chaînées

    bonjour
    je dois stocker les mots d\'un fichier texte d\'environ 450ko dans une liste chaînée, mais je n\'arrive pas à contourner les limitations de 64ko pour les variables globales en Pascal.
    comment faire?
    merci

    voici mon programme:
    [code]
    program marqueurSN;

    type p_mot_etq = ^mot_etq; { Pointeur … type contenant mot et etq. }
    mot_etq = record
    mot : string;
    etq : string;
    suivant : p_mot_etq;
    end;
    tab_liste = array[1..16383] of p_mot_etq;

    var input : text;
    ponct : boolean;
    c : char;
    word,tag : string;
    x : integer;

    (*content : mot_etq;
    liste1 : p_mot_etq;
    liste_temp : p_mot_etq;
    liste_debut : p_mot_etq;
    liste_fin : p_mot_etq;*)

    { Proc‚dure qui donne le code ASCII du caractŠre lu dans le corpus. }
    procedure read_char;
    begin
    read(input,c);
    x:=ord(c);
    end;

    { Fonction qui construit les elements d\'une liste - les mots du corpus }
    { et les ‚tiquettes. Prend en paramŠtre une chaŒne de caractŠres, qui }
    { correspond … un nom de variable selon qu\'elle construit un mot ou }
    { une ‚tiquette, et un entier qui correspond au code ASCII du d‚limit- }
    { des mots (deux-points quand on ‚crit un mot, \"carriage return\" si }
    { c\'est une ‚tiquette. }

    function build_element(element:string; delimiter:integer):string;
    var str1 : string;
    begin
    { Cette boucle construit les mots et les ‚tiquettes … partir du }
    { fichier corpus donn‚ par concat‚nation de caractŠres. }

    read_char;

    WHILE (x=35) DO
    begin
    readln(input);
    read_char;
    end;

    IF ((x=13) OR (eof(input))) THEN
    begin
    build_element:=\'PONCT\';
    end
    ELSE
    begin
    IF (x=10) THEN
    read(input,c);
    str1:=c;

    { Si un signe de ponctuation est lu on veut arrˆter la }
    { concat‚nation car il n\'y a pas d\'‚tiquette associ‚e. }

    ponct:=((c=\',\') OR (c=\'.\') OR (c=\'(\') OR (c=\')\') OR (c=\'-\') OR
    (c=\';\') OR (c=\':\') OR (c=\'/\') OR (c=\'?\') OR (c=\'!\') OR
    (c=\'\\\') OR (c=\'\"\'));

    IF ponct THEN
    begin
    str1:=c;
    end
    ELSE
    begin
    { La boucle concatŠne les caractŠres jusqu\'… ce qu\'elle }
    { rencontre un d‚limiteur dans le fichier d\'entr‚e. Une fois }
    { la boucle termin‚e, la chaŒne de caractŠres est renvoy‚e }
    { la fonction. }

    WHILE not ((x=delimiter) OR (x=26)) DO
    begin
    read_char;
    IF not ((x=delimiter) OR (x=10)) THEN
    begin
    str1:=str1+c;
    end;
    end;
    end;
    build_element:=str1;
    end;
    end;

    { Pour ajouter un mot … une liste. Ajoute tous les mots et ‚tiquettes }
    { construits … une liste. }
    function ajouter_liste(content:mot_etq; liste_mot_etq)_mot_etq;
    var u: p_mot_etq;
    begin
    new(u);
    u^.mot:=content.mot;
    u^.etq:=content.etq;
    u^.suivant:=NIL;
    IF liste <> NIL THEN
    liste^.suivant:=u;
    ajouter_liste:=u;
    end;

    procedure afficher_liste(liste_mot_etq);
    var u : p_mot_etq;
    begin
    u:=liste;
    WHILE u<>NIL DO
    begin
    writeln(u^.mot,\':\',u^.etq);
    u:=u^.suivant;
    end;
    end;

    { LibŠre la m‚moire occup‚e par la liste. }
    procedure detruire_liste(liste_mot_etq);
    var u : p_mot_etq;
    begin
    u:=liste;
    WHILE u<>NIL do
    begin
    u:=u^.suivant;
    dispose(liste);
    liste:=u;
    end;
    end;

    procedure creer_mots(nom:string; delim1:integer; delim2:integer; varname1:string; varname2:string; state:integer);
    var liste1 : p_mot_etq;
    liste_temp : p_mot_etq;
    content : mot_etq;
    begin
    new(liste1);
    liste1:=NIL;
    liste_temp:=NIL;
    assign(input,nom);
    reset(input);
    WHILE not eof(input) DO
    begin
    IF state=0 THEN
    word:=build_element(\'wordvar\',delim1)
    ELSE word:=\'\';

    tag:=build_element(\'tagvar\',delim2);
    content.mot:=word;
    content.etq:=tag;
    liste1:=ajouter_liste(content,liste1);
    IF liste_temp=NIL THEN
    liste_temp:=liste1;
    end;
    close(input);
    writeln(\'AFFICHER LA LISTE. FICHIER : \',nom);
    afficher_liste(liste_temp);
    detruire_liste(liste1);
    end;

    begin
    creer_mots(\'XXX/corpus.txt\',58,13,\'wordvar\',\'tagvar\',0);
    creer_mots(\'XXX/SNdebut.txt\',13,13,\'wordvar\',\'tagvar\',1);
    creer_mots(\'XXX/SNfin.txt\',13,13,\'wordvar\',\'tagvar\',1);
    end.

  2. #2
    Membre MP
    Inscrit
    août 2013
    Localisation
    12100
    Messages
    687
    Je ne connaît pas le PASCAL.
    Sur un plan général, lorsqu\'on ne peut pas travailler avec suffisament d\'espace en mémoire, il faut travailler sur des fichiers sur le disque.
    Les fichiers peuvent être séquentiels ou directs.
    Pour des données plus structurées, il faut utiliser une base de données. MySQl est gratuite et disponible sur le net à mysql.com.

    à suivre
    Moby
    moby

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé