Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Ho inizializzato in una classe Tabella un array bidimensionale bool righe[31][31]; Nel costruttore della classe voglio "riempirlo di zeri". Ho provato così:
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
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.
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ù).
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.
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?
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.
#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.
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é.
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?