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 :

passer un tableau en argument dans une fonction


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut passer un tableau en argument dans une fonction
    salut j'ai visiblement un probleme avec une fonction

    je veux passer un tableau dans la fonction pour lister tous les elements, comparer les strlen et en extraire la taille de la cellule la plus grande

    exemple de declaration de tableau

    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
    char label[][255] = {
    "accueil",
    "direction",
    "medical/psy",
    "cuisine",
    "standard",
    "vide",
    "portable/wired",
    "portable/wifi",
    "accueil",
    "direction",
    "medical/psy",
    "cuisine",
    "standard",
    "vide",
    "portable/wired",
    "portable/wifi",
    "accueil",
    "direction",
    "medical/psy",
    "cuisine",
    "standard",
    "vide",
    "portable/wired",
    "portable/wifi",
    "file server",
    "file server",
    "file server",
    "live box",
    "cups file server"
    };
    l'ebauche de la fonction

    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
    /*****************************************************************************************************
    *                                               max cell size
    *
    * takes an array and return the size of the max strlen cell
    ******************************************************************************************************/
    int max_cell_size(char ** array1, int sum){
    //
    int i;
     
    printf("%d\n", sum);
     
    for(i = 0; i < sum; i++)
    	{
    	printf("%s - \n", array1[i]);
    	}
    return 0;	
    }
    le passage du tableau dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max_cell_size((char **)label, sum_tunnels);
    la j'ai carrément un memleak

    si quelqu'un pouvait m'aider, ce serait cool

    rogerio

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Tu entends quoi par "j'ai carrément un memleak" ? Tu ne peux pas avoir de fuite mémoire puisque tu n'alloue rien, en tout cas dans ce que tu nous a montré.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut
    y a un probleme avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s - \n", array1[i]);
    le memleak est ici

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ton problème c'est que label est un char[][255], par un char **. Ca n'a rien à voir. En particulier label[1] se trouve 255 octets après label[0], alors que array1[1] se trouve sizeof (char *) après array1[0]. Ton cast dans l'appel de fonction ne sert qu'à masquer l'erreur.

    Il faut déclarer max_cell_size comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int max_cell_size(char array1[][255], int sum)
    Ou à la limite comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int max_cell_size(char (*array1)[255], int sum)
    Edit : est ça n'a rien à voir avec un "memory leak"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut
    je te remercie, ça fonctionne

    le probleme c'est que les tableaux à passer dans la fonction n'ont pas tous des cellules de 255 mais je vais les redimentionner à la declaration

    merci

    rogerio

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rogerio Voir le message
    je te remercie, ça fonctionne

    le probleme c'est que les tableaux à passer dans la fonction n'ont pas tous des cellules de 255 mais je vais les redimentionner à la declaration

    merci

    rogerio
    Si les chaines sont fixes (ou allouées dynamiquement), tu peux utiliser un tableau de pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char const *label[] = {
    "accueil",
    "direction",
    "medical/psy",
    <...>
    };
    dans ce cas, cet interface est correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int max_cell_size(char const * array1[], int sum)
    {
       <...>
    Vérification :
    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
     
    int max_cell_size (char const *array1[], int sum)
    {
       return 0;
    }
     
    int main (void)
    {
       char const *label[] = {
          "accueil",
          "direction",
          "medical/psy",
       };
     
       max_cell_size (label, 0);
     
       return 0;
    }

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 50
    Points
    50
    Par défaut
    je te remercie des precisions

    mais cette declaration const char me permet-elle de modifier le contenu d'une cellule

    je crois que je me suis tellement enervé sur cette fonction que j'ai mal conçue cette partie de mon programme

    mon programme lance plink avec une serie de redirection de ports
    ensuite il log un netstat et parse le log pour verifier que les redirections sont effectuées

    cette derniere fonction fait partie d'une macro qui va afficher le resultat du parsing

    je prend la taille du plus grand element tu tableau
    ensuite à l'affichage je verifie la taille de l'element à afficher avec le resultat precedent et rempli la cellule avec des espaces

    donc j'arrive à un retour console pseudo tabulé

    je suis arrivé à mes fins grace au forum mais je pense que ça fait beaucoup de code pour pas grand chose

    les deux fonctions :

    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
    /*****************************************************************************************************
    *                                               cell resize
    *
    * resize a cell filling it with spaces 
    ******************************************************************************************************/
    char * cell_resize(char * string, int max_size){
    //
    int str_len = strlen(string);
    //
    while(str_len < max_size)
    	{
    	strcat(string, "_");
    		str_len ++;
    	}
    return string;
    }
    /*****************************************************************************************************
    *                                               max cell size
    *
    * takes an array and return the size of the max strlen cell
    ******************************************************************************************************/
    int max_cell_size(char array1[][255], int sum){
    //
    int i, str_len, buffer = 0;
    //
    for(i = 0; i < sum; i++)
    	{
    	str_len = strlen(array1[i]);
     
    	if(str_len > buffer)
    		{
    		buffer = str_len;
    		}
    	}
    return buffer;	
    }
    l'output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		if(strstr(array_net_log[j], match1[i]) != NULL && strstr(array_net_log[j], match2[i]) != NULL && strstr(array_net_log[j], "LISTENING") != NULL)
    			{
    			printf("%s %s %s %s:%s vers %s:%s\n", 
    			cell_resize(ssh_status[0], max_ssh_status),
    			cell_resize(connection_type[i], max_connection_type),
    			cell_resize(label[i], max_label),
    			cell_resize(ssh_host_listen[i], max_ssh_host_listen),
    			cell_resize(ssh_port_listen[i], max_ssh_port_listen),
    			cell_resize(ssh_host_redirect[i], max_ssh_host_redirect),
    			cell_resize(ssh_port_redirect[i], max_ssh_port_redirect));
    			res ++;
    			break;
    			}

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

Discussions similaires

  1. Comment passer un tableau à deux dimensions dans une fonction
    Par Niko_de_bordo dans le forum Débuter
    Réponses: 2
    Dernier message: 02/07/2009, 15h15
  2. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  3. Réponses: 1
    Dernier message: 03/05/2007, 07h49
  4. Réponses: 1
    Dernier message: 02/05/2007, 15h08
  5. Passer un tableau en parametre dans une fonction js
    Par hellmaster78 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2005, 14h35

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