[c] Puntatori e struct

ilfe98

Moderatore
Staff Forum
1,290
379
Hardware Utente
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
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;
    }
}
 

Andretti60

Utente Èlite
3,657
2,452
Hardware Utente
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.
 

ilfe98

Moderatore
Staff Forum
1,290
379
Hardware Utente
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
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:

ilfe98

Moderatore
Staff Forum
1,290
379
Hardware Utente
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
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?
 

ilfe98

Moderatore
Staff Forum
1,290
379
Hardware Utente
CPU
Intel i7 7700K
Dissipatore
Bequiet Dark rock pro 4
Scheda Madre
Msi pc mate z270
Hard Disk
Seagate barracuda 1tb, silicon power NVME 500gb
RAM
Patriot viper steel 3733Mhz
Scheda Video
Inno 3d gtx 1080 herculez design
Monitor
Asus mg279q
Alimentatore
680 w thermaltake
Case
Itek lunar 23
Internet
Tiscali ftth
Sistema Operativo
windows 10,mint,debian
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
 
  • Mi piace
Reactions: Andretti60

Entra

oppure Accedi utilizzando