Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [C++] - Errore di compilazione.. ma dove?

    Salve a tutti, come da titolo, ho per la prima volta cercato di fare una misera compilazione di qualche riga di codice in C++, sono giusto tre files per implementare l'utilizzo di uno stack, giusto per capire come funziona il lingiuaggio.
    La compilazione fatta "a mano" cioè

    codice:
    g++ -c nomefile.cpp
    va a buon fine, ma quando successivamente tento di creare l'eseguibile,

    codice:
    g++ -o nomefile.exe nomefile.o
    , ricevo degli errori che, per via dell'inesperienza non riesco a comprendere.

    Di seguito allego i files:


    codice:
    Nome Fie: stack.h
    
    
    #ifndef _STACK_H
    
    
    #define _STACK_H 1
    
    
    
    
    
    
    
    
    template<class T> class Stack {
    
    
    	T* v;
    
    
    	static const int max_size = 100;
    
    
    	int stack_size;
    
    
    	int top;
    
    
    public:
    
    
    	class StackOverflow { };
    
    
    	class StackUnderflow { };
    
    
    	class StackBadSize { };
    
    
    
    
    
    	Stack(int size);
    
    
    	~Stack();	
    
    
    
    
    
    	void push(T element);
    
    
    	T pop();
    
    
    	bool isFull();
    
    
    	bool isEmpty();
    
    
    	int slotsFree();
    
    
    };
    
    
    
    
    
    #endif



    codice:
    Nome Fie: stack.cpp
    
    
    #include "stack.h"
    
    
    
    
    
    template<class T> Stack<T>::Stack(int size) {	// (costruttore)
    
    
    	
    
    
    	if(size > 0 && size < max_size) {	// se il valore della size è corretto
    
    
    		stack_size = size;
    
    
    		v = new T[stack_size];		// alloca spazio nella memoria dinamica (heap)
    
    
    		top = 0;			// inizializza la testa dello stack a 0	
    
    
    	
    
    
    	} else {				// altrimenti
    
    
    		throw StackBadSize();		// lancia l'eccezione
    
    
    	}
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    template<class T> Stack<T>::~Stack() {		// (distruttore)
    
    
    
    
    
    	delete[] v;				// dealloca lo spazio di memoria utilizzato
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    template<class T> void Stack<T>::push(T el) {	// (metodo di inserimento)
    
    
    	
    
    
    	if(top == stack_size) {			// se la testa è oltre la dimensione dello stack
    
    
    		throw StackOverflow();		// lancia l'eccezione di overflow
    
    
    
    
    
    	} else {				// altriemnti 
    
    
    		v[top] = el;			// inserisco l'elemento nello stack
    
    
    		top++;				// incremento top
    
    
    
    
    
    		
    
    
    	}
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    template<class T> T Stack<T>::pop() {		// (metodo di estrazione)
    
    
    
    
    
    	if(top == 0) {				// se la testa è già minore di 0
    
    
    		throw StackUnderflow();		// lancia l'eccezione
    
    
    
    
    
    	} else {				// altrimenti
    
    
    		top--;				// decremento la testa dello stack
    
    
    		return v[top];			// restituisco l'ultimo valore inserito 
    
    
    		
    
    
    	}
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    template<class T> bool Stack<T>::isFull() {	// (metodo per capire se lo stack è pieno)
    
    
    
    
    
    	if(top == stack_size) {			// se la testa ha lo stesso valore della massima size dello stack
    
    
    		return true;			// lo stack è pieno
    
    
    
    
    
    	} else {				// altrimenti
    
    
    		return false;			// non è pieno
    
    
    	}
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    template<class T> bool Stack<T>::isEmpty() {	// (metodo per capire se lo stack è pieno)
    
    
    
    
    
    	if(top = 0) {				// se la testa ha valore 0
    
    
    		return true;			// lo stack è vuoto
    
    
    
    
    
    	} else {				// altrimenti
    
    
    		return false;			// non è vuoto
    
    
    	}
    
    
    
    
    
    }







    codice:
    Nome Fie: prova_stack.cpp
    
    
    #include <iostream>
    
    
    #include "stack.h"
    
    
    #include <string>
    
    
    
    
    
    using namespace std;
    
    
    
    
    
    int main() {
    
    
    
    
    
    cout << "La parola che verrà inserita e: Rosa.\n";
    
    
    
    
    
    
    
    
    Stack<char> pila(7);
    
    
    string str;
    
    
    
    
    
    pila.push('a');
    
    
    pila.push('s');
    
    
    pila.push('o');
    
    
    pila.push('R');
    
    
    
    
    
    str = pila.pop() + pila.pop() + pila.pop() + pila.pop();
    
    
    
    
    
    cout << "La parola inserita è:" << str << ".\n";
    
    
    
    
    
    }


    Questo è l'errore che ricevo:


    codice:
    D:\MinGW\bin>g++ -o prova_stack.exe prova_stack.o
    
    
    prova_stack.o(.text+0xc3):prova_stack.cpp: undefined reference to `Stack<char>::Stack(int)'
    
    
    prova_stack.o(.text+0xf1):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'
    
    
    prova_stack.o(.text+0x102):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'
    
    
    prova_stack.o(.text+0x113):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'
    
    
    prova_stack.o(.text+0x124):prova_stack.cpp: undefined reference to `Stack<char>::push(char)'
    
    
    prova_stack.o(.text+0x136):prova_stack.cpp: undefined reference to `Stack<char>::pop()'
    
    
    prova_stack.o(.text+0x14b):prova_stack.cpp: undefined reference to `Stack<char>::pop()'
    
    
    prova_stack.o(.text+0x168):prova_stack.cpp: undefined reference to `Stack<char>::pop()'
    
    
    prova_stack.o(.text+0x185):prova_stack.cpp: undefined reference to `Stack<char>::pop()'
    
    
    prova_stack.o(.text+0x321):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()'
    
    
    prova_stack.o(.text+0x358):prova_stack.cpp: undefined reference to `Stack<char>::~Stack()'


    Confido in voi per riuscire a capire dove è che sbaglio... anche se più o meno ho capito, non riesco a risolverlo, forse è dovuto al fatto che vengo da una formazione "java"

  2. #2
    ciao

    in c++ non c'è la concatenazione di stringhe, o meglio, non c'è già fatta, dovresti fare l'overriding del metodo + per la classe...inoltre i cast di fanno con (var) e non <>
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  3. #3
    uhm... vediamo se ho captio che intendi...

    una istruzione del tipo:
    codice:
     str = "stringa uno " + "stringa 2";
    non è permessa?

    Con l'istruzione:
    codice:
    Stack<char> pila(7);
    non intendevo fare un cast, ma indicare che dentro il contenitore Stack ci sono caratteri.

    Ora provo cmq a cambiare in
    codice:
    Stack(char)
    Ti faccio sapere grazie

  4. #4
    Questo è il nuovo main:

    codice:
    #include <iostream>
    #include "Pila.h"
    #include <string>
    
    using namespace std;
    
    int main() {
    string str;
    
    cout << "La parola che verrà inserita e: Rosa.\n";
    
    
    Pila<char> p(7);
    
    p.push('a');
    p.push('s');
    p.push('o');
    p.push('R');
     
    str.append(p.pop());
    str.append(p.pop());
    str.append(p.pop());
    str.append(p.pop());
    
    cout << "La parola inserita è:" << str << ".\n";
    
    }
    e questo è il nuovo errore

    codice:
    J:\eclipse\workspace\Pila\main.cpp:18: error: invalid conversion from `char' to `char*'
    J:\eclipse\workspace\Pila\main.cpp:18: error:   initializing argument 1 of `void Pila<T>::push(T) [with T = char*]'
    J:\eclipse\workspace\Pila\main.cpp:19: error: invalid conversion from `char' to `char*'
    J:\eclipse\workspace\Pila\main.cpp:19: error:   initializing argument 1 of `void Pila<T>::push(T) [with T = char*]'
    J:\eclipse\workspace\Pila\main.cpp:20: error: invalid conversion from `char' to `char*'
    J:\eclipse\workspace\Pila\main.cpp:20: error:   initializing argument 1 of `void Pila<T>::push(T) [with T = char*]'
    J:\eclipse\workspace\Pila\main.cpp:21: error: invalid conversion from `char' to `char*'
    J:\eclipse\workspace\Pila\main.cpp:21: error:   initializing argument 1 of `void Pila<T>::push(T) [with T = char*]'
    Aiuto...

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ci sono un paio d'errori! Questo è il main funzionante:
    codice:
    #include <iostream>
    #include "stack.cpp"
    #include <string>
    
    using namespace std;
    
    int main() {
    string str;
    char *uno;
    uno = (char*) malloc(sizeof(char));
    cout << "La parola che verrà inserita e: Rosa.\n";
    
    
    Stack<char> p(7);
    
    p.push('a');
    p.push('s');
    p.push('o');
    p.push('R');
    
    *uno = p.pop();
    str.append(uno);
    *uno = p.pop();
    str.append(uno);
    *uno = p.pop();
    str.append(uno);
    *uno = p.pop();
    str.append(uno);
    
    cout << "La parola inserita è:" << str << ".\n";
    
    }
    Il metodo append non vuole un carattere come argomento, ma un puntatore a carattere (ossia una stringa C), quindi devi creare un puntatore a carattere e assegnare alla locazione da esso puntata il nuovo carattere che, di volta in volta, verrà estratto dalla pila.

    Poi c'è un piccolissimo errore nel file Stack.cpp: nel metodo isEmpty() avevi effettuato il confronto utilizzando l'operatore =, al posto dell'operatore == (distrazione, probabilmente). Poi ho modificato il corpo dei metodi isEmpty() e isFull(), così sono stilisticamente migliori: non ha senso ritornare TRUE se un confronto è TRUE e FALSE quando invece risulta FALSE... tanto vale ritornare, direttamente, il valore del confronto!
    codice:
    template<class T> bool Stack<T>::isFull() {	// (metodo per capire se lo stack è pieno)
    	return (top == stack_size);
    }
    
    template<class T> bool Stack<T>::isEmpty() {	// (metodo per capire se lo stack è pieno)
    	return (top == 0);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Attenzione che se 'uno' deve essere una stringa come sono definite in C, deve essere un array di caratteri concluso dal carattere nullo '\0', quindi bisogna allocare almeno due posizioni e impostare la seconda a '\0'; inosltre per appendere un array di carattere a una string si puo usare l'operatore + :

    string s = "ciao";
    s = s + "a tutti";


    l'operatore + non puo essere usato per concatenare due array di carattere, ma va bene per concatenare una string con array di carattere.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  7. #7
    X LeleFT

    Grazie della delucidazione

    Usare la malloc in C++ non è sconsigliato?
    L' operatore
    codice:
    new
    non dovrebbe essere ottimizzato?


    X anx721

    Uhm... non ho capito... che differenza c'è tra quello che hai scritto tu, e il primo main che ho postato io.
    Potesti essere più chiaro?
    Ggrazie per l'interessamento

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Originariamente inviato da Enumaelish
    X anx721

    Uhm... non ho capito... che differenza c'è tra quello che hai scritto tu, e il primo main che ho postato io.
    Potesti essere più chiaro?
    Ggrazie per l'interessamento
    in riferimento a che?

    io rispondevo solo al fatto che

    str = "stringa uno " + "stringa 2";

    non è permessa, mentre

    str = str + "stringa uno ";

    lo è

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  9. #9
    Ah.. ho capito grazie
    Mi devo un po' riabituare alle nominazioni C, ho perso l'abitudine con i puntatori, per colpa di Java

    E questa è permessa?

    <code>str += "carattere uno"; </code>

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    si

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

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.