|
|
|
|
|
What about documentation [^]?
BTW: you possibly need conversion to wchar_t * (not to char * ).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hi, thanks for replying
I've looked through that before, but it doesn't seem to touch on much about my case though. Yeah, wchar_t* seems more convenient, but I'm actually linking these to other DLL files, and the only input type to those is const char*, this I can't change. You have any idea about this conversion code?
|
|
|
|
|
rukawa84 wrote: wchar_t* seems more convenient, but I'm actually linking these to other DLL files, and the only input type to those is const char*, this I can't change. You have any idea about this conversion code?
If the DLL 's functions accept only ASCII strings you're lost: how can you pass Chinese characters?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Hmm, sorry I'm not too good in this area. You mean const char* type can only store ASCII? I've tried like declaring const char* variables, initialised them to some chinese words and sent them in and it works fine. I'm not sure how the other DLL works as it's not created by me, but if I find a way to convert the jstring input to char*, I'm sure it'll work out.
|
|
|
|
|
This page [^] has some examples.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks for the link, I'll take a look and try again.
|
|
|
|
|
Hi all,
I need a help relatd to removing the part of string
std::string bDesc ="hi how(Temp) are(Temp) you.i am(Temp) Great"
int p=bDesc.find("(",0);
int j=bDesc.find(")",0);
if(p>0 && j>0)
{
bDesc.erase(p,j);
}
from above string i want to remove (Temp) but i am able to remove only once .. do i need to loop through each character.....
can some body help me...
vikas da
|
|
|
|
|
You missed loop.
Regards,
Paresh.
|
|
|
|
|
I know what i want here ...do i need to loops through each character....
or any other efficient and faster way exists...
vikas da
|
|
|
|
|
Is it possible to use MFC? In that case, you can use CString::Replace()[^] and get them replaced in one function call.
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|
Jijo raj wrote: Is it possible to use MFC?
Possible but not advisable (MFC is deprecated ).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
std::string bDesc ="hi how(Temp) are(Temp) you.i am(Temp) Great";
std::string bToken = "(Temp)";
size_t len = bToken.length();
size_t pos = 0;
while (( pos = bDesc.find(bToken,pos)) != std::string::npos)
{
bDesc.erase(pos,len);
}
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks everybody ...
i have Implimented ..Pallini code... its working good for me..
earlier i looped through each character of the string thats was tough
Token concept is good..
Thank Pallini
vikas da
|
|
|
|
|
when you have a method prototype as such:
<code>
void setCacheBlocks(vector<cacheblock> const &value);
</cacheblock></code>
and an implementation as such:
<code>
void Simulator::setCacheBlocks(vector<cacheblock> const & value)
{
m_CacheBlock = value;
}
</cacheblock></code>
And when you run the code, the size of items in the vector is correct, but the actual contents of each object contained by the vector magically disappears?
here's what's actually happening (keep in mind this is a mutation of several generations)
<code>
void Simulator::Simulate()
{
Splash();
getUserSettings();
cout.clear();
cout << "Reading trace file..." << endl;
GetData();
sleep(2);
cout << "\nData read.\nStarting Simulation..." << endl;
sleep(1);
// simulation start
//create the data blocks and the cache sets
//create the Cache Blocks
CreateCacheBlocks();
//create the Cache Sets
CreateCacheSets();
}
void Simulator::CreateCacheBlocks()
{
uint numBlocks = getSettings().getCacheSize()/getSettings().getBlocksSize();
uint maxOffset = getSettings().getOffsetParity();
uint bTag = getSettings().getTagParity();
uint bIndex = getSettings().getIndexParity();
bool isValid = false;
char* bData = new char[maxOffset - 1]; //just to make it 0 based
for(int i = 0; i < maxOffset; i++)
{
bData[i] = NULL;
}
vector<cacheblock> v;
CacheBlock cb;
cb.Initialize(maxOffset,bTag,bIndex,isValid,bData);
cb.setSettings(m_Settings);
//initialize each cache block to an initial state
for(uint i = 0; i < numBlocks; i++)
{
cb.setBlockNumber(i);
cb.setBlockAddress(cb.CalculateBlockAddress(i));
v.push_back(cb);
}
//TODO: fix this ASAP
//setCacheBlocks(v);
m_CacheBlock = v;
}
void Simulator::CreateCacheSets()
{
uint numBlocks = getSettings().getCacheSize()/getSettings().getBlocksSize();
uint numSets = numBlocks/getSettings().getCacheAssociativity();
uint numBlocksPerSet = numBlocks / numSets;
CacheSet cs;
cs.setSettings(getSettings());
vector<cacheset> v;
//create the correct number of sets and assign their set indexes
for(uint i = 0; i < numSets; i++)
{
cs.setSetIndex(i);
v.push_back(cs);
}
int k = v.size();
CacheBlock cb;
//assign each cache block to its set
uint setIx = 0;
for(uint i = 0; i < numBlocks; i++)
{
setIx = getCacheBlocks()[i].getBlockAddress() << getSettings().getTagParity();
setIx >>= getSettings().getTagParity();
//cb = getCacheBlocks()[i];
cb = m_CacheBlock[i]; //this statement should be exactly like the preceding one in worth
v[setIx].getCacheBlocks().push_back(cb);
}
setCacheSet(v);
}
</cacheset></cacheblock></code>
If you look to the method Simulate, everything works fine, including CreateCacheBlocks(), but things go belly up in CreateCacheSets().
Yes, I know I shouldn't be using getXX()/setXX() but this is the second time I've had to deal with this Prof and he's old and really old school and doesn't want to get with the times of using overloaded methods.
Don't forget to vote if the response was helpful
Sig history
"dad" Ishmail-Samuel Mustafa
Unix is a Four Letter Word, and Vi is a Two Letter Abbreviation
"There is no wealth like knowledge, no poverty like ignorance" Ali Ibn Abi Talib
|
|
|
|
|
Your post is very difficult to read (don't check the "ignore html tags" otherwise the code tags won't work).
You are talking about danling pointers. Where are those pointers because I don't see any pointers in your code...
Mustafa Ismail Mustafa wrote: And when you run the code, the size of items in the vector is correct, but the actual contents of each object contained by the vector magically disappears?
Could you explain that with a bit more details ? You mean that the contents of all the cacheblock objects stored in your vector are destroyed ? Can you show the details of the cacheblock class ?
|
|
|
|
|
Cedric Moonen wrote: Your post is very difficult to read (don't check the "ignore html tags" otherwise the code tags won't work).
Stuff like vector<xyz> v aren't obvious then.
I assumed there are dangling pointers because the objects have values that are not what they were so its like a temporary value that has disappeared.
Cedric Moonen wrote: Could you explain that with a bit more details ? You mean that the contents of all the cacheblock objects stored in your vector are destroyed ? Can you show the details of the cacheblock class ?
Precisely.
I'll email them since they're on my Linux VM and for some reason, the bidirectional clipboard just stopped working.
|
|
|
|
|
Mustafa Ismail Mustafa wrote: Stuff like vector<xyz> v aren't obvious then
It's not too difficult to use < and > instead - you're more likely to get an answer if your question's nicely formatted, if only because then people can read it
Mustafa Ismail Mustafa wrote: I assumed there are dangling pointers because the objects have values that are not what they were so its like a temporary value that has disappeared.
You have no explicit pointers in your code. It's more likely that you have a dangling reference - possibly a reference to a local that disappeared when a function completed?
I presume you've stepped through with the debugger, seeing when the values of the objects change? Setting a data breakpoint can help.
|
|
|
|
|
Stuart Dootson wrote: It's not too difficult to use < and > instead - you're more likely to get an answer if your question's nicely formatted, if only because then people can read it
I did that in the following two postings back to Cedric. I was being lazy I suppose.
Stuart Dootson wrote: You have no explicit pointers in your code. It's more likely that you have a dangling reference - possibly a reference to a local that disappeared when a function completed?
Aha! Live and re-learn.
Stuart Dootson wrote: I presume you've stepped through with the debugger, seeing when the values of the objects change? Setting a data breakpoint can help.
Certainly. I program in C# and previously Java. The last time I touched C++ was almost 8 years ago, coupled with what I believe is an extremely lacking IDE (netbeans 6.5) on Linux is proving a pain. Gimme Eclipse or VS any day. This is why I seem to be asking really pathetically sounding questions
I come and post after I've given up and then its a matter of re-learning.
|
|
|
|
|
Looking at your code, m_Settings and m_BlockData in CacheBlock are certainly iffy. You copy pointers to these items, but I suspect you should really copy the contents. Especially when (from the Simulator::CreateCacheBlocks code) it looks like all your cache-blocks will be sharing the same block data with your current implementation.
Memory management in C++ certainly can be a pain - that's why I try to always use objects that manage it for you, such as std::vector s or Boost shared pointers/shared arrays[^].
|
|
|
|
|
Sorry about the lateness, I had to run out for a few errands.
Sadly Stuart, those are the two I'm not having problems with. Its the rest of the class.
If you'll look below, that's where all the fuss is happening.
I'd like to direct your kind attention to the methods CreateCacheBlocks() and CreateCacheSets() in particular the latter. It is then that the contents of the CacheBlock object retrieved by getCacheBlocks()[i] is incorrect and that is where I'm losing my mind because it was in the preceding function CreateCacheBlocks() that I set the values (correctly I might add).
If you're wondering what this is, its the framework for a cache simulator for my Computer Arch II class at university where after I'm supposed to be simulating different algorithms and trying to make them better through changing one thing or another.
<br />
#ifndef _SIMULATOR_H<br />
#define _SIMULATOR_H<br />
<br />
<br />
#define DEBUG<br />
<br />
#include <iostream><br />
#include <vector><br />
#include "definitions.h"<br />
#include "settings.h"<br />
#include "filereader.h"<br />
#include "cacheset.h"<br />
#include "cacheblock.h"<br />
<br />
<br />
using namespace std;<br />
<br />
class Simulator<br />
{<br />
<br />
public:<br />
Simulator();<br />
Simulator(const Simulator& orig);<br />
virtual ~Simulator();<br />
<br />
void getUserSettings();<br />
void GetData();<br />
void Simulate();<br />
void Splash();<br />
<br />
void CreateCacheBlocks();<br />
void CreateCacheSets();<br />
<br />
<br />
Settings getSettings() const;<br />
void setSettings(Settings const &value);<br />
<br />
<br />
<br />
vector<CacheSet> getCacheSet() const;<br />
void setCacheSet(vector<CacheSet> const &value);<br />
<br />
<br />
vector<CacheBlock> getCacheBlocks() const;<br />
void setCacheBlocks(vector<CacheBlock> const &value);<br />
<br />
<br />
vector<uint> getDataBuffer() const;<br />
void setDataBuffer(vector<uint> const &value);<br />
<br />
private:<br />
Settings m_Settings;;<br />
vector<CacheBlock> m_CacheBlock;<br />
vector<CacheSet> m_CacheSet;<br />
vector<uint> m_DataBuffer;<br />
<br />
};<br />
<br />
#endif /* _SIMULATOR_H */<br />
</vector></iostream>
***********************************************
<br />
#include "simulator.h"<br />
#include <vector><br />
#include "cacheset.h"<br />
<br />
<br />
Simulator::Simulator()<br />
{<br />
m_Settings.setAccessesToSimulate(0);<br />
m_Settings.setBlockSize(0);<br />
m_Settings.setCacheAssociativity(0);<br />
m_Settings.setCachePolicy(Settings::LRU);<br />
m_Settings.setCacheSize(0);<br />
}<br />
<br />
Simulator::Simulator(const Simulator& orig)<br />
{<br />
}<br />
<br />
Simulator::~Simulator()<br />
{<br />
}<br />
<br />
<br />
<br />
void Simulator::getUserSettings()<br />
{<br />
#ifdef DEBUG<br />
Settings s;<br />
s.setDefault();<br />
setSettings(s);<br />
<br />
return;<br />
#endif<br />
<br />
<br />
}<br />
<br />
void Simulator::GetData()<br />
{<br />
FileReader fr;<br />
Settings s;<br />
s = getSettings();<br />
setDataBuffer(fr.ReadFile(s));<br />
<br />
}<br />
<br />
<br />
void Simulator::Simulate()<br />
{<br />
Splash();<br />
<br />
getUserSettings();<br />
<br />
cout.clear();<br />
cout << "Reading trace file..." << endl;<br />
<br />
GetData();<br />
sleep(2);<br />
<br />
cout << "\nData read.\nStarting Simulation..." << endl;<br />
sleep(1);<br />
<br />
<br />
<br />
CreateCacheBlocks();<br />
<br />
CreateCacheSets();<br />
<br />
}<br />
<br />
void Simulator::CreateCacheBlocks()<br />
{<br />
<br />
uint numBlocks = getSettings().getCacheSize()/getSettings().getBlocksSize();<br />
<br />
<br />
<br />
uint maxOffset = getSettings().getOffsetParity();<br />
uint bTag = getSettings().getTagParity();<br />
uint bIndex = getSettings().getIndexParity();<br />
bool isValid = false;<br />
char* bData = new char[maxOffset - 1];
for(int i = 0; i < maxOffset; i++)<br />
{<br />
bData[i] = NULL;<br />
}<br />
<br />
<br />
vector<CacheBlock> v;<br />
<br />
CacheBlock cb;<br />
cb.Initialize(maxOffset,bTag,bIndex,isValid,bData);<br />
<br />
cb.setSettings(m_Settings);<br />
for(uint i = 0; i < numBlocks; i++)<br />
{<br />
cb.setBlockNumber(i);<br />
cb.setBlockAddress(cb.CalculateBlockAddress(i));<br />
v.push_back(cb);<br />
}<br />
setCacheBlocks(v);<br />
<br />
#ifdef DEBUG<br />
cout << "\n\n" << endl;<br />
cout << "Vector Length: \t" << getCacheBlocks().size() << endl;<br />
<br />
cout << "\n\n" << endl;<br />
<br />
for(int i = 0; i < getCacheBlocks().size(); i++)<br />
{<br />
cout << "v[" << i << "].BlockAddress = \t" << v[i].getBlockAddress() << endl;<br />
}<br />
#endif<br />
}<br />
<br />
void Simulator::CreateCacheSets()<br />
{<br />
<br />
<br />
uint numBlocks = getSettings().getCacheSize()/getSettings().getBlocksSize();<br />
uint numSets = numBlocks/getSettings().getCacheAssociativity();<br />
<br />
uint numBlocksPerSet = numBlocks / numSets;<br />
<br />
<br />
CacheSet cs;<br />
cs.setSettings(getSettings());<br />
vector<CacheSet> v;<br />
<br />
for(uint i = 0; i < numSets; i++)<br />
{<br />
cs.setSetIndex(i);<br />
v.push_back(cs);<br />
}<br />
<br />
int k = v.size();<br />
CacheBlock cb;<br />
<br />
uint setIx = 0;<br />
for(uint i = 0; i < numBlocks; i++)<br />
{<br />
<br />
setIx = getCacheBlocks()[i].getBlockAddress() << getSettings().getTagParity();<br />
setIx >>= getSettings().getTagParity();<br />
cb = m_CacheBlock[i];<br />
v[setIx].getCacheBlocks().push_back(cb);<br />
}<br />
<br />
#ifdef DEBUG<br />
int j = v.size();<br />
<br />
for(int i = 0; i < v.size(); i++)<br />
{<br />
j = v[i].getCacheBlocks().size();<br />
cout << "V[i][j].size() =" << j << endl;<br />
}<br />
#endif<br />
<br />
setCacheSet(v);<br />
<br />
#ifdef DEBUG<br />
<br />
cout << "\n" << endl;<br />
cout << "Number of Sets:\t\t" << v.size() << endl;<br />
cout << "Number of blocks in each set:\t" <<<br />
v[0].getCacheBlocks().size() << endl;<br />
cout << "\n" << endl;<br />
for(int i = 0; i < v.size(); i++)<br />
{<br />
cout << "Cache set:\t" << i << endl;<br />
cout << "\n" << endl;<br />
for(int j = 0; j < v[i].getCacheBlocks().size(); j++)<br />
{<br />
cout << "Block number " << j << "\tBlock Address: " << v[i].getCacheBlocks()[i].getBlockAddress();<br />
}<br />
cout << "\n" << endl;<br />
}<br />
#endif<br />
<br />
}<br />
<br />
<br />
<br />
void Simulator::Splash()<br />
{<br />
cout.clear();<br />
<br />
cout << "Starting Cache Simulation by Steve Mustafa\n\n" << endl;<br />
cout << "Supervisor: Dr. Mazen Kharbutli\nComputer Architecture II\n" << endl;<br />
<br />
sleep(5);<br />
}<br />
<br />
<br />
<br />
<br />
Settings Simulator::getSettings() const<br />
{<br />
return m_Settings;<br />
}<br />
<br />
<br />
void Simulator::setSettings(Settings const &value)<br />
{<br />
m_Settings = value;<br />
}<br />
<br />
<br />
vector<CacheSet> Simulator::getCacheSet() const<br />
{<br />
return m_CacheSet;<br />
}<br />
<br />
void Simulator::setCacheSet(vector<CacheSet>const &value)<br />
{<br />
<br />
int j = m_CacheSet.size();<br />
m_CacheSet = value;<br />
j = m_CacheSet.size();<br />
j = getCacheSet().size();<br />
}<br />
<br />
<br />
vector<CacheBlock> Simulator::getCacheBlocks() const<br />
{<br />
return m_CacheBlock;<br />
}<br />
<br />
void Simulator::setCacheBlocks(vector<CacheBlock> const & value)<br />
{<br />
m_CacheBlock = value;<br />
int j = m_CacheBlock.size();<br />
j = getCacheBlocks().size();<br />
}<br />
<br />
<br />
vector<uint> Simulator::getDataBuffer() const<br />
{<br />
return m_DataBuffer;<br />
}<br />
<br />
void Simulator::setDataBuffer(vector<uint> const &value)<br />
{<br />
m_DataBuffer = value;<br />
}<br />
|
|
|
|
|
I'm a f**king idiot. I've built your code and stepped through it with GDB (well, Xcode on my Mac) and just realised what the problem is, when it should have been immediately obvious.
The trouble is your copy constructors - they're not doing anything! Which means that as they're used when copying items into a vector using push_back, the vector gets set with empty items.
Anyway - you can rely on the default copy constructor and assignment operator if member-wise copy is adequate for your structure. Member-wise is fine unless you need to do some sort of resource management (e.g. memory allocation/deallocation).
Hope that sorts you out!
|
|
|
|