Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    4

    [C] come passare strutture a un afunzione?

    Ciao a tutti sto scrivendo il mio primo codice in C per un micro Atmel ATtiny26 e vorrei
    passare una stuttura ad una funzione che legga gli ingressi, per ora ho lavorato solo con i PLC, qualcuno può aiutarmi? Grazie mille!

    Questa è la struttura:

    struct io {
    char port;
    char bit;
    };
    struct io conf = {A, B4}, en = {A, B5}, oimp = {A, B0}, film = {A, B1};

    Questa è la funzione:

    char read(struct io x)
    {
    char ret=0;

    switch(x.port)
    {
    case A:
    {
    ret=(PINA & x.bit);
    break;
    }
    case B:
    {
    ret=(PINB & x.bit);
    break;
    }
    case C:
    {
    //ret=(PINC & x.bit);
    break;
    }
    case D:
    {
    //ret=(PIND & x.bit);
    break;
    }
    }
    return ret;
    }

    Questa la chiamata:

    int main(void)
    {
    init_io();
    read(conf);
    }

    E questo lerrore:

    main.c:47: error: 'conf' has an incomplete type
    main.c:47: error: type of formal parameter 1 is incomplete

  2. #2
    Sei un po' confuso sui tipi di dato ...
    Un char non può contenere il valore B1 o B0, etc ...
    Inoltre credo che a port non debba essere assegnato il valore A ma il carattere 'A' (ma questa è una piccolezza)...
    Naturalmente potrei sbagliarmi: se ad esempio A è una costante come pure B0, etc.
    In questo caso non ti resta che postare il codice completo oppure tutto il main con tutte le costanti globali e le macro ...
    codice:
    struct io 
    {
       char port;
       char bit;
    };
    struct io conf = {'A', 4}, en = {'A', 5}, oimp = {'A', 0}, film = {'A', 1};
    
    //Questa è la funzione:
    
    char read(struct io x)
    {
       char ret=0;
    
       switch(x.port)
          {
           case 'A':
              ret=(PINA &x.bit);
              break;
           case 'B':
              ret=(PINB & x.bit);
              break;
           case 'C':
              //ret=(PINC & x.bit);
              break;
           case 'D':
              //ret=(PIND & x.bit);
              break;
          }
       return ret;
    }
    Experience is what you get when you don’t get what you want

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    4
    Grazie Xaratroom come supponevi A, B4, ecc sono costanti, ti invio il codice completo.
    PORTA, PORTB, DDRA, ecc sono funzioni di libreria del micro per configurare gli I_O e per leggere gli ingressi e scrivere sulle uscite.

    main.c:

    // output: none //
    // azione: inizializza direzione delle porte//
    //------------------------------------------------------//

    void init_io(void)
    {
    DDRA = 0x0f; // PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
    // in in in in out out out out

    PORTA = 0X00; // PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
    // x x x x 0 0 0 0

    DDRB = 0x0f; // PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
    // in in in in out in in in

    PORTB = 0X00; // PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
    // x x x x 0 x x x
    }


    int main(void)
    {
    init_io();
    TIMSK = (1<<TOIE0);
    if (TOIE0 == 1)
    PORTA = 0x01;
    }

    file in_out.c:

    #include "cost.h"
    #include <avr/io.h>


    struct io {
    char port;
    char bit;
    };
    struct io conf = {A, B4}, en = {A, B5}, oimp = {A, B0}, film = {A, B1};




    //------------------------------------------------------//
    //nome funzione: read //
    // input: struct //
    // output: char //
    // azione: legge pin ingresso //
    //------------------------------------------------------//

    char read(struct io x)
    {
    char ret=0;

    switch(x.port)
    {
    case A:
    {
    ret=(PINA & x.bit);
    break;
    }
    case B:
    {
    ret=(PINB & x.bit);
    break;
    }
    case C:
    {
    //ret=(PINC & x.bit);
    break;
    }
    case D:
    {
    //ret=(PIND & x.bit);
    break;
    }
    }
    return ret;
    }

    //------------------------------------------------------//
    //nome funzione: out //
    // input: struct //
    // output: nessuno //
    // azione: setta pin uscita //
    //------------------------------------------------------//


    void out(struct io x)
    {

    switch(x.port)
    {
    case A:
    {
    PORTA=(PORTA | x.bit);
    break;
    }
    case B:
    {
    PORTB=(PORTB | x.bit);
    break;
    }
    case C:
    {
    //PORTC=(PORTC | x.bit);
    break;
    }
    case D:
    {
    //PORTD=(PORTD | x.bit);
    break;
    }
    }
    return;
    }

    //------------------------------------------------------//
    //nome funzione: outoff //
    // input: struct //
    // output: nessuno //
    // azione: resetta pin uscita //
    //------------------------------------------------------//


    void outoff(struct io x)
    {

    switch(x.port)
    {
    case A:
    {
    PORTA=(PORTA & !x.bit);
    break;
    }
    case B:
    {
    PORTB=(PORTB & !x.bit);
    break;
    }
    case C:
    {
    //PORTC=(PORTC & !x.bit);
    break;
    }
    case D:
    {
    //PORTD=(PORTD & !x.bit);
    break;
    }
    }
    return;
    }

    file in_out.h

    extern struct io conf;
    extern struct io en;
    extern struct io oimp;
    extern struct io film;
    extern char read(struct io x);
    extern void out(struct io x);
    extern void outoff(struct io x);

    file cost.h:

    #define B0 0x01 //maschera bit
    #define B1 0x02 //maschera bit
    #define B2 0x04 //maschera bit
    #define B3 0x08 //maschera bit
    #define B4 0x10 //maschera bit
    #define B5 0x20 //maschera bit
    #define B6 0x40 //maschera bit
    #define B7 0x80 //maschera bit
    #define A 0x01
    #define B 0x02
    #define C 0x03
    #define D 0x04

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, ma qual e' la linea di codice numero 47?

    Almeno si circoscrive il problema dato che leggere il codice non e' facile (usa i tag CODE ...)

  5. #5
    Il problema credo derivi da come hai "strutturato" i file e da come li hai "collegati" ...
    Guarda qui ...
    Experience is what you get when you don’t get what you want

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    4
    Grazie

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Secondo me il problema sta in

    char read(struct io x)

    in cui la struttura deve essere passata per indirizzo, cioe'

    char read(struct io *x)

    e quindi utilizzata cosi'

    switch(x->port)

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    4
    Grazie Oregon ho letto qualcosa in proposito a riguardo su un libro, c'era scritto che alcuni vecchi compilatori non ammettono l'uso diretto come argomento ma necessitano il passaggio alla funzione solo tramite il puntatore.
    Per quanto riguarda il mio problema ho provato ,su suggerimento di Xaratroom, a riunire tutti i file dentro il main e a ricompilare.... risultato, nessun errore.
    Allora ho eliminato nel makefile in_out.c dalla lista dei files da includere e l'ho incluso
    direttamente nel main.c con la direttiva #include "in_out.c", ora non ho capito bene il perchè, il compilatore non da più errori, per la cronaca sto usando WinAVR 20070122.
    Grazie ancora a tutti!
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.