[C] Strcmp() e Strcpy() con strutture

di il
5 risposte

[C] Strcmp() e Strcpy() con strutture

Io ho quest struttura

typedef struct symtab_node{
	char * nome;
	boolean inizializzata;
        struct symtab_node * SX,* DX;
}symtab_node;
typedef symtab_node * symtab;
devo fare la string-compair o la string-copy tra un'elemento di una symtab e una stringa esterna.

es:
supponiamo di avere gia una symtab s con dei valori per nome, per fare la strcmp con una stringa name con questa sintassi:

strcmp(s->nome,name);
mi da errore, è proprio un errore di sintassi, credo.

5 Risposte

  • Re: [C] Strcmp() e Strcpy() con strutture

    Ciao,

    La sintassi è corretta... la strcmp (string compare) accetta due char* come parametri (sei sicuro che il secondo lo sia?) e ritorna zero se le due stringhe sono uguali. Essendo symtab s un puntatore alla tua struttura è corretto l'accesso con s->nome.

    Quando ottieni un errore dal compilatore o dal linker, postalo assieme al codice... facilita non poco il compito di chi è disposto ad aiutarti... in mancanza di indicazioni più precise ti posso solo dire che la sintassi è apparentemente corretta.

    Ciaociao
  • Re: [C] Strcmp() e Strcpy() con strutture

    Ho risolto. ora quel confronto mi serviva per inserire elementi in un albero binario di ricerca. ecco il codice(la struttura dati è quella di prima)
    static void newnode(symtab_node *t,char*n){
        t=(symtab_node *)malloc(sizeof(symtab_node));
        t->inizializzata=FALSE;
        t->DX = NULL;
        t->SX = NULL;
        strcpy(n,t->nome);
    }
    static int symcomp(symtab_node *s, char * m){
        int i;
        i=strcmp(s->nome,m);
        return i;
    } 
    
    void tabinsert(symtab * s, char *name){
        int i;
        symtab_node *temp;
        if( s != NULL ){
            if(symcomp(*s,name)==0)
               printf("Si vuole inserire un ogeetto già presente");//return false
            else{
                if(symcomp(*s,name)<0){
                    if((*s)->SX==NULL){
                       newnode((*s)->SX,name);
                    }    
                    else tabinsert(*(s->SX),name);//qui
                }
                else{
                    if((*s)->DX==NULL){
                       newnode((*s)->DX,name);
                    }    
                    else tabinsert(*(s->DX),name);//qui
                }
            }
        }
    }
    
    mi da errore sulla ricorsione (dove ho messo '//qui' nel codice):
    request for member `SX' in something not a structure or union
    cosa vuol dire?
  • Re: [C] Strcmp() e Strcpy() con strutture

    Ciao,

    E'piuttosto chiaro adesso... basta che riguardi meglio come accedi ai membri nel resto del codice.

    s, nella tua funzione è definito come un symtab*, ovverosia uno struct symtab_node**. Ovviamente tale ultima cosa non ha un membro SX, ha invece un membro SX il symtab (*s)... come nel resto del codice quindi sarà necessario usare (*s)->SX e non *(s->SX)...

    In sostanza quanto detto
    supponiamo di avere gia una symtab s
    è valido, ma nella tua funzione hai un symtab* s e non un symtab s...

    Ciaociao
  • Re: [C] Strcmp() e Strcpy() con strutture

    void tabinsert(symtab * s, char *name){
        int i;
        symtab_node *temp;
        if( s != NULL ){
            if(symcomp(*s,name)==0)
               printf("Si vuole inserire un ogeetto già presente");//return false
            else{
                if(symcomp(*s,name)<0){
                    if((*s)->SX==NULL){
                       newnode((*s)->SX,name);
                    }   
                    else tabinsert((*s)->SX,name);//qui
                }
                else{
                    if((*s)->DX==NULL){
                       newnode((*s)->DX,name);
                    }   
                    else tabinsert((*s)->DX,name);//qui
                }
            }
        }
    }
    
    ho sostituito *(s->DX) con (*s)->DX.
    adesso però mi da questi warning:
    [Warning] passing arg 1 of `tabinsert' from incompatible pointer type
  • Re: [C] Strcmp() e Strcpy() con strutture

    Ciao,

    E'abbastanza chiaro... il membro (*s)->SX è un symtab e la funzione che hai scritto vuole un symtab*...
    La soluzione?
    1) modifichi la funzione... la fattibilità dipende dal motivo per cui vuoi un symtab* come parametro... un symtab sarebbe già di per se un puntatore alla struttura. Dichiarare un puntatore a puntatore ha senso solo se vuoi modificarne il contenuto (come nell'allocazione).
    2) Passi l'indirizzo di SX, in poche parole &((*s)->SX), in modo che quello che vai a passare sia, giustamente, un symtab*

    Per il resto solo tu puoi decidere come strutturare l'applicativo (quindi quali strutture e parametri ti siano maggiormente utili)... tieni sempre presente quali sono i tipi di dato che maneggi (puntatori, puntatori a puntatori, strutture, ecc). Se non ti è ben chiaro cosa non andasse nel codice che hai modificato, forse la cosa più opportuna è mettere da parte un attimo lo sviluppo ed approfondire con attenzione i concetti fondamentali di tipo e di puntatore.

    Ciaociao
Devi accedere o registrarti per scrivere nel forum
5 risposte