[C] Dato astratto device

di il
11 risposte

[C] Dato astratto device

Ciao sono nuovo!
Volevo chiedervi se potevate darmi dei consigli per migliorare questo codice.
Io devo costruire un dato astratto device che prende in input i caratteri da un file. Il device ha un buffer per introdurre 10 caratteri alla volta. la sua dichiarazione va fatta nel server.c e dev'essere fatta static. Per spiegazioni su cosa fa il codice chiedete, ma quello che chiedevo è perchè mi da errore praticamente ogni volta che c'è scritto 'device->' ecco il server:


#include "device.h"
#include <stdio.h>
#include <stdlib.h>
static struct{
    char buf[10];
    int i_buf;
}dev;
typedef struct dev * device;

static FILE *pfile;

static int buffer_vuoto(){
    if(device->i_buf>=10)
    return 1;
    else
    return 0;
}        
//Inizializza il device ne setta le variabili in modo che sia vuoto
void initdev (){
    pfile=fopen("pippo.mp","r");
    (device->i_buf)=100;
}

//Controlla se il buffer è vuoto, se lo è, lo riempie altrimenti
//mette in ch il del buffer indicato da i_buf
void next(){ 
    int i,p;
    p=buffervuoto();
    if(p==1){
    for(i=0;i<10;i++){
        fscanf(pfile,"%c",(device->buf[i]));
        }
        (device->i_buf)=0;
    }
    else{
        ch=(device->buf[(device->i_buf)]);
        (device->i_buf)++;
}
}

void closedev(){
    fclose(pfile);
}      

e il .h:

#ifndef _device
#define _device
#define terminatore '$'
extern char ch;
extern void initdev();
extern void nextch();
extern void closedev();
#endif
grazie infinite!

11 Risposte

  • Re: [C] Dato astratto device

    Ciao, credo che l'errore sia dovuto al fatto che tu non hai dichiarato nessuna variabile che si chiama device. Scrivendo:
    typedef struct dev * device;
    hai creato un nome di tipo per una varibile, cioè definito così device è il nome di un tipo come per esempio int. Per creare una varibile statica avresti dovuto scrivere:
    static struct dev * device;
    Spero di aver risolto il problema. Ciao
  • Re: [C] Dato astratto device

    Grazie!...avevo inuito che il problema fosse li...
    ma essendo un dato astratto dev'essere definito...

    una volta sostituito però mi da questo erroe ogni olta che usa device:
    dereferencing pointer to incomplete type

    dovrei mettere * davandi ad ogni suo uso?
  • Re: [C] Dato astratto device

    Ok, ora non da i soliti errori su device inserendo questo:
    
    typedef struct dev{
        char buf[10];
        int i_buf;
    }dev;
    static struct dev * device;
    ma adesso mi da errore nel .c su ch che ho dichiarato esterna nel .h...

    cosa potrei fare?
    grazie!
  • Re: [C] Dato astratto device

    Ciao, la parola chiave extern serve per dire al compilatore che da qualche parte in un qualsiasi file c c'è una variabile ti quel tipo con quel nome. Scrivendo:
    extern char ch;
    dici al compilatore di cercare in un qualsiasi file c una variabile di nome ch e tipo char, in realtà non viene creata nessuna varibile con questo riga di codice.
    Prova a cercare in tutti i file c che compili la dichiarazione di questa varibile ( char ch; ), se non c'è significa che l'errore è dovuto al linker che non riesce a trovare la varibile ch perchè essa non esiste.

    Ciao
  • Re: [C] Dato astratto device

    Ok ho capito. quindi se dichiaro ch nella struct del device, strutturalmente l'oggetto sofware device esporta la sua variabile ch perchè è dichiarata con lo stesso nome cioè ch, ed extern. giusto?
  • Re: [C] Dato astratto device

    Ora me lo compila ma mi da errore nell'esecuzione. debuggando mi da errore qui:
    device->i_buf=100;
    dentro la initdev. cosa fare?
  • Re: [C] Dato astratto device

    Ciao, fa errore perchè device è un puntatore a struttura e la struttura non viene mai creata, puoi risolvere in due modi:
  • Re: [C] Dato astratto device

    Ok ci sono riuscito ho messo
    static struct dev device;
    e ho sostituito con il punto tutte le freccie -> adesso va: ma mi ma errore sulla nextch.
    #include "device.h"
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct dev{
        char buf[10];
        int i_buf;
    }dev;
    char ch;
    static struct dev device;
    
    static FILE *pfile;
         
    //Inizializza il device ne setta le variabili in modo che sia vuoto
    void initdev (){
        pfile=fopen("pippo.mp","r");
        device.i_buf=10;
    }
    
    //Controlla se il buffer è vuoto, se lo è, lo riempie altrimenti
    //mette in ch il del buffer indicato da i_buf
    void nextch(){ 
        int i;
        if(device.i_buf>9){
        for(i=0;i<10;i++){
            device.buf[i]=getc(pfile);
            }
            (device.i_buf)=0;
        }
        else{
            ch=(device.buf[(device.i_buf)]);
            (device.i_buf)++;
    }
    }
    
    void closedev(){
        fclose(pfile);
        (device.i_buf)=10;
    }      
    con questo programma di test
    #include <stdio.h>
    #include <stdlib.h>
    #include "device.h"
    
    main(){
        initdev();
        nextch();
        printf("%c\n",ch);
        closedev();
        system ("pause");
        return 0;
    }    
  • Re: [C] Dato astratto device

    Ciao, allora....l'unico errore che ho trovato e che se il buffer nella struttura device e vuoto la funzione nextch riempie il buffer, ma non scrive il primo caratere letto nella varibile ch, qundi nel programma di test che hai scritto viene stampato un caratere a caso dopo la chiamata alla nextch. Potresti modificare la nextch così:
    void nextch(){
        int i;
        if(device.i_buf>9){
    		for(i=0;i<10;i++){
    			device.buf[i]=getc(pfile);
    		}
    		(device.i_buf)=0;
    	}
    	ch=(device.buf[(device.i_buf)]);
    	(device.i_buf)++;
    }
    Altri errore non ne vedo, stai attento però a controllare che la initdev riesca ad aprire il file altrimenti la nextch fa errore perchè legge da un file chiuso.

    Ciao
  • Re: [C] Dato astratto device

    Ok grazie, il fine settimana me lo prendo di riflessione... ti farò sapere lunedì il responso del tuo codice. (sempre in questo 3d) grazie a presto.
  • Re: [C] Dato astratto device

    Grazie ora funziona, cioè non mi da errore ma devo rifinirlo... per esempio se io ho un file lungo 20 caratteri una serie di 20 nextch e printf relativa dovrebbe stamparmi tutti i venti caratteri in fila. invece intanto come primo elemento del buffer c'è uno spazio e anche come ultimo quindi ma stampa una cosa di questo tipo:
    qwertyuio pasdfghj

    invece io vorrei:
    qwertyuiopasdfghjklz

    non so se mi sono spiegato...
Devi accedere o registrarti per scrivere nel forum
11 risposte