bonjour,

je suis en première année d'un Dut GEII (génie électrique et informatique industriel).

mon dernier projet était de crée un programme qui permet de trouver des nombres palindromiques (qui sont identiques dans leurs deux sens de lecture).
mon premier programme marche très bien. C'est au moment du passage en fonctions avec pointeur que ça se complique... j'utilise deux tableaux "malloc", donc deux pointeur de départ,mon problème est que je n'arrive pas à les prendre dans une fonction, les modifiers (voir les créer dans ce cas), et les renvoyer à la fonction "main".
- Est-ce possible de créer un pointeur qu'on transforme en tableau dans une fonction avant de renvoyer ce tableau dans la fonction principal ?
- Dans ce cas, me faut-il utiliser des pointeurs de pointeur ?

Pour conclure :/ je me suis complètement embrouillé sur les différents pointeurs de mes tableaux dynamiques. Le programme est écrit de la façon qui me semble être la mieux, mais ça marche pas...

Les erreurs de compilation me renvoient bien sur un problème de pointeur:

Dev-C\SuitesPalindromiquesfonction.cpp: In function `int main()':
Dev-C\SuitesPalindromiquesfonction.cpp:24: error: cannot convert `int*' to `int**' for argument `3' to `void allouer(int, int, int**)'
Dev-C\SuitesPalindromiquesfonction.cpp:25: error: cannot convert `int*' to `int**' for argument `3' to `void inverser(int, int*, int**)'
Dev-C\SuitesPalindromiquesfonction.cpp: In function `void allouer(int, int, int**)':
Dev-C\SuitesPalindromiquesfonction.cpp:53: error: cannot convert `int*' to `int**' in assignment
Dev-C\SuitesPalindromiquesfonction.cpp:59: error: invalid conversion from `int' to `int*'
Dev-C\SuitesPalindromiquesfonction.cpp: In function `void inverser(int, int*, int**)':
Dev-C\SuitesPalindromiquesfonction.cpp:68: error: cannot convert `int*' to `int**' in assignment
Dev-C\SuitesPalindromiquesfonction.cpp:70: error: invalid conversion from `int' to `int*'
sans plus attendre... voici mon programme avec en rouge les zones importantes:

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <stdlib.h>
void calcul(int cycle, int temps, int entier,int *n_chiffre);
// allouer crée le tableau dynamique "tab_chiffre".
void allouer(int n_chiffre, int entier, int **tab_chiffre);
// inverser prend le tableaux dynamique "tab_chiffre", et crée le tableau dynamique "tab_chiffre_inv".
void inverser(int n_chiffre, int *tab_chiffre, int **tab_chiffre_inv);
//verification reprend les tableaux sans les modifier.
int verification(int cycle, int temps, int entier, int invariable, int n_chiffre, int *tab_chiffre, int *tab_chiffre_inv);
// addition ---> verification.
void addition(int *entier, int *n_chiffre, int *tab_chiffre, int *tab_chiffre_inv);
 
int main(){
    int n_chiffre, entier, invariable;
    int temps, cycle;
   // je définis donc les pointeurs de "main".
   int *tab_chiffre, *tab_chiffre_inv;
 
    //calculer nb_chiffre
    printf("entrez un entier :");
    scanf("%d",&entier);
    printf("definissez le nombre de cycle maximum :");
    scanf("%d",&cycle);
    invariable=entier; 
 
    for (temps=cycle;temps>=0;temps--){
        calcul(cycle, temps, entier, &n_chiffre);
        //fonction donné à "main" passage par adresse ?.
       allouer(n_chiffre, entier,  &*tab_chiffre);
        inverser(n_chiffre, tab_chiffre, &*tab_chiffre_inv);
        verification(cycle, temps, entier, n_chiffre, invariable, tab_chiffre, tab_chiffre_inv);
        // ici je suis perplexe ^^... debut de tableau donc pas de * n'y [] ?
        addition(&entier, &n_chiffre, tab_chiffre, tab_chiffre_inv);
        }
 
 
    printf("\nle programme n'a pas trouve de palindrome au bout de %d etape\n",cycle); 
 
  system("PAUSE");	
  return 0;
}
 
    void calcul(int cycle, int temps, int entier, int *n_chiffre){
         int i=0,n_temp;
 
         printf ("entier = %d, rang = %d\n",entier,(cycle-temps));
         n_temp=entier;
         do{
         i++;
         n_temp/=10;
         }while(n_temp!=0);
         *n_chiffre=i;
    }
 
    //allouer tab_chiffre
    // l'indication des variables d'entrée de fonction.
    void allouer(int n_chiffre, int entier, int **tab_chiffre){
         int n_temp, n_temp2, i;
         // création du tableau avec malloc. je précise au logiciel que tab_chiffre est un pointeur ?
         tab_chiffre=(int*)malloc(n_chiffre*sizeof(int));
         n_temp=entier;
         n_temp2=entier;
         for (i=n_chiffre-1;i>=0;i--){
             n_temp/=10;
             n_temp2%=10;        
             tab_chiffre[i]=n_temp2;
             n_temp2=n_temp;
             }
    }
 
    //inverser tab_chiffre
    // l'indication des variables d'entrée de fonction.
    void inverser(int n_chiffre, int *tab_chiffre, int **tab_chiffre_inv){
         int i, j;
         // même problème que pour la précèdente fonction.
         tab_chiffre_inv=(int*)malloc(n_chiffre*sizeof(int));
         for(i=0,j=n_chiffre-1;i<n_chiffre;i++,j--){
            tab_chiffre_inv[j]=tab_chiffre[i];
         }
    }
 
    //verification de la propriete du nombre palindromique
    // l'indication des variables d'entrée de fonction.
    int verification(int cycle, int temps, int entier,int invariable, int n_chiffre, int *tab_chiffre, int *tab_chiffre_inv){
         int i, test;
 
         for (i=0,test=0;i<n_chiffre;i++){
             if(tab_chiffre[i]==tab_chiffre_inv[i]){
             test++;
             }
         }
         if (test==n_chiffre){
            printf("votre nombre (%d) est bien un palyndrome. au rang %d il devient (%d)\n",invariable,(cycle-temps),entier);
 
            system("PAUSE");	
            return 0;
         }
    }
 
    // addition des tableaux
    // l'indication des variables d'entrée de fonction.
    void addition(int *entier, int *n_chiffre, int *tab_chiffre, int *tab_chiffre_inv){
         int i, puissance;
 
         entier=0;
         for (i=0,puissance=1;i<*n_chiffre;i++){
             entier+=((tab_chiffre[i]+tab_chiffre_inv[i])*puissance);
             puissance*=10;
             }
         free(tab_chiffre);
         free(tab_chiffre_inv);
         n_chiffre=0;
    }
voilà, j'ai essayé de rendre les écrits plus lisible, est-ce que ça l'est ?, Au cas ou j'ai à poster de nouveau sur ce forum. J'aimerais savoir aussi, couleur non comprise, si vous avez des reproches à faire à ma façon d'écrire en C, que je ne parte pas avec de mauvaise base.

merci d'avance.