[c] Puntatori e struct

Pubblicità

ilfe98

Utente Èlite
Messaggi
3,083
Reazioni
1,317
Punteggio
134
Salve a ,tutti ragazzi ho questo esercizio:
Creare i file dictionary.h e dictionary.c che consentano di utilizzare le seguenti strutture:

struct pair {
char key[256];
char value[256];
};
struct dictionary {
size_t size;
struct pair *data;
};
e la funzione:

extern char *find(const struct dictionary *dict, const char *key);

La struttura pair permette di memorizzare una coppia chiave-valore dove entrambi gli elementi sono costituiti da stringhe di al massimo 256 caratteri (terminatore compreso). La struttura dictionary invece permette di memorizzare un vettore di pair.
La funzione accetta in input un puntatore a una struct dictionary e una stringa C e deve cercare nel dizionario una pair avente come chiave una stringa uguale a quella passata nel parametro key e ritornare il puntatore all’elemento trovato.
La funzione ritorna NULL se almeno uno dei due parametri è NULL o se non viene trovato nessun elemento che ha la chiave cercata. Tutte le chiavi del dizionario sono uniche.


Ciò che mi manda in panne è la ricerca di questo valore
avendo una struct dict come costante come faccio ad incrementare il puntatore *data in modo che punti alla struttura successiva in modo da controllare il valore?
Devo dichiarare una struttura di tipo pair temporanea?
io ho creato questo codice che non mi da il risultato corretto, sapreste delucidarmi?


C:
   [B]leggi_linee.h[/B]
#ifndef Header
#define Header
#include<stdlib.h>
#include<stdio.h>
extern char **leggi_linee(const char *filename);
#endif // !Header


[B]leggi_linee.c[/B]
#include"dictionary.h"
extern char *find(const struct dictionary *dict, const char *key)
{
    char *ret=malloc(256*sizeof(char);
    for (size_t i = 0; i < dict->size; i++) {
        if (strcmp(*key, dict->data->key[i]))
            ret = &(dict->data)->key[i];

        return ret;
    }
}
 
Un problema sta nella
Codice:
data->key[i]
Osserva bene.
L'indice 'i' non si riferisce alla campo 'key'

L’altro problema sta nella posizione dell'istruzione 'return'. Così dove lo hai messo, la funzione ritorna sempre nel primo passo del ciclo.

Terzo problema, perché mai allochi memoria? È già allocata.

Quarto: utilizzi il parametro di funzione 'key' in modo sbagliato. È un puntatore di char, quindi una stringa, e come tale va utilizzata. Devi fare un confronto tra stringhe.

Consiglio: che compilatore usi? Sai usare un debugger? Te lo chiedo perché questi problemi si risolvono semplicemente usando un debugger eseguendo il programma passo per passo, vedere cosa faccia e guardare il contenuto delle variabili.
 
Un problema sta nella
Codice:
data->key[i]
Osserva bene.
L'indice 'i' non si riferisce alla campo 'key'

L’altro problema sta nella posizione dell'istruzione 'return'. Così dove lo hai messo, la funzione ritorna sempre nel primo passo del ciclo.

Terzo problema, perché mai allochi memoria? È già allocata.

Quarto: utilizzi il parametro di funzione 'key' in modo sbagliato. È un puntatore di char, quindi una stringa, e come tale va utilizzata. Devi fare un confronto tra stringhe.

Consiglio: che compilatore usi? Sai usare un debugger? Te lo chiedo perché questi problemi si risolvono semplicemente usando un debugger eseguendo il programma passo per passo, vedere cosa faccia e guardare il contenuto delle variabili.
@Andretti60 come al solito mi salvi sempre, si avevo capito che il problema era che la i non si riferisce a key era la disperazione,ma si riferisce al puntatore a data, tuttavia non posso incrementarlo perché nella funzione è costante giusto?
Quanto al compilatore quasi mi vergogno a dire Visual studio enterprise perché è come una ferrari in mano un neonato
 
Ultima modifica:
ho provato a creare una struct dictionary temporanea tuttavia de provo ad incrementare temp->data mi dice che l'espressione deve essere di tipo puntatore ma lo è... Precisamente è di tipo puntatore a struct pair? cosa sbaglio?
 
Risolto ed ho capito il problema data puntava a una struct pair quindi la sintassi non era
C:
dict->data[i]->key
ma era
C:
dict->data[i].key
in questo modo effetivamente era un puntatore.
il codice corretto testato e funzionante è:
HEADER:
C:
#ifndef HEADER
#define HEADER
struct pair {
    char key[256];
    char value[256];
};
struct dictionary {
    size_t size;
    struct pair *data;
};
#include<string.h>
extern char *find(const struct dictionary *dict, const char *key);
#endif // !HEADER
FUNZIONE:

C:
#include"dictionary.h"
extern char *find(const struct dictionary *dict, const char *key)
{
    if (dict == NULL || key == NULL)
        return NULL;
    char *ret ;

    for (size_t i = 0; i < dict->size; i++) {
        if (strcmp(key, dict->data[i].key) == 0) {
            ret = dict->data[i].value;
            return ret;
        }
        
    }
    
    ret = NULL;
    return ret;
}
Ringrazio @Andretti60 che ho notato avere tanta pazienza con me
 
... Ringrazio @Andretti60 che ho notato avere tanta pazienza con me
Ma figurati guarda, non si finisce mai con il imparare. Ho 58 anni e quello che ho imparato meglio è che sono ignorante in quasi tutto. :) Quello che so, sono felice di spiegarlo in giro.
Ma attento, verrà poi il tuo turno allora ricordati del fan di Mario Andretti.
 
Pubblicità
Pubblicità
Indietro
Top