Pagina 1 di 2

C++: array bidimensionali in classe

Inviato: lun 17 dic 2007, 15:14
da Spiros
Ho inizializzato in una classe Tabella un array bidimensionale bool righe[31][31]; Nel costruttore della classe voglio "riempirlo di zeri". Ho provato così:

Codice: Seleziona tutto

Tabella::Tabella ()
{
	for (bool* r = this -> righe; r < this -> righe + 961; ++r){
		*r = 0;
	}
}
Ma non va. L'errore è:

Codice: Seleziona tutto

Tabella.cpp: In constructor ‘Tabella::Tabella()’:
Tabella.cpp:6: error: cannot convert ‘bool (*)[31]’ to ‘bool*’ in initialization
Tabella.cpp:6: error: comparison between distinct pointer types ‘bool*’ and ‘bool (*)[31]’ lacks a cast
Sbaglio a difinire il puntetore r?

Ho proato anche con:

Codice: Seleziona tutto

for (bool* r = *(this -> righe); r < (this -> righe) + 961; ++r)

Inviato: lun 17 dic 2007, 15:32
da simplex
posta l'intera definizione della classe se puoi

Inviato: lun 17 dic 2007, 15:44
da gallows
Usa std::vector invece dei puntatori, in C++ non si programma così.
Poi se è bool potresti anche usare un bitset.

Inviato: lun 17 dic 2007, 15:56
da Spiros
Ma, io ho pensato che per il lavoro che devo fare gli array di C++ sono proprio quello che ci vogliono, anche perché sono così "scarni". I puntatori mi piacciono, non sento il bisogno di avere cose più elaborate per questo tipo di lavoro.

Ho risolto così:

Codice: Seleziona tutto

Tabella::Tabella ()
{
	for (bool* r = *this -> righe; r < *(this -> righe) + 961; ++r){
		*r = 0;
	}
}

Inviato: lun 17 dic 2007, 16:06
da puzuma
il tuo codice è più C che C++, quelli che usi sono array così scarni che sono array di C. Se vuoi usare tutte le features del C++ varebbe la pena di dare una letta a un po' di reference della STL e usare una classe già pronta come segnalato in altro post.

Se poi vuoi davvero un approccio a basso livello ti conviene seguire il consiglio di gallows e usare un bitset, così facendo useresti un ottavo della memoria (alpiù).

Inviato: lun 17 dic 2007, 16:07
da gallows
Allora dovresti usare il C. È solo un consiglio, poi (come è giusto che sia) puoi fare ciò che preferisci, ma usare il C++ come "C con classi" è considerato quasi all'unanimità cattiva programmazione.

Inviato: lun 17 dic 2007, 17:31
da nuitari
Quoto in toto, in C++ si fa altro per gli array, fermo restando che una delle cose belle del C++ è che è un sovrainsieme del C.

comunque, è + veloce così

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>

using namespace std;

#define ROWS 10
#define COLS 10

class prova {
        public:

        int array[ROWS][COLS];

        prova(void)
        {
                memset(this->array, 0x0, sizeof(this->array));
        }
};

int main(void)
{
        prova pippo;
        printf("%d\n", pippo.array[0][0]);
        return 0;
}

Inviato: lun 17 dic 2007, 17:52
da gallows
Io farei così:

Codice: Seleziona tutto

#include <cstdio>
#include <bitset>

class Fred {
public:
    Fred() { }
    virtual ~Fred() { }                                                                                                                                                       
    
    void show() const
    {
        for (int i=0; i<m_rows; i++) {
            for (int j=0; j<m_cols; j++)
                std::printf("%d ", m_data[m_cols * i + j]);

            std::putchar('\n');
        }
    }

protected:
    static const int m_rows = 4;
    static const int m_cols = 4;

    std::bitset<m_rows*m_cols> m_data;

};

int main()
{
    Fred().show();
}

Inviato: lun 17 dic 2007, 19:06
da Spiros
Capisco.
La STL la conosco, più o meno. So che cosa sono vettori, liste, iteratori etc., ma gli arrays C e i puntatori mi sembrano più complicati di sicuro, ma anche più accattivanti. E poi a informatica ci fanno lavorare solo con quelli...

Ma è giunto il momento di aprire gli orizzonti. Mi piacerebbe che qualcuno mi consigliasse una referenza più completa per la STL. Che cos'è il bitset?

Inviato: lun 17 dic 2007, 19:55
da gallows
Beh, C++ Programming Language di Stroustrup... ad ogni modo in rete si trovano valanghe di informazioni.:

http://www.cppreference.com/
http://www.cplusplus.com/
http://www.parashift.com/c++-faq-lite/

Ah, dimenticavo: lo std::bitset è sostanzialmente un insieme di bit. Lo puoi utilizzare ad esempio per attivare determinate opzioni in un programma oppure, come nel tuo caso, creare una sorta di array di valori logici.

ps. Sposto in "Libera"

Inviato: mar 18 dic 2007, 10:22
da puzuma
sempre come spunto di riflessione visto che il tuo problema è settare dei valori booleani puoi divertirti a giocare con gli operatori bitwise:

Codice: Seleziona tutto

#include <stdio.h>

int main()
{
    // inizializza il set a  00000000
    char set = 0;
    printf("%x\n", set);

    // imposta il set a 00000001
    set |= 1 << 0;
    printf("%x\n", set);

    // imposta il set a 00000101
    set |= 1 << 2;
    printf("%x\n", set);

    // imposta il set a 00100101
    set |= 1 << 5;
    printf("%x\n", set);

    // imposta il set a 00100001
    set &= ~(1 << 5);
    printf("%x\n", set);

    return 0;
}
è molto più scomodo e illegibile di qualsiasi contenitore di C++ ma intanto impari qualcosa :-)

P.S. molto probabilmente std::bitset è implementato internamente con operazioni simili a queste.

Inviato: mar 18 dic 2007, 10:31
da Spiros
Sono meravigliosi questi bitset!
Grazie mille, gallows, sto spulciando cppreference, poi vedrò anche gli altri. Sai, sono abituato all'autodocumentazione implementata in Python, con cui si arriva a conoscere tutto quanto sia già incluso nel linguaggio tramite le sue funzioni. Con c++ ero un po' sperduto. Ho guardato qualcosa qua e là, ma non ho mai trovato un granché.

Inviato: mar 18 dic 2007, 11:08
da Spiros
Ok, un'utlima domanda, con cui però esco un po' dal seminato: la "compilazione separata" come funziona? Da quanto ho capito se ho, per esempio, una classe di nome tabella, inserisco in un file tabella.h ("header") la sola dichiarazione della classe e dei metodi, nel file tabella.cpp la vera e propria definizione e nel file con il programma vero e proprio (ossia con la funziona main) un semplice #include "tabella.h".
Poi non devo far altro che compilare separatamente il programma e il file tabella.cpp e unire i file (ad esempio con cat). Giusto?

Inviato: mar 18 dic 2007, 13:53
da gallows
Se ad esempio il tuo programma è strutturato così:

main.cc
tabella.h
tabella.cc

dai:

g++ -c main.cc
g++ -c tabella.cc
g++ tabella.o main.o

Ti consiglio comunque di imparare a scrivere i Makefile.

Inviato: mar 18 dic 2007, 15:39
da Spiros
gallows ha scritto: Ti consiglio comunque di imparare a scrivere i Makefile.
Appunto. Quelli in linea di massima li so fare. Mi serviva quest'informazione per farne uno decente.

Come vedete ho un'infarinatura generale di tutto... :roll: