Appeler procedure passage par variable [Résolu]

Signaler
Messages postés
13
Date d'inscription
jeudi 9 mars 2006
Statut
Membre
Dernière intervention
31 décembre 2007
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
salut,
j'ai reussit a crée une procedure qui initialise une matrice carrée avec un pointeur  **p
void ini_matrice(int **p,int n)
{
    int i,j;
    p=(int **)malloc(n*sizeof(int*));
    for(i=0;i<n;i++)
    {
        *(p+i)=(int *)malloc(n*sizeof(int));
        for(j=0;j<n;j++)
            *(*(p+i)+j)=0;
    }
}
le probléme c'est que je ne sais pas comment l'appelé dans mon programme principale (passage par variable) je sais comment avec un tableau il suffit de faire:
void main()
{
        int tab,dim;
        tableau(&tableau,dim);
}
alors trouver moi une solution pour la matrice
merci d'avance;

11 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Quel idée de faire du C aussi. Le couple constructeur/destructeur évite justement tous ces problèmes de mémoires.

Soit:
void ini_matrice(int ***p,int n)
{

    int i,j;

    *p=(int **)malloc(n*sizeof(int*));

    for(i=0;i<n;i++)

    {

        *(*p+i)=(int *)malloc(n*sizeof(int));

        for(j=0;j<n;j++)

            *(*(*p+i)+j)=0;

    }

}

Soit:
int ** ini_matrice(int n)
{
    int ** p = NULL;

    int i,j;

    p=(int **)malloc(n*sizeof(int*));

    for(i=0;i<n;i++)

    {

        *(p+i)=(int *)malloc(n*sizeof(int));

        for(j=0;j<n;j++)

            *(*(p+i)+j)=0;

    }

    return p;
}

int main(...)
{
    int ** ma_matrice = init_matrice(4); // avec la solution 2

    int ** autre_matrice = NULL;
    init_matrice(&autre_matrice, 4);
}
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Si c'est ta fonction qui alloue la mémoire, il faudra renvoyer un pointeur de pointeur et faire la fonction qui désalloura tout ça.
J'ai déjà fait un allocateur pour pointeur de pointeurs bien plus simple d'utilisation et beaucoup plus performant:

http://www.codyx.org/snippet_allocateur-pointeur-pointeurs_293.aspx
Un simple free suffira pour tout désallouer d'un coup.

Tu peux évidement le modifier pour tes propres besoins.

C++ (@++)<!--
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
SAKingdom> Dans ta snippets tu renvoies un pointeur de pointeur initialisé dans la fonction.... Tention les dégats ... Passe plutot par un paramètre.

Shell
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
[auteur/DEATHCRASH/3585.aspx DeAtHCrAsH] >> C'est le but aussi. Il n'y aura aucun dégat à procéder ainsi.

"Quel idée de faire du C aussi."
Tu parles d'une remarque. C'est comme si je te disais: qu'elle idée de faire du C++, fait plutôt du C#, t'as même plus besoin de savoir ce qu'est la mémoire.

Attention luthor dans ton code. En C, il n'y a pas de surcharge de fonction.

C++ (@++)<!--
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
SAKingdom> Ca ne te dérange pas de renvoyer un pointeur déclaré et initialisé dans ta fonction ? Perso si je fais du C/C++  c'est pour faire du propre et pas de la dentelle.

Shell
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
SAKingdom => "Tu parles d'une remarque. C'est comme si je te disais: qu'elle idée de
faire du C++, fait plutôt du C#, t'as même plus besoin de savoir ce
qu'est la mémoire."
=> Le C# n'a rien a voir avec le C++. Alors que le C++ est dans la continuité du C, on trouve exactement les memes mécanismes, sauf qu'on a de l'objet.

SAKingdom => "Attention luthor dans ton code. En C, il n'y a pas de surcharge de fonction."
=> Il ne s'agit pas de faire deux fonctions. Les deux fonctions font la meme chose, c'est juste deux exemples de définition.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
[auteur/DEATHCRASH/3585.aspx DeAtHCrAsH]
>> Je crois que tu ne comprends pas encore très bien les pointeurs. Quand on retourne un pointeur, on retourne l'adresse contenue dans le pointeur et non l'adresse du pointeur. C'est comme faire:

int test (void)
{
    int i = 5;
    return i;
}

On retourne 5. Et non pas l'adresse de i

char * test (char *i)
{
    char *j = i;
    return j;
}

On retourne l'adresse contenue dans j et non pas l'adresse de j

luthor >> Ok pour l'exemple.
Oui je sais que C# et C++ ne sont pas la même chose.
Ce que je voulais faire voir par ma remarque c'est la manière dont tu conseille d'utiliser une autre forme de programmation (objet) plutôt que d'utiliser les méthodes de la forme courante (non objet) ce qui, à mon avis, n'a pas de sens.
Dans le contexte, c'est comme dire que C# est mieux parce que l'on a pas à se préoccuper de la mémoire.

C++ (@++)<!--
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
[auteur/SAKINGDOM/617077.aspx SAKingdom]:
Je critique pas les méthodes non objets :) mais j'arrive pas à comprendre pourquoi dans le cas de matrices, on ne l'utilise pas. C'est tellement pratique et bien adapté a mon gout.
matrixi ma_matrice(4, 4, 0); // C'est quand même plus beau ^^

Pour l'histoire des pointeurs, on peut retourner un entier plutot qu'une addresse:

unsigned int allouer_memoire(unsigned int _size)
{
    char * memoire = (char*)malloc(_size);
   return *(unsigned int*)memoire;
}

int main(...)
{
   unsigned int adresse_memoire = allouer_memoire(10);
}

Ca a aucun intérêt, mais ca reste correct.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ah ok. Oui c'est plus simple mais bon. Si il veut le faire en C, on peut oublier ça.

Pour ta fonction, oui ça reste correct mais ça va faire un vrai bordel dans le code en plus d'enlever tout l'intéret des pointeurs.
En passent, je ne comprend pas pourquoi tu as posté ça :)

C++ (@++)<!--
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oui c'est vrai, en soit ca n'a pas d'intéret: mais ca illustre bien ce qu'est un pointeur. C'est simplement un entier. Le type pointeur existe juste pour le coté pratique.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Mouais un entier..... plus ou moins.
Disons que ça a la plus grande taille adressable possible
(4 octet -> 32bits, 8 octet ->64bits)

C++ (@++)<!--