Fehler in der Zuordnung der Mitglied im nur-Lesen-Objekt
Arbeite ich an worm_sim simulater , ubuntu, gcc, codeblocks IDE
traffic_source.h-Datei
class Traffic_source : public Buffer_owner, public Connector, public Addressee{
private:
static unsigned int id_base;
unsigned int id;
unsigned int packet_size;
unsigned int flit_size;
double packet_generating_rate;
int pkt_id;
traffic_source_state ts_state;
double* packet_to_destination_rate;
Traffic_mode traffic_mode;
int period; //period for packet generation using trace_file
ifstream trace_file;
int trace_file_loop_cnt; //how many times we have gone over the trace file so far
bool trace_file_empty;
ofstream trace_dump; //trace file to dump out
typedef struct Message {
int timestamp;
unsigned int destination;
unsigned int size;
} Message, *pMessage;
Message pre_fetched_message;
bool get_next_message(Message & msg);
unsigned int get_destination_uniform(void) const;
unsigned int get_destination_transpose1(void) const;
unsigned int get_destination_transpose2(void) const;
unsigned int get_destination_hotspot(void) const;
unsigned int get_destination_customized(void) const;
void generate_a_packet(unsigned int dst_id);
void generate_packets(const Message & rec);
public:
Traffic_source(Position p, int buf_sz);
~Traffic_source();
bool can_send(void) const;
bool can_receive(void) const { return false; }
bool send(void);
bool receive(class Flit * a_flit) { return false; }
class Connector * get_receiver(void) const;
static void reset_id_base(void) { id_base = 0; }
void tick(void);
/* traffic control routines */
void set_packet_generating_rate(double r);
void set_packet_to_destination_rate(unsigned int dst_id, double rate);
double get_packet_to_destination_rate(unsigned int dst_id) const;
double get_total_packet_injection_rate(void) const;
int set_trace_file(char * file_name);
bool has_trace_file(void) { return (trace_file.is_open()); }
int get_id(void) const { return id; }
};
traffic_source.cpp
Traffic_source::Traffic_source(Position p, int buf_sz) : Buffer_owner(buf_sz), Addressee(p) {
id = id_base ++;
packet_generating_rate = param.packet_generating_rate;
packet_size = param.flits_per_packet;
flit_size = param.flit_size;
traffic_mode = param.traffic_mode;
period = 0;
packet_to_destination_rate = 0;
pkt_id = 0;
ts_state = OFF_
if (param.dump_traffic_source_trace) {
char file_name[20];
sprintf(file_name, "%d.trace", id);
trace_dump.open(file_name);
if (!trace_dump.is_open() || !trace_dump.good()) {
cerr << "Error in opening file " << file_name << " for trace dumping" << endl;
exit(-1);
}
trace_dump << "PERIOD\t" << param.simulation_length << endl;
trace_dump << "#Trace file dumped by worm_sim from node " << id << endl;
trace_dump << "#Folloing lines are with format as:" << endl
<< "#timestamp\t" << "destination\t" << "message_size(bits):" << endl;
}
}
bool Traffic_source::can_send(void) const
{
int router_id=get_id();
unsigned int local_availability;
pRouter a_router= param.network->get_router(router_id);
local_availability=a_router->get_port_availability(0);
//cout<<local_availability<<endl;
if (buffer.is_empty())
return false;
if(local_availability <= 0)
{
packet_generating_rate = 0; //error: assignment of member ‘Traffic_source::packet_generating_rate’ in read-only object|
set_packet_generating_rate(0); //error: passing ‘const Traffic_source’ as ‘this’ argument of ‘void Traffic_source::set_packet_generating_rate(double)’ discards qualifiers [-fpermissive]|
return false;
}
//This is somehow trick, we need to verify whether the first flit in the fifo
//is received right in this clock cycle. If so, we can not send it
const Flit * first_flit = buffer.peek_flit();
if (first_flit->arrived_in_this_cycle())
return false;
pConnector receiver = get_receiver();
if (receiver)
return receiver->can_receive();
else
return false;
}
den Wert packet_generating_rate ist nicht const, aber wenn ich versuche, es zu ändern, entweder direkt oder mit der set-Funktion, die es mir Fehler
packet_generating_rate = 0; //error: assignment of member
‘Traffic_source::packet_generating_rate’ in read-only object|
set_packet_generating_rate(0); //error: passing ‘const Traffic_source’ as ‘this’ argument of ‘void Traffic_source::set_packet_generating_rate(double)’ discards qualifiers [-fpermissive]|
obwohl Sie auf andere Dateien, kein problem, jeder Vorschlag, plz
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere haben schon darauf hingewiesen, das problem ist, dass in einer
const
- Funktion (Letzteconst
in der Zeile) können Sie nicht ändern Sie die Elemente des Objekts. Effektiv die member-Funktion ist übersetzt etwas ähnliches wie:bool Traffic_source__can_send( const Traffic_source* this, void )
gibt es diethis
argument ist ein Zeiger aufconst
. Was wiederum bedeutet, dasspacket_generating_rate
istconst
im Kontext der Funktion.Gibt es drei alternativen, die Sie Folgen können, hier:
const
packet_generating_rate
mutable
Die ersten beiden Optionen sind die gebräuchlichsten: entweder die Funktion ist
const
und nicht das Objekt ändern, oder es ist nichtconst
und können das Objekt ändern. Es gibt Fälle, jedoch, wo Sie wollen zum ändern eines Elements innerhalb einerconst
Mitglied Zeiger. In diesem Fall können Sie mark das Mitglied Erklärung alsmutable
zum aktivieren der änderung innerhalbconst
member-Funktionen.Beachten Sie jedoch, dass dies im Allgemeinen getan wird, wenn die member-variable nehmen nicht Teil an der sichtbar Zustand des Objekts. Zum Beispiel ein
mutex
variable nicht ändern Sie den zurückgegebenen Wert aus einer get-oder der Zustand des Objekts hinterher, aber Getter gesperrt werden müssen (ändern) auf das Objekt zu erhalten, eine konsistente Sicht auf das Objekt in Multithread-Umgebungen. Das zweite typische Beispiel ist ein cache, wo ein Objekt bieten kann eine operation, die teuer ist, zu berechnen, so wird die Funktion der Durchführung, der Betrieb könnte cache das Ergebnis für später. Wieder, ob der Wert berechnet oder zurückgeholt aus dem cache es das gleiche sein wird, also der sichtbare Zustand des Objekts ändert sich nicht. Schließlich, manchmal müssen Sie möglicherweise missbrauchen das Konstrukt zu entsprechen, um eine vorhandene Schnittstelle.Nun ist es an Ihnen zu bestimmen, welche der drei Möglichkeiten anwenden, um Ihr design. Wenn Sie müssen, ändern Sie den Element-Attribut, dann ist entweder das Element ist ein Teil der sichtbaren Zustand und die Funktion sollte nicht
const
, sonst ist es nicht Teil des Staates, der das Objekt und markiert werden könnenmutable
.dieser Erklärungen stellt sich
this
in einen Zeiger auf eineconst
. Kennzeichnet eine Methode alsconst
macht die Instanz unveränderlich, so dass Sie nicht ändern können Ihre Mitglieder.Warum hast du dann markieren Sie es als
const
in den ersten Platz, wenn du gehst, um die ändern Mitglieder?Auch, mir scheint es, dass
can_send
hat get-Semantik, so logisch es sollte nicht ändern Sie die Mitglieder (ich denke der Fehler ist hier, dass Sie versuchen, das zu ändernpacket_generating_rate
, nicht die Methodeconst
.Es verwendet wird, im inneren eine Konstante Funktion. Im Konstanten-Funktion können Sie nicht ändern Sie den Wert von Daten, die member des Objekts, auf dem die Funktion aufgerufen wurde.
Einen const-member-Funktion wie diese
nicht zulässig ist, ändern, alle Membervariablen der Klasse. So ändern Sie eine member-variable innerhalb dieser Funktion, das ist, warum Sie den Fehler. Stellen Sie die Funktion non-const und Ihr nicht diesen Fehler bekommen.