Creare una libreria con devc - Prime armi

di il
31 risposte

31 Risposte - Pagina 2

  • Re: Creare una libreria con devc - Prime armi

    In realtà mi correggo, non è che l'esecuzione si blocca.. l'esecuzione termina correttamente è solo che poi verificando con stampa mi accorgo che lista è composta ripetutamente solo dall'ultima stringa
    stringa=leggi(stringa);
        lista=inserimento(lista,stringa);
        stringa2=leggi(stringa2);
        lista=inserimento(lista,stringa2);
    se in input a leggi do.. "ciao" e "due" ...
    stampa(lista) mi stampa
    " due
    due"
  • Re: Creare una libreria con devc - Prime armi

    Ciao,
    magari non è la soluzione (non ho avuto tempo di provare), ma non è corretto scrivere
    
    tmp->str=elem;
    
    Per copiare le stringhe si utilizza la funzione strcpy. Quindi
    strcpy(tmp->str, elem);
  • Re: Creare una libreria con devc - Prime armi

    Cerchiamo di comprenderci,
    stringa = leggi(stringa)
    non ha alcun effetto perchè leggi stringa è void.


    Ho provato a compilare, mi ha due warning e comunque se eseguo mi stampa:
    uno
    due
    tre
    amore
    inserisci x: 3
    segmentation fault

    Quindi non funziona.
  • Re: Creare una libreria con devc - Prime armi

    minomic ha scritto:


    Ciao,
    magari non è la soluzione (non ho avuto tempo di provare), ma non è corretto scrivere
    
    tmp->str=elem;
    
    Per copiare le stringhe si utilizza la funzione strcpy. Quindi
    strcpy(tmp->str, elem);
    Quello che dici è in parte vero, però trattandosi di puntatori e penso che quello vuole, l'assegnazione è legittima a patto di allocare il puntatore.
  • Re: Creare una libreria con devc - Prime armi

    
    char * leggi (void) {
        char *s = (char *)malloc(80*sizeof(char));
        scanf ("%s",s);
        return s;
    }
    stringa=leggi();
    Se sostituisci queste righe nella libreria e nel main, vedi che il problema sparisce.
  • Re: Creare una libreria con devc - Prime armi

    Grazie mille!
    faccio sempre questi errori sulle variabili di ritorno delle funzioni.

    Ma se invece volessi creare una libreria dinamica.. devo utilizzare il file.h con i prototipi di funzione, e quello .c per i corpi delle funzioni? Creando il progetto automaticamente con dev c.. mi ha creato questi due file.. che però contengono già dei corpi preimpostati.. ho capito dove devo andare a sostituire il nome della mialibreria.. ma ci sono certe righe di cui ignoro completamente il significato.. mi potete dare un aiuto anche in questo?
  • Re: Creare una libreria con devc - Prime armi

    Non facciamo confusione.

    Un ADT libreria in C devi crearlo nel seguente modo;

    adt.h
    /* File che contiene tutti i prototipi delle funzioni di librerie, cioè quelle utilizzabili dal client, più tutte le variabili che vuoi il client veda. Tutte le define... */

    adt.c
    /* File che contiene tutte le implementazioni delle funzioni dichiarate nel adt.h e tutti le variabili funzioni statiche, ecc... che completano la libreria */

    Le librerie dinamiche sono librerie che sarano collegate in runtime.
  • Re: Creare una libreria con devc - Prime armi

    esercizio.h
    #ifndef ESERCIZIO_H_INCLUDED
    #define ESERCIZIO_H_INCLUDED
    
    typedef struct listapuntata {
        char *str;
        struct listapuntata *next;
    }listapuntata;
    
    listapuntata *inserimento(listapuntata *lista, char *stringa);
    char * leggi (void);
    void stampa(listapuntata *lista);
    listapuntata *cancellatutto(listapuntata *lista);
    listapuntata *cancella(listapuntata *lista, char *elem);
    listapuntata *cancellaparticolare(listapuntata *lista, int x, char *a, char *b);
    #endif // ESERCIZIO_H_INCLUDED
    
    esercizio.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "esercizio.h"
    
    
    char * leggi (void) {
        char *s = (char *)malloc(80*sizeof(char));
        scanf ("%s",s);
        return s;
    }
    
    listapuntata *inserimento(listapuntata *lista, char *elem) {
        if((lista==NULL) || ((strlen(lista->str))>(strlen(elem)))) {
            listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
            tmp->str=elem;
            tmp->next=lista;
            return tmp;
        } else {
            lista->next=inserimento(lista->next,elem);
            return lista;
        }
    }
    
    
    void stampa(listapuntata *lista) {
        if (lista != NULL) {
            printf(" %s\n",lista->str);
            stampa(lista->next);
        } else {
            return;
        }
    }
    
    listapuntata *cancellatutto(listapuntata *lista) {
        if (lista!=NULL)
            lista=cancellatutto(lista->next);
        return lista;
    }
    
    listapuntata *cancella(listapuntata *lista, char *elem) {
        int val;
        if (lista!=NULL) {
            val=strcmp((lista->str),elem);
    
            if ( val!=0 ) {
                lista->next=cancella(lista->next,elem);
            } else if (val==0) {
                printf("TROVATA\n");
                listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
                tmp=lista;
                lista=tmp->next;
                free(tmp);
            }
        }
       return lista;
    }
    
    listapuntata *cancellaparticolare(listapuntata *lista, int x, char *a, char *b) {
        int val,lung;
        if (lista!=NULL) {
            lung=(strlen(lista->str))-x;
    
            if (((lung%2) == 0) && ( (strlen(a)) < (strlen(lista->str)) < (strlen(b)))) {
                printf("TROVATA\n");
                listapuntata *tmp=(listapuntata *)malloc(sizeof(listapuntata));
                tmp=lista;
                lista=tmp->next;
                free(tmp);
            }
            lista->next=cancellaparticolare(lista->next,x,a,b);
        }
        return lista;
    }
    
    
    client.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "esercizio.h"
    
    int main() {
    
        int i;
        char *stringa,*a, *b;
        struct listapuntata *lista;
    
    
        stringa = (char *)calloc(100, sizeof(char));
        a = (char *)calloc(100, sizeof(char));
        b= (char *)calloc(100, sizeof(char));
        lista=NULL;
    
        //stringa="due";
        stringa=leggi();
        lista=inserimento(lista,stringa);
        //stringa="amore";
        stringa=leggi();
        lista=inserimento(lista,stringa);
        //stringa="ciao";
        stringa=leggi();
        lista=inserimento(lista,stringa);
        //stringa="un";
        stringa=leggi();
        lista=inserimento(lista,stringa);
    
    
        system("PAUSE");
        printf("La lista: \n");
        stampa(lista);
    
        printf("Inserisci x: ");
        scanf("%d", &i);
        a="un";
        b="amore";
    
        lista=cancellaparticolare(lista,i,a,b);
        stampa(lista);
        printf("\t\t*****FINE******\n");
        system("PAUSE");
        return 0;
    
    }
    
    Anche se ti ripeto che così non separi la libreria dal client.
  • Re: Creare una libreria con devc - Prime armi

    E quindi per separare la libreria dal client cosa devo fare?
    Per essere più chiara io sto svolgendo un esercizio di cui di seguito la traccia :

    Definire una libreria di funzioni in linguaggio C per la gestione di una struttura dati dinamica di tipo lista puntata (singola) ordinata in cui i dati sono stringhe alfanumeriche.
    Le funzionalità da realizzare sono le seguenti:
    1)lettura da tastiera di una stringa
    2)inserimento di una stringa nella lista ordinata
    3)stampa di tutte le stringhe presenti in una lista data
    ... etc

    E' la prima volta che creo una libreria, per cui mi rendo conto che mi mancano proprio delle nozioni base per farlo; tramite delle ricerche online ho seguito una procedura guidata per devc. Per cui ho creato una libreria statica con un file .h ; provando invece a creare una libreria dinamica sempre con una procedura guidata, devc in automatico mi ha creato un file .h e uno .c con appunto dei corpi preimpostati.
    Dunque anche nella creazione di una libreria statica sto facendo un errore ad avere un unico file .h?
    In realtà per la miglior riuscita di questo esercizio, data la traccia, secondo te è meglio che creo una libreria statica o dinamica? Dal momento che nella traccia non è specificato.
  • Re: Creare una libreria con devc - Prime armi

    Allora. Tu stai creando una libreria che sarà inglobata nel tuo eseguibile finale per intenderci.
    Le librerie dinamiche sono quelle librerie che non vengono inserite nell'eseguibile finale, ma che tramite appositi handler richiamate all'occorrenza dal client in runtime.

    La traccia che hai dice semplicemente che la struttura dati deve essere dinamica. Una lista per definizione è una struttura dati dinamica, cioè, può avere nessun elemento, un elemento, centomila elementi.

    Lo schema quindi è quello che ti ho indicato.

    Per disaccoppiare dovresti dicharare l'hendler nel adt.h e la struttura nel adt.c, in modo da poter accedere solo tramite l'handler.
    In pratica sposti la struct che ti ho detto prima dall'header file al .c, e nel header scrivi:

    typedef struct listapuntata * LISTAPUNTATA;

    Correggi tutte le definizioni, ovvero la dove sta listapuntata * metti LISTAPUNTATA;
    Così facendo dovresti aver disacoppiato la libreria dal client.

    Dopotutto una libreria è qualcosa che puoi riciclare per un prossimo utilizzo, quindi scriverne una bene significa che la prossima volta che hai bisogno di una listapuntata come quella già ce l'hai.

    Spero aver chiarito meglio.

    P.s. Posso chiederti che corso di studi fai, se sei a scuola o all'università e eventualmete che esame prepari
  • Re: Creare una libreria con devc - Prime armi

    Ok chiaro, ora ho capito.. ritornando ai due file però ora mi ritorna anche il problema "linker error" del compilatore.. nonostante i file siano tutti nella stessa cartella.
    //esercizio.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "esercizio.h"
    
    typedef struct listapuntata {
        char *str;
        struct listapuntata *next;
    }listapuntata;
    
    char * leggi (void) {
        char *s = (char *)malloc(80*sizeof(char));
        printf("Inserisci stringa: ");
        scanf ("%s",s);
        return s;
    }
    
    
    LISTAPUNTATA inserimento(LISTAPUNTATA lista, char *elem)
    {
            if((lista==NULL) || ((strlen(lista->str))>(strlen(elem))))
            {
                    LISTAPUNTATA tmp=(listapuntata *)malloc(sizeof(listapuntata));
                    tmp->str=elem;
                    tmp->next=lista;
                    return tmp;
            }
            else{
                    lista->next=inserimento(lista->next,elem);
                    return lista;
            }
    }
    
    
    void stampa(LISTAPUNTATA lista) {
                
                 if (lista != NULL)
                     {
                 printf(" %s\n",lista->str);
                 stampa(lista->next);
                 }
                 else 
                 {
                 return;
                 }
                
    }
    
    LISTAPUNTATA cancellatutto(LISTAPUNTATA lista)
    {
            if (lista!=NULL)
               lista=cancellatutto(lista->next);
            return lista;
            
            
    }
    
    LISTAPUNTATA cancella(LISTAPUNTATA lista, char *elem)
    {
            int val;
            if (lista!=NULL)
               {
                            val=strcmp((lista->str),elem);
                            
                            if ( val!=0 )
                               {lista->next=cancella(lista->next,elem);}
                            else if (val==0)
                                    { printf("TROVATA\n");
                                    LISTAPUNTATA tmp=(listapuntata *)malloc(sizeof(listapuntata));
                                    tmp=lista;
                                    lista=tmp->next;
                                    free(tmp);}
            }
             
             
    return lista;
                
    }
    
    
    LISTAPUNTATA cancellaparticolare(LISTAPUNTATA lista, int x, char *a, char *b)
    {
            int val,lung;
            if (lista!=NULL)
               {
                            lung=(strlen(lista->str))-x;
                            
                            if (((lung%2) == 0) && ( (strlen(a)) < (strlen(lista->str)) < (strlen(b))))
                                    { printf("TROVATA\n");
                                      LISTAPUNTATA tmp=(listapuntata *)malloc(sizeof(listapuntata));
                                      tmp=lista;
                                      lista=tmp->next;
                                      free(tmp);
                                      
                                    }
                            lista->next=cancellaparticolare(lista->next,x,a,b);
                                    
            }
             
             
    return lista;
                
    }
    
    
    //esercizio.h
    
    #ifndef ESERCIZIO_H_INCLUDED
    #define ESERCIZIO_H_INCLUDED
    
    typedef struct listapuntata * LISTAPUNTATA;
    
    char * leggi (void);
    LISTAPUNTATA inserimento(LISTAPUNTATA lista, char *elem);
    void stampa(LISTAPUNTATA lista);
    LISTAPUNTATA cancellatutto(LISTAPUNTATA lista);
    LISTAPUNTATA cancella(LISTAPUNTATA lista, char *elem);
    LISTAPUNTATA cancellaparticolare(LISTAPUNTATA lista, int x, char *a, char *b);
    
    #endif // ESERCIZIO_H_INCLUDED

    Comunque sono all'università, ma di ritorno dopo ben cinqueanni di pausa, ecco perchè sto riprendendo tutto da sola.. l'esame è laboratorio di algoritmi e strutture dati.
  • Re: Creare una libreria con devc - Prime armi

    Scusami ho risolto.. l'errore stava che nel programma chiamante non devo avere più
    #include "esercizio.h"

    ma
    #include "esercizio.c"
    e così funziona.

    Quindi risulta corretto rispetto alla traccia?
  • Re: Creare una libreria con devc - Prime armi

    A me non da problemi.
    Io sto usando Code::Blocks

    P.s. Quale ateneo?
  • Re: Creare una libreria con devc - Prime armi

    NO!

    Il programma chiamante non conosce nulla e non deve conoscere nulla del .c.

    Devi includere solo il .h nel chiamante.
  • Re: Creare una libreria con devc - Prime armi

    Allora c'è qualcosa che non va... mi funziona solo se includo il .c
Devi accedere o registrarti per scrivere nel forum
31 risposte