2016-11-05 3 views
0

J'ai des problèmes avec un projet d'université qui consiste à simuler une coque. L'utilisateur tape une commande et le programme divise la ligne en jetons et vérifie si l'un d'entre eux est une commande interne, telle que cd, export, jobs et source. Ensuite, imprime les jetons et une explication de base de la commande qui a été trouvée dans cette ligne. Quand je l'exécute sur CodeBlocks tout fonctionne bien, mais quand je le compile sur NetBeans sous Linux, il rapporte plusieurs avertissements, que j'explique dans le code et quand je l'exécute ce message apparaît: Segmentation Fault (core dumped). J'ai fait des recherches à ce sujet et j'ai constaté que cela a à voir avec les permissions de la mémoire (accéder à une partie de la mémoire à laquelle vous n'êtes pas autorisé à accéder). Je ne peux pas trouver un moyen de le résoudre, mais j'espère que quelqu'un ici pourra m'aider. Merci!Problème avec les pointeurs En C. Défaut de segmentation

#include <stdio.h> 
#include <stdlib.h> 
#define PROMPT "$" 

int parse_args(char **args, char *line){ 
    char *token; 
    int n=0; 
    token=strtok(line," "); // warning: assignment makes pointer from integer without a cast 
    while(token!=NULL){ 
     printf("token%i: %s\n",n,token); 
     *args=token; 
     n++; 
     *args++; 
     token=strtok(NULL," ");// warning: assignment makes pointer from integer without a cast 
    } 
    printf("token%i: %s\n",n,token); 
    *args=token; 
    return n; 
} 

char *read_line(char *line){ //expecting argument char* but argument is of type char** 
    printf("%s ",PROMPT); 
     *line = malloc(sizeof(500));//warning: assignment makes pointer from integer without a cast 
    fgets(line,500,stdin); 
    return line; 
} 


int execute_line(char *line){//expecting argument char* but argument is of type char** 
    char**args; 
    parse_args(args,line); 
    check_internal(args); 
    return 0; 
} 

int check_internal(char **args){ 
    if(strcmp(*args, "cd")==0){ 
internal_cd(); 
    } else{ 
     if(strcmp(*args, "export")==0){ 
      internal_export(); 
     }else{ 
      if(strcmp(*args, "source")==0){ 
       internal_source(); 
      }else{ 
       if(strcmp(*args, "jobs")==0){ 
        internal_jobs(); 
       }else{ 
        printf("%s","pasa los ifelse\n"); 
        return 0; 
       } 
      } 
     } 
    } 
} 


int internal_cd(char **args){ 
    printf("%s","cambio de directorio\n"); 
    return 1; 
} 

int internal_export(char **args) { 
    printf("%s","éste es el export\n"); 
    return 1; 
} 

int internal_source(char **args) { 
    printf("%s","éste es el source\n"); 
    return 1; 
} 

int internal_jobs(char **args){ 
    printf("%s","éste es el jobs\n"); 
    return 1; 
} 

void main(){ 
    char *line; 
    while(read_line(&line)){//warning: imcompatible pointer type 
     execute_line(&line);//warning: incompatible pointer type 
    } 
    //free line here?? 
} 
+1

Lisez les avertissements que le compilateur vous donne. Essayez de comprendre ce qu'ils veulent dire. Ils vous disent vraiment ce que vous faites mal. Corrigez-les (pas par exemple en transposant des variables, mais comprenez vraiment ce que les avertissements vous disent et corrigez la cause première). –

+2

Lire 'man strtok', puis' #include ' –

Répondre

1

Votre problème est double.

D'abord, vous concevoir la fonction de prendre une char * mais attendez-vous à accepter un char **, comme

char *read_line(char *line) 

et

read_line(&line); 

va de même pour execute_line() aussi.

En second lieu,

malloc(sizeof(500)); 

est la même chose que

malloc(sizeof(int)); 

Qu'est-ce que vous voulez à la place est

malloc(500); 

comme malloc() prend l'argument de la taille de mémoire être attribué en octets.