[C] Dato astratto device

di Anonimizzato4329 il
11 risposte
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

  • 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
  • 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?
  • 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!
  • 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
  • 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?
  • Ora me lo compila ma mi da errore nell'esecuzione. debuggando mi da errore qui:
    device->i_buf=100;
    dentro la initdev. cosa fare?
  • Ciao, fa errore perchè device è un puntatore a struttura e la struttura non viene mai creata, puoi risolvere in due modi:
  • 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;
    }    
  • 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
  • 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.
  • 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