Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[Résolu] pointeurs, initialisation de fonction et Cie


Messages recommandés

Posté(e)

Re-bonsoir,

 

j'ai quelques soucis à la compilation de mon code:

int boucle(double *vector1, double *vector2, double *resultats, int *nbref, int *l) 
//la fonction boucle est appelée via R qui lui transmettra les arguments; Cf post "du C dans R"
{
//Déclaration des variables
int i,j,count;

//début de la boucle
for (i=0;i<*l;i++)
 {
 int count = count1(*vector1,i);

 if (count <= *nbref)
{
int *next = indicenext(*vector1,*l, i);
...
}

 else if (count >= *nbref)
{
int *prev = indiceprev(*vector1,i);
....
}

  else
  {
int *next = indicenext(*vector1,*l,i);
int *prev = indiceprev(*vector1,i);
...
}
 ...

 }
return (0);
}

 

cette fonction boucle appelle 3 sous-fonctions : count1 , indicenext, indiceprev

 

int count1 (double *vector1, int j) // j représente la longueur à tester de vector1; j <= *l

{
 int i;
 int nb1;
 for (i=0;i<j;i++)
{
  if (vector1[i] == 1)
  {
	nb1++;
  }
}
 return nb1;
}

 

int *indicenext (double *v1, int *l, int j)

{
 int i;
 int *p_indicenext; /* pointeur vers le tableau de résultats*/
 int k = 0;

 p_indicenext = malloc((*l-j)* sizeof(int));

 for (i=j;i<*l;i++)
 {
if (*(v1+i) == 1)
{
 *(p_indicenext+k)= i;
 k++;
}
 }
 return ( *p_indicenext);
}

 

int *indiceprev(double *v1, int j)

{
 int i;
 int *p_indiceprev; /* pointeur vers le tableau de résultats*/
 int k = 0;

 p_indiceprev = malloc(j * sizeof(int));

 for (i=0;i<j;i++)
 {
if (*(v1+i) == 1)
{
 *(p_indiceprev+k)= i;
 k++;
}
 }
 return ( (int) *p_indiceprev);
}

 

Il n'y a aucun problème pour la fonction count1

 

Par contre, lors de la compilation, j'obtiens ces warning qui correspondent aux lignes d'appel des sous-fonctions indicenext et indiceprev dans boucle

fonctionR.c: In function 'boucle':

fonctionR.c:68: warning: initialization makes pointer from integer without a cast

fonctionR.c:86: warning: initialization makes pointer from integer without a cast

fonctionR.c:103: warning: initialization makes pointer from integer without a cast

fonctionR.c:104: warning: initialization makes pointer from integer without a cast

 

ainsi que

fonctionR.c: At top level:

fonctionR.c:163: error: conflicting types for 'indicenext'

fonctionR.c:68: error: previous implicit declaration of 'indicenext' was here

fonctionR.c: In function 'indicenext':

fonctionR.c:180: warning: return makes pointer from integer without a cast

 

la ligne 163 est l'accolade ouvrante de indicenext et la ligne 180 le return.

J'obtiens les mêmes erreurs pour l'autre fonction, indiceprev, malgré le (int) dans la fonction return.

 

J'ai bien essayé de comprendre mais je tourne en rond

quels sont les conflicting types?

j'ai bien essayé de "caster" l'integer lors de l'appel de la fonction

int *next = indicenext(*vector1,*l, (int) i);

mais sans succès :-/

 

moi pas comprendre... ne s'improvise pas programmeur qui veut :P

Posté(e)
int boucle(double *vector1, double *vector2, double *resultats, int *nbref, int *l)

vector1 est un double *, ok ?

int count = count1(*vector1,i);

Tu appelles count1 avec la valeur de vector1, donc tu passes un double en paramètre à count1(), ok ?

int count1 (double *vector1, int j)
... et count1 attend un double * en paramètre !

 

int *indiceprev(double *v1, int j)

{
 (bla bla)
 return ( (int) *p_indiceprev);
}

Tu castes en int avant de retourner *pindiceprev, alors que tu es censé retourner un int * ?

Fais un bête return de p_indiceprev, c'est déjà un int * !

 

idem pour indicenext()

Posté(e)

Autre remarque, rien à voir avec les warnings ou le reste :

int count1 (double *vector1, int j)
{
 int i;
 int nb1;
 for (i=0;i<j;i++)
{
  if (vector1[i] == 1)
  {
	nb1++;
  }
}
 return nb1;
}

Principe de précaution : initialise explicitement nb1 à zéro, c'est toujours mieux de ne pas laisser la machine décider à ta place.

Et évite les appellations "i" ou "j". Quand c'est la taille du truc, tu appelles ca "indiceMax" ou "tailleVecteur" ou ce que tu veux... Tu as la chance d'avoir des fonctions courtes, mais le jour où ça deviandra compliqué tu vas galérer.

Posté(e)

c'est ça que j'arrive pas à comprendre :-/

 

je n'ai aucune erreur sur count1() et si j'enlève * dans le modèle de fonction count1(), j'obtiens des erreurs à la compilation.

 

j'ai essayé un bête return de p_indicenext (Cf le return de la fonction indicenext) et j'obtiens la même erreur :-/

Posté(e)
si j'enlève * dans le modèle de fonction count1(), j'obtiens des erreurs à la compilation.
C'est à dire ? Si tu passes juste le premier double par valeur ? C'est normal que ça plante !

Fais très attention : tu as un tableau en double *vecteur1

vecteur1 est, grosso-modo, un int représentant l'adresse mémoire du premier double de ton tableau (i.e. "un pointeur"). *vecteur1 est la valeur présente à l'adresse (donc la première valeur double de ton tableau, celle qui est stockée à l'adresse pointée par vecteur1). Si tu passes *vecteur1 en paramètre, c'est comme si tu extrayais cette valeur du tableau et que tu la fournissais à ta fonction : double x = *vecteur1; tafonction(x);. Imagine ce qui se passe si on tente de dire à tafonction "x[ i ]" !

double x = *vecteur1; étant ici équivalent à double x = vecteur1[0];

 

j'ai essayé un bête return de p_indicenext (Cf le return de la fonction indicenext) et j'obtiens la même erreur :-/
Nuance : la fonction indicenext retourne *p_indicenext (qui est un int). Il est donc normal que cela plante.

Fais un return de p_indicenext et pas *p_indicenext !

Posté(e)

OK pour les return() ça marche

 

je reprends la première partie de ton dernier post demain, là j'ai du mal à suivre :P

 

merci.

 

//donc si je veux passer le pointeur et non la valeur pointée, il faut que j'appelle la fonction avec vecteur1 et non *vecteur1

Posté(e)

:-(

 

Bon, j'ai tout repris de zero.

J'ai correctement renseigné mes prototypes de fonction, j'ai bien fait attention à ce que je passais en argument aux fonctions et .... ça marche :P.

 

enfin, ça compile sans error ni warning mais il faut que je vérifie les valeurs retournées par mon programme qui parfois me semblent un peu étranges :P ; donc debugging avec printf("la valeur truc vaut : %2.1f\n", truc); placé le long du code.

 

une question tout de même:

mon programme doit faire appel à la fonction mediane que j'ai trouvé dans la bibliothèque statique statlib:

http://www.planet-source-code.com/vb/scrip...24&lngWId=3

 

Sous windows, je décompresse le zip qui contient statlib.c et statlib.h dans mon répertoire de compilation; j'appelle stalib.c avec un

#include "statlib.c"

et la fonction median selon le prototype de fonction décrit ( double median(double *, int) )

 

et ça fonctionne niquel. (compilation avec les minGW tools)

 

Sous linux, je fais pareil sauf que j'ai des erreurs de référencement (linker) pour toutes les fonctions présentes dans statlib.c

/tmp/ccPnSC6o.o: dans la fonction « g_mean »:
fonctionR_v2.c:(.text+0x23d): référence indéfinie vers « log »
fonctionR_v2.c:(.text+0x262): référence indéfinie vers « exp »
/tmp/ccPnSC6o.o: dans la fonction « agm »:
fonctionR_v2.c:(.text+0x4fb): référence indéfinie vers « sqrt »
/tmp/ccPnSC6o.o: dans la fonction « s_stdev »:
fonctionR_v2.c:(.text+0x831): référence indéfinie vers « sqrt »
/tmp/ccPnSC6o.o: dans la fonction « p_stdev »:
fonctionR_v2.c:(.text+0x853): référence indéfinie vers « sqrt »
etc....
collect2: ld returned 1 exit status

 

au pifomètre, j'ai collé mon répertoire de compilation dans /etc/ld.so.conf et exécuté ldconfig mais pareil :-P

Si vous avez une idée? (je vais tâcher de contacter le gars qui a fait la librairie)

Posté(e)
#include "statlib.c"
AAARRRGGGHHHHH

Les include c'est pour les .h

On inclut le .h, on compile le .c et on linke tous les .o. Le linker retrouve ses petits.

Inclure un .c c'est crade, et ça marche pas à tous les coups.

Bref.

 

fonctionR_v2.c:(.text+0x23d): référence indéfinie vers « log »

Tu as oublié d'ajouter "-lm" pour linker avec la librairie mathématique (fonctions exp, log et sqrt). Vérifie (sait-on jamais) que tu as bien /lib/lim*.so

 

Si tu veux être absolument certain que ton programme est sémantiquement correct tu peux le compiler en "-02 -Wall -ansi -pedantic"

Posté(e)

merci, j'ai appelé le .h et compilé comme suit

gcc -lm fonctionR_v2.c statlib.c -o fonctionR_v2

 

0 warning, 0 erreur, l'exécutable fonctionne. :P

 

par contre si je lui colle du "-02 -Wall -ansi -pedantic", j'ai des erreurs de syntaxe sur mes commentaires de ligne (// à remplacer par /* ... */ j'imagine), que la norme ISO C90 interdit les tableaux de taille dynamique, etc etc ...

 

c'est grave qu'il ne soit pas sémantiquement correct mon bout de code :'-( ?

Posté(e)

Non, ce n'est pas grave. C'est comme pour l'inclusion du fichier .c : tu t'arranges avec ta conscience ;-)

Une fois transformé en binaire, de toute façon, personne ne viendra te faire de commentaire sur le source....

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...