IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

DOS Et Far pointer


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut DOS Et Far pointer
    Bonjour,
    je travail actuellement sur un programme DOS qui doit faire une allocation dynamique de la memoire de plus de 64ko donc j'utilise des far pointer

    tout marche tres bien pour la réservation et la libération de la mémoire.
    le probleme survient quand je reserve "beaucoup" de memoire et que je tente une lecture apres les octets 65535 (taille max encoder en 16bit).

    par exemple (code bidon mais illustrant bien mon probleme)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    unsigned long int Size = 307200 ;
    unsigned long int i      = 0;
     
    unsigned char far * pt = farmalloc(Size);
     
     
    while(i<Size)
    {
           MaFonction(pt[i]);
           i++;
    }
     
     
    farfree(pt);
    le probleme vient de l'instruction pt[i] qui me renvoie la bonne valeur jusqu'a i = 65535 mais qui apres reboucle au debut de la memoire, c'est a dire par exemple que si i prends les valeurs :

    - 65536 alors pt[i] pointe en faites vers pt[0]!!!!
    - 65537 alors pt[i] pointe en faites vers pt[1]!!!!
    - 65538 alors pt[i] pointe en faites vers pt[2]!!!!
    .....
    -131072 alors pt[i] pointe en faites vers pt[0]!!!!
    -131072 alors pt[i] pointe en faites vers pt[1]!!!!
    -131072 alors pt[i] pointe en faites vers pt[3]!!!!
    ......

    Voila j'espere avoir ete assez claire
    Merci de votre attention

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Le problème vient tout simplement du fait que tu utilise un environnement 16 bit, et donc tu ne peux réserver qu'au maximum 16 bit adresses (soit 65536 adresses). Les far pointeur permettent normalement de passeer ce problème mais c'est alors ton système qui te limite

    Si tu es sous windows XP, il me semble qu'il faut que tu dise que ton programme peut utiliser plus de mémoire. Si tu es sous turbo c ça devrait être fait automatiquement.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    essaie déjà dans ta boucle des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf( "%lp", &(pt[i]) );
    pour être sûr des adresses: Je ne sais pas trop comment ton compilo gère les far pointers, car il faut savoir que ce ne sont pas de simples pointeurs 32bits: Ils sont séparés en segment+offset et (p (seg:off) + 65536 n'équivaut pas à (seg+1:off) )

    Bref, affiche les valeurs du pointeur pour p+0, p+65536 etc, qu'on voie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: DOS Et Far pointer
    Citation Envoyé par johjoh
    je travail actuellement sur un programme DOS qui doit faire une allocation dynamique de la memoire de plus de 64ko donc j'utilise des far pointer
    <pas grand chose à voir avec le langage C...>
    Ben non. En x86 mode réel, on ne sais pas adresser plus de 64 k en une fois. ensuite, il faut segmenter et travailler par page (comme avec kmalloc() sous Linux en mode Kernel).

    D'autre part, si tu compiles en modèle de mémoire 'large', tu n'as pas besoin de 'far', ni de 'farmalloc() etc. C'est le modéle le plus proche du standard C.

    Tu es vraiment obligé de travailler en mode réel ? Peux-tu installer un DPMI, DJGPP et donc travailler en mode 386 protégé ? Quelle est ton processeur ?
    </>

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Par défaut
    Les derniers compilo Borland pour DOS proposent un modele huge, où les pointeurs (huge il me semble) permettent de gerer plus de 64ko avec un pointeur, mais c'est plus lent que des pointeurs far

    (les pointeurs Huge restent toujours sur les 16 premiers octets d'une page)

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gandalf
    Les derniers compilo Borland pour DOS proposent un modele huge, où les pointeurs (huge il me semble) permettent de gerer plus de 64ko avec un pointeur, mais c'est plus lent que des pointeurs far

    (les pointeurs Huge restent toujours sur les 16 premiers octets d'une page)
    Le mode huge est instable. Le développement a été arrété il y a 10 ans...


    http://www.digitalmars.com/archives/cplusplus/280.html
    http://www.digitalmars.com/ctg/ctgMemoryModel.html
    http://bdn.borland.com/article/0,1410,18049,00.html

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut
    Merci a tous pour votre rapidité et la precision de vos explications !!!
    la solution ete bien de declarer les pointeurs en huge
    en declarant les pointeurs en far j'obtenais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    pt[0]=0x0 @ 1F6A:0004
    pt[1]=0x0 @ 1F6A:0005
    pt[2]=0x0 @ 1F6A:0006
    pt[3]=0x0 @ 1F6A:0007
    pt[4]=0x14 @ 1F6A:0008
    pt[5]=0x0 @ 1F6A:0009
    pt[6]=0x0 @ 1F6A:000A
    pt[7]=0x0 @ 1F6A:000B
    pt[8]=0x0 @ 1F6A:000C
    pt[9]=0x0 @ 1F6A:000D
    pt[10]=0xc8 @ 1F6A:000E
    pt[11]=0x0 @ 1F6A:000F
    pt[12]=0x0 @ 1F6A:0010
    pt[13]=0x0 @ 1F6A:0011
    pt[14]=0x0 @ 1F6A:0012
    pt[15]=0x0 @ 1F6A:0013
    pt[16]=0x0 @ 1F6A:0014
    pt[17]=0x0 @ 1F6A:0015
    pt[18]=0x0 @ 1F6A:0016
    pt[19]=0x0 @ 1F6A:0017
    pt[20]=0x0 @ 1F6A:0018
    pt[21]=0x0 @ 1F6A:0019
    pt[22]=0x0 @ 1F6A:001A
    pt[23]=0x0 @ 1F6A:001B
    pt[24]=0x0 @ 1F6A:001C
    pt[25]=0x0 @ 1F6A:001D
    ........
    pt[65532]=0x0 @ 1F6A:0000
    pt[65533]=0x0 @ 1F6A:0001
    pt[65534]=0x0 @ 1F6A:0002
    pt[65535]=0x0 @ 1F6A:0003
    pt[65536]=0x0 @ 1F6A:0004
    pt[65537]=0x0 @ 1F6A:0005
    pt[65538]=0x0 @ 1F6A:0006
    pt[65539]=0x0 @ 1F6A:0007
    pt[65540]=0x14 @ 1F6A:0008
    pt[65541]=0x0 @ 1F6A:0009
    pt[65542]=0x0 @ 1F6A:000A
    pt[65543]=0x0 @ 1F6A:000B
    pt[65544]=0x0 @ 1F6A:000C
    pt[65545]=0x0 @ 1F6A:000D
    pt[65546]=0xc8 @ 1F6A:000E
    pt[65547]=0x0 @ 1F6A:000F
    pt[65548]=0x0 @ 1F6A:0010
    pt[65549]=0x0 @ 1F6A:0011
    pt[65550]=0x0 @ 1F6A:0012
    pt[65551]=0x0 @ 1F6A:0013
    pt[65552]=0x0 @ 1F6A:0014
    pt[65553]=0x0 @ 1F6A:0015
    la declaration du pointeur en huge au lieu de far m'a permis de bien acceder a la bonne adresse.

    Merci encore
    salutations

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 24
    Par défaut
    Gandalf a écrit:
    Les derniers compilo Borland pour DOS proposent un modele huge, où les pointeurs (huge il me semble) permettent de gerer plus de 64ko avec un pointeur, mais c'est plus lent que des pointeurs far

    (les pointeurs Huge restent toujours sur les 16 premiers octets d'une page)

    Le mode huge est instable. Le développement a été arrété il y a 10 ans...
    Arf je croyais tenir ma solutions mais si c'est instable.....
    comment puis-je faire alors pour acceder a plus de 64ko en faisaint une seul reservation? est-ce possible?

    EDIT : De plus il est vrai que les huges pointeurs sont lents, trop lents pour ce que je veut faire.

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Une solution alternative est d'utiliser un compilateur disposant d'un "dos extender" permettant d'utiliser du 32 bits avec DOS. Je me demande si celui de Digital Mars n'est pas dans ce cas. DJGPP l'était si je me souviens bien (c'est la version de gcc pour DOS).

    Je dois avoir dans un carton un bouquin expliquant comment en faire un soi-même :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Google et Blink tournent le dos au W3C et à Pointer Events de Microsoft
    Par Arsene Newman dans le forum Balisage (X)HTML et validation W3C
    Réponses: 15
    Dernier message: 28/02/2015, 19h02
  2. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  3. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44
  4. Masquer le curseur en mode MS-DOS
    Par Alex120 dans le forum C
    Réponses: 2
    Dernier message: 10/07/2002, 09h30
  5. Format d'un exe pour DOS et pour Windows
    Par Alfhiger dans le forum Assembleur
    Réponses: 4
    Dernier message: 12/06/2002, 11h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo