Se connecter avec
S'enregistrer | Connectez-vous

Portabilité, erreur de segmentation,

Dernière réponse : dans Programmation
Partagez

Bonjour,

J'ai différentes questions que je me pose.

je voudrais savoir si ce code est portable et si ce n'est pas le cas, pourquoi ?
je me pose cette question car il me semble que la fonction est correcte lorsqu'on utilise le code ASCII mais ça ne l'est plus lorsqu'on utilise le code EBCDIC.
En ASCII, les lettres sont contigues et pas en EBCDIC

Merci

  1. int g(unsigned int n, char *res){
  2. if (n>9) return 1;
  3. *res='0'+n;
  4. return 0;
  5. }


---------------------------

Je voudrais aussi savoir pourquoi ce code, me produit une erreur de segmentation et comment corriger cela
  1. void bubbleSort(char **tab, int (*cmp)(void *, void *))
  2. {
  3. char **p1, **p2;
  4. for(p1=tab; *p1!=NULL; ++p1)
  5. for(p2=p1+1; *p2!=NULL; ++p2)
  6. if((*cmp)(*p1,*p2)>0)
  7. {
  8. char buf[BUFSIZ]; /*supposé tres grand*/
  9. strcpy(buf,*p1);
  10. strcpy(*p1,*p2);
  11. strcpy(*p2,buf);
  12. }
  13. }

Autres pages sur : portabilite erreur segmentation

totofetmax a dit :

je voudrais savoir si ce code est portable et si ce n'est pas le cas, pourquoi ?
je me pose cette question car il me semble que la fonction est correcte lorsqu'on utilise le code ASCII mais ça ne l'est plus lorsqu'on utilise le code EBCDIC.
En ASCII, les lettres sont contigues et pas en EBCDIC

Certes, mais le langage C exige que le charset utilisé ait des chiffres (digits) dont les valeurs soient consécutives. Ce code est donc portable.
---------------------------
Citation :

Je voudrais aussi savoir pourquoi ce code, me produit une erreur de segmentation et comment corriger cela
  1. void bubbleSort(char **tab, int (*cmp)(void *, void *))
  2. {
  3. char **p1, **p2;
  4. for(p1=tab; *p1!=NULL; ++p1)
  5. for(p2=p1+1; *p2!=NULL; ++p2)
  6. if((*cmp)(*p1,*p2)>0)
  7. {
  8. char buf[BUFSIZ]; /*supposé tres grand*/
  9. strcpy(buf,*p1);
  10. strcpy(*p1,*p2);
  11. strcpy(*p2,buf);
  12. }
  13. }

Ca ne se fait pas de swapper des tableaux. On préfère swapper des pointeurs, c'est plus efficace. BUFSIZ a beau être grand, aucun contrôle de débordement n'est fait...

Au fait, c'est bien un tableau de pointeurs que tu tries ? Il n'y a donc pas à recopier les données. Les pointeurs suffisent.

D'autre part, on a pas le code de comparaison. Une erreur dans se code peut se révéler fatale...

Voici le code complet

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5.  
  6. void bubbleSort(char **tab, int (*cmp)(void *, void *))
  7. {
  8. char **p1, **p2;
  9. for(p1=tab; *p1!=NULL; ++p1)
  10. for(p2=p1+1; *p2!=NULL; ++p2)
  11. if((*cmp)(*p1,*p2)>0)
  12. {
  13. char buf[BUFSIZ];
  14. strcpy(buf,*p1);
  15. strcpy(*p1,*p2);
  16. strcpy(*p2,buf);
  17. }
  18. }
  19.  
  20. void printTable(FILE *fdo, char **tab)
  21. {
  22. for(; *tab!=NULL; ++tab)
  23. fprintf(fdo,"%s\n", *tab);
  24. }
  25.  
  26. int main(int argc, char *argv[])
  27. {
  28. char **t;
  29. unsigned int i,l;
  30. if((t=(char**)malloc(sizeof(char*)*argc))==NULL)
  31. {
  32. fprintf(stderr,"Error in memory allocation\n");
  33. return EXIT_FAILURE;
  34. }
  35. l=(unsigned int)argc-1U;
  36. for(i=0U; i<l; ++i)
  37. {
  38. if((t[i]=(char*)malloc(strlen(argv[i+1])+1))==NULL)
  39. {
  40. fprintf(stderr,"Error in memory allocation\n");
  41. return EXIT_FAILURE;
  42. }
  43. strcpy(t[i],argv[i+1]);
  44. }
  45. t[l]=NULL;
  46. printTable(stdout,t);
  47. bubbleSort(t, (int (*)(void *, void *))&strcmp);
  48. printf("\n");
  49. printTable(stdout, t);
  50.  
  51. for(i=0; i<l; i++)
  52. free(t[i]);
  53. free(t);
  54. return EXIT_SUCCESS;
  55. }
Posez votre question