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 :

Buffer ou Pointeur?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut Buffer ou Pointeur?
    Bonjour,

    Je débute dans le langage C et je dois modifier un code. J'essaie de comprendre mais là je sais plus où j'en suis à quoi correspond cette déclaration ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t_buffer *ligne;
     
    {
    	ligne->lg = 0;
     
     
    	for (;;)
    ...
    Je déclare un pointeur ou un buffer? S'il s'agit d'un buffer, connaissez vous un tutoriel où un sujet qui explique bien comment les utiliser?

    Après recherche je trouve cette définition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct {
    	int fd;
    	t_buffer *buf;
    	int nbbuf;
    	z_stream *zstr;
    	int alreadycompressed;
    } connexion[4];
    Je pense qu'il s'agit donc d'une déclaration de structure, donc en gros je déclare un pointeur ligne qui est du type de ma structure c'est ça?

    Dernière question je cherche à récupérer une variable ligne->buf, et à la mettre dans un buffer, comment utiliser un buffer?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Cherche la définition du type t_buffer, pour commencer.

    Le morceau de code que tu as posté est en fait la déclaration d'un tableau de 4 structures anonymes; le tableau lui-même étant nommé "connexion".
    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.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Cherche la définition du type t_buffer, pour commencer.

    Le morceau de code que tu as posté est en fait la déclaration d'un tableau de 4 structures anonymes; le tableau lui-même étant nommé "connexion".
    Voici la définition du type t_buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct { char *buf; int lg; } t_buffer;

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    C'est donc une structure contenant apparemment un buffer et un entier indiquant la longueur.
    Le genre de chose que j'éviterais d'allouer sur le tas, en fait: On se retrouve avec deux niveaux de pointeurs pour pas grand-chose.
    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.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Par défaut
    Et ben oui mais c'est pas mon code je dois le modifier ...

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    int litligne(c,ligne)
    int c;
    t_buffer *ligne;
     
    {
    	ligne->lg = 0;
     
     
    	for (;;)
    	{
    		int i;
     
    		while (connexion[c].nbbuf)
    		{
    			/* Recherche l'eventuel saut de ligne */
    			for (i = 0; i < ((t_buffer*)connexion[c].buf)->lg; i++)
    			{
    				if (((t_buffer*)connexion[c].buf)->buf[i] == 0x0A)
    				{
    					i++;
    					break;
    				}
    			}
    			/* Copier un bloc complet ou partiel ? */
    			if (i == ((t_buffer*)connexion[c].buf)->lg)
    			{
    				Add(&ligne->buf,&ligne->lg,((t_buffer*)connexion[c].buf)->buf,i);
    				free(((t_buffer*)connexion[c].buf)->buf);
    				Remove(&connexion[c].buf,&connexion[c].nbbuf,sizeof(t_buffer));
    				TRACE0("Copie Bloc complet \n");
    			}
    			else
    			{
    			TRACE0("Copie Bloc partiel \n");
     
    				Add(&ligne->buf,&ligne->lg,((t_buffer*)connexion[c].buf)->buf,i);
    				Remove(&((t_buffer*)connexion[c].buf)->buf,&((t_buffer*)connexion[c].buf)->lg,i);
    			}
     
    			/* Sort si ligne trouvee */
    			if (ligne && ligne->buf[ligne->lg-1] == 0x0A)
    			{
    				char tmp = 0;
     
    				tmp = 0;
     
    				Add(&ligne->buf,&ligne->lg,&tmp,1);
    				ligne->lg--; /* On ne comptabilise pas le 0 terminateur */
     
    				if ( strstr (ligne->buf,"Argument --") != NULL )
    				{
     
    					ligne->buf[ligne->lg-2] = ' '; 
    					ligne->buf[ligne->lg-3] = ' ';
    					ligne->lg = 0;  
    					TRACE2("litligne test -- (%d) => %s.... \n",c,ligne->buf);
    					return 1;
     
    				}
    				else
    				{
    					TRACE2("litligne(%d) => %s.... \n",c,ligne->buf);/**/
     
                                            return 1;
                                    }
                            }
                    }
     
                    /* Attend la suite */
    		if (!sendrcv())
    		{
    			ligne->lg = 0;
    			return 0;
    		}
    	}
    }
    Selon moi il faut que je le fasse dans cette fonction ...
    Je veux récupérer dans un buffer (mais je ne sais pas trop comment ça fonctionne, si tu as un cours ou un tutoriel sur les buffers je suis preneuse ...) un arguement qui je pense est contenu dans ligne->buf et je veux le compléter au fur et à mesure de la boucle puis ensuite l'afficher.

    J'ai fait quelque chose dans ce style là mais sans grand succès je suis entrain de me replonger dans un tutoriel sur les pointeurs :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    int litligne(c,ligne)
    int c;
    t_buffer *ligne;
    t_buffer monbuf;   //ou t_buffer monbuf = NULL; ou t_buffer monbuf = NULL_BUFFER;
    {
    	ligne->lg = 0;
     
     
    	for (;;)
    	{
    		int i;
     
    		while (connexion[c].nbbuf)
    		{
    			/* Recherche l'eventuel saut de ligne */
    			for (i = 0; i < ((t_buffer*)connexion[c].buf)->lg; i++)
    			{
    				if (((t_buffer*)connexion[c].buf)->buf[i] == 0x0A)
    				{
    					i++;
    					break;
    				}
    			}
    			/* Copier un bloc complet ou partiel ? */
    			if (i == ((t_buffer*)connexion[c].buf)->lg)
    			{
    				Add(&ligne->buf,&ligne->lg,((t_buffer*)connexion[c].buf)->buf,i);
    				free(((t_buffer*)connexion[c].buf)->buf);
    				Remove(&connexion[c].buf,&connexion[c].nbbuf,sizeof(t_buffer));
    				TRACE0("Copie Bloc complet \n");
    			}
    			else
    			{
    			TRACE0("Copie Bloc partiel \n");
            monbuf.buf = Strcat(monbuf.buf,ligne->buf);
    				Add(&ligne->buf,&ligne->lg,((t_buffer*)connexion[c].buf)->buf,i);
    				Remove(&((t_buffer*)connexion[c].buf)->buf,&((t_buffer*)connexion[c].buf)->lg,i);
    			}
     
    			/* Sort si ligne trouvee */
    			if (ligne && ligne->buf[ligne->lg-1] == 0x0A)
    			{
    				char tmp = 0;
     
    				tmp = 0;
     
    				Add(&ligne->buf,&ligne->lg,&tmp,1);
    				ligne->lg--; /* On ne comptabilise pas le 0 terminateur */
     
    				if ( strstr (ligne->buf,"Argument --") != NULL )
    				{
     
    					ligne->buf[ligne->lg-2] = ' '; 
    					ligne->buf[ligne->lg-3] = ' ';
    					ligne->lg = 0;  
    					TRACE2("litligne test -- (%d) => %s.... \n",c,ligne->buf);
    					return 1;
     
    				}
    				else
    				{
    					TRACE2("litligne(%d) => %s.... \n",c,ligne->buf);/**/
                                            TRACE1("MON BUF %c", monbuf.buf);
                                            return 1;
                                    }
                            }
                    }
     
                    /* Attend la suite */
    		if (!sendrcv())
    		{
    			ligne->lg = 0;
    			return 0;
    		}
    	}
    }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Ooh, du C K&R, ça faisait un bail que je n'en avais pas vu.

    Déjà, je pense que tu peux virer les casts en (t_buffer*) : Ils sont inutiles et on y verra plus clair.

    Ensuite, je serais curieux de voir les fonctions Add() et Remove(), qui m'ont l'air de ne pas bosser sur la même chose: Les renommer pourrait être un pas vers la maintenabilité.

    Enfin, j'aimerais que tu me dises en quoi consiste la modification demandée:
    • Le comportement actuel de la fonction
    • Le comportement différent attendu.


    PS: Aussi, le code manque un peu de commentaires, de mises à NULL de pointeurs et d'assertions.
    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.

Discussions similaires

  1. Buffer de caracteres et pointeur.
    Par BaygonV dans le forum Débuter
    Réponses: 16
    Dernier message: 03/02/2014, 15h46
  2. Aide pointeur buffer et SDL
    Par toumaikimi dans le forum SDL
    Réponses: 3
    Dernier message: 15/07/2010, 21h37
  3. Buffer et pointeurs
    Par bentley71de dans le forum C
    Réponses: 3
    Dernier message: 09/08/2008, 12h42
  4. Incrémenter un pointeur sur un buffer de uchar
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 12/12/2005, 08h38
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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