Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 35
  1. #1

    [C] problema organizzazione .h, .c per oggetto pila

    ciao a tutti
    ho un esercizio da svolgere e non riesco a capirne la logica.
    so come funziona una pila, so come e' strutturata eccetera ma avendo imparato la programmazione java (cioe' ad oggetti) non riesco a implementare su C una pila, non riesco cioe' a capire la logica in cui dovrei scrivere i file .h e i file .c, dove e come scrivere i prototipi, le variabili static ecc.

    il testo dell'esercizio e' questo (se qualcuno ha buon cuore e puo' darmi una mano a capire come strutturare un programma "semicomplesso" )

    Strutturazione di un programma

    Si vuole realizzare una piccola libreria per eseguire operazioni su uno stack di interi. Lo stack può essere implementato come un array di interi di lunghezza fissata (ma si usi una costante simbolica definita con #define per indicare questa lunghezza).

    Si crei un file stack.c contenente le definizioni delle strutture dati necessarie (suggerimento: servirà almeno un array per memorizzare gli elementi, nonché un modo per sapere quanti elementi sono contenuti nello stack, o un puntatore alla sua testa) e un file stackop.c contenente le definizioni delle seguenti funzioni:

    * int push(int) impila un intero nello stack; restituisce 0 se l'operazione è andata a buon fine, oppure -1 in caso di errori (per esempio, non c'è spazio nello stack);
    * int pop() toglie l'elemento in cima allo stack e lo restituisce al chiamante; ritorna 0 se lo stack è vuoto;
    * int peek() restituisce l'elemento in cima allo stack senza eliminarlo dallo stack; ritorna 0 se lo stack è vuoto;
    * int size() restituisce il numero di elementi presenti al momento nello stack;
    * int empty() restituisce TRUE se lo stack è vuoto, FALSE altrimenti.

    Si abbia cura di definire anche dei file .h contenenti le dichiarazioni e i prototipi corrispondenti ai file .c di cui sopra.

    Infine, si scriva un file main.c contenente (ovviamente) una funzione main() che, dopo aver incluso i .h che si sono definiti e quelli di sistema eventualmente necessari, effettui alcune operazioni sullo stack, stampando i risultati e verificando che tutto funzioni come atteso.
    e un'altra domanda: una variabile e' intesa come globale se viene dichiarata all'inzio del file o se viene dichiarata in un .h?

    grazie a tutti!

  2. #2
    Passare da una pila in java a una pila in cpp, implementandola anche in un header è assurdo per un programmatore java, alle prime armi con il cpp...
    Java non possiede puntatori qundi ti dovrei studiare un po' di teoria sui puntatori ...
    Inoltre devi considerare anche il linkage ...
    Se una variabile è definita globale in un header avrà linkage illimitato mentre se la dichiari in un .cpp globale è diverso ...
    Studia quindi il linker e poi prova a buttare giù un po' di codice
    Experience is what you get when you don’t get what you want

  3. #3

    Re: [C] problema organizzazione .h, .c per oggetto pila

    Originariamente inviato da duonovembre
    un'altra domanda: una variabile e' intesa come globale se viene dichiarata all'inzio del file o se viene dichiarata in un .h?
    Non confondere dichiarazione con definizione: puoi dichiarare una variabile globale innumerevoli volte, ma definirla una sola volta.

    Una variabile globale devi dichiararla prima di utilizzarla. Serve per dire al compilatore: "Hey guarda che adesso utilizzerò una cosa che è definita altrove". Perciò onde evitare di dichiararla innumerevoli volte prima del suo utilizzo (anche in maniera ripetitiva), si preferisce dichiararla all'interno di un *.h che verrà incluso dagli *.c che ne abbisognano.

    Puoi definirla una sola volta, definendola fuori da qualunque funzione, in un qualunque file del progetto. Potresti formalmente definirla anche in un *.h a patto che quell' *.h sia incluso una sola volta da un solo *.c del progetto.
    Praticamente la si definisce in un *.c e in un *.h la si dichiara

    Ad esempio:

    Codice PHP:
    /*
    * file "MyGlobal.h"
    */
    extern int gCounter/* dichiarazione della variabile globale gCounter */ 
    Codice PHP:
    /*
    * file "MyGlobal.c"
    */

    #include "MyGlobal.h"

    int gCounter 123/* definizione ed inizializzazione della variabile globale gCounter */ 
    Codice PHP:
    /*
    * file "MyMain.c"
    */

    #include <stdio.h>
    #include "MyGlobal.h"

    int main (void){
        
    printf ("gCounter: %d;\n"gCounter);
        return 
    0;

    leggiti anche il seguente thread:

    http://forum.html.it/forum/showthrea...readid=1177734

  4. #4
    quindi dovrei definirla e dichiararla dentro un .h ma non inizializzarla, giusto?

    ed aspettare a inizializzarla dentro al .c

    un'altra domanda, devo avere come potete leggere una funzione che mi "crea un tipo di dato" pila ed un altra funzione che me lo gestisce, per far questo l'unico modo che ritengo plausibile eà quello di far ritornare un puntatore alla funzione che crea la pila oppure di prendere un puntatore come parametro ed assegnarle l'array o la struct relativa alla pila, c'ho provato ma alla fine il puntatore punta soltanto al primo elemento dell'array e se provo a scorrerlo accedo a locazioni di memoria non valide o cmq non appropriate, da cosa dipende il mio errore? come posso risolverlo?

  5. #5
    + ke altro xke' il prof mi ha insegnato che ---int a;--- e' sia dichiarazione che definizione (cioe' definisce il tipo e ne alloca la memoria), come divido le due cose nel .h?

  6. #6
    Originariamente inviato da duonovembre
    + ke altro xke' il prof mi ha insegnato che ---int a;--- e' sia dichiarazione che definizione (cioe' definisce il tipo e ne alloca la memoria), come divido le due cose nel .h?
    Ti ho già scritto che formalmente non è sbagliato definire una variabile globale dentro un *.h, a patto che questo *.h sia incluso una sola volta da un solo sorgente *.c del progetto. In questo caso, e solo in questo caso, puoi omettere la dichiarazione e mettere solo la definizione con inizializzazione che ti ho fatto vedere in MyGlobal.c. Sappi però che se quel file viene incluso da un altro sorgent *.c del progetto, allora giustamente il linker (non il compilatore) ti fermerà perché è vietato creare più di una variabile globale con lo stesso nome (non sto parlando di variabili static o const, ma di variabili VERE..).

    Probabilmente, o non hai seguito bene la lezione, oppure siete ancora ad un livello talmente "niubbo", che queste cose le affronterete in futuro.

  7. #7
    più probabili entrambe!

    stasera o domani mi rimetto sotto a sto programmino stupido (+ ke altro per comprendere dove sono necessari gli include e a ke punto)

    ps: e per la parte dei puntatori?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per il problema dei puntatori, dovresti far vedere il codice che hai scritto ...

  9. #9
    diciamo che le ho provate di tutte ma + o - ho scritto cosi':


    codice:
    //la funzione era + o meno cosi'
    
    int stack(int *p){
    DIM = 100; //(definito nel .h)
    
    int arr[DIM];
    
    (qui le versioni sono cambiate in molti modi)
    con per esempio
    
    p = &arr
    return 0;
    }
    nel main passavo un puntatore ad int alla funzione e nn va

    oppure ho provato cosi'
    codice:
    int * stack(){
    DIM = 100;
    int arr[DIM];
    return &arr;
    
    }
    qui invece creavo un puntatore direttamente al risultato della funzione stack

    sicuramente e' sbagliato e quindi: qual'e' la procedura corretta?

    thx

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il fatto e' che non devi usare un array locale e restituirne il puntatore perche' l'array viene distrutto all'uscita e il puntatore non sara' valido.

    Devi allocare dinamicamente (con la malloc) la memoria relativa all'array ...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.