|
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!
|
|
|
|
|
OK, firstly, Stu, let me just say thank you for being so patient in helping me solve this continuing issue. Your patience is model.
Secondly, I have discovered another problem and I've easily spent 4 hours on it trying to figure out how the hell its happening. Really, in the class "Simulator" even though we have
<br />
vector<cacheset> getCacheSet() const;<br />
void setCacheSet(vector<cacheset> const & value);<br />
<br />
vector<cacheblock> getCacheBlock() const;<br />
void setCacheBlock(vector<cacheblock> const & value);<br />
</cacheblock></cacheblock></cacheset></cacheset>
the actions are local to that subroutine (I'm looking at CreateCacheBlocks() and CreateCacheSets()) and are not acting on the class instance. Ultimately, the question is why? How can I be moving in a proper functional sequence in 2 different instances? What the hell am I forgetting?
I've implemented the copy constructors for the CacheSet and CacheBlock classes as you've suggested and they've alleviated the previous problems, but somehow, I get the feeling that the current issue I'm facing is a continuation of the previous one.
|
|
|
|
|
Mustafa Ismail Mustafa wrote: the actions are local to that subroutine (I'm looking at CreateCacheBlocks() and CreateCacheSets()) and are not acting on the class instance. Ultimately, the question is why? How can I be moving in a proper functional sequence in 2 different instances? What the hell am I forgetting?
Not really sure what you mean - what are you seeing vs what would you expect to see?
|
|
|
|
|
Basically, when I'm calling CreateCacheBlocks() I'm creating a vector of CacheBlock objects, initialized to whatever initial values it should have determined by user input previously acquired in the application (currently simply defaulting it). CreateCacheSets() is supposed to create a number of sets (dependent on the associativity selected) after which, it assigns specific CacheBlocks to each set (basic Cache and Cache Associativity).
What I've noticed is that CreateCacheBlocks() creates the vector and its contents correctly and I've checked this at the end of the method and as soon as I exit the method back to the method Simulate, however, when the call to CreateCacheSets is made, the vector CacheBlocks is empty. How the hell did that happen?
|
|
|
|
|
That still sounds like copy constructor or assignment operator issues - could you post the code for those that you've now implemented?
|
|
|
|
|
Sorry this took some time, my system just crashed and I spent the last hour just restoring order.
Here's the Copy Constructors:
<br />
CacheSet(const CacheSet& orig);
<br />
CacheSet::CacheSet(const CacheSet& orig)
{<br />
setSettings(orig.getSettings());<br />
setBlockCount(orig.getBlockCount());<br />
setBlockSize(orig.getBlockSize());<br />
setSetIndex(orig.getSetIndex());<br />
setCacheBlocks(orig.getCacheBlocks());<br />
}<br />
<br />
CacheBlock(const CacheBlock& orig);
<br />
CacheBlock::CacheBlock(const CacheBlock& orig)
{<br />
setSettings(orig.getSettings());<br />
setBlockAddress(orig.getBlockAddress());<br />
setBlockData(orig.getBlockData());<br />
setBlockIndex(orig.getBlockIndex());<br />
setBlockTag(orig.getBlockTag());<br />
setBlockNumber(orig.getBlockNumber());<br />
setIsValid(orig.getIsValid());<br />
setMaxBlockOffset(orig.getMaxBlockOffset());<br />
setTimeStamp(orig.getTimeStamp());<br />
}<br />
|
|
|
|
|
Mmmm - I'm not seeing what you're seeing - m_CacheBlocks retains its value. However, I've found some more issues in your code:
getCacheBlocks returns the cache-block vector by value - try returning by const reference instead:
vector<CacheBlock> const & getCacheBlocks() const; - Some of your setter functions take a
uint by non-const reference - they should probably be by value (that's fine with plain old data like integers) or const reference. VC++ complained about it, anyway.
|
|
|
|
|
I have taken your advice and currently have given up developing on Linux, I can't make good use of my time using IDEs that I don't have much experience in and on top of that using a language that I obviously am completely out of practice with (MUCH more so than I thought )
I've moved back to Windows (VS2008) at least the debugger is something of an old friend. I'll keep you posted mate.
Thanks a zillion.
|
|
|
|
|
Mustafa Ismail Mustafa wrote: I've moved back to Windows (VS2008) at least the debugger is something of an old friend
Can't say I blame you - even using GDB through Xcode felt...strange, given how used to Visual Studio I am!
|
|
|
|
|
I've pinpointed the exact location where the error takes place.
Guess what? Its a const correctness issue.
Simulator::CreateCacheSets()
{
...
getCacheSets[setIx].getCacheBlocks().push_back(getCacheBlocks()[i]);
...
}
getCacheBlocks() returns a const object. I'm surprised a compile time error was not thrown. Do I overload the method?
[update]
I've fixed it, but its the ugliest hack I've ever done.
<br />
<br />
vector<cacheblock> cbs;<br />
for(uint i = 0; i < numBlocks; i++)<br />
{<br />
ba = getCacheBlocks()[i].getBlockAddress();<br />
setIx = ba % numSets;<br />
cbs = v[setIx].getCacheBlocks();<br />
cbs.push_back(this->getCacheBlocks()[i]);<br />
v[setIx].setCacheBlocks(cbs);<br />
}<br />
</cacheblock>
Just sick and as ugly as sin.
Stuart, thanks a million mate for all your patience. When I do pass by Brittania, an hour's worth of pints is on me
modified on Wednesday, December 17, 2008 12:14 PM
|
|
|
|
|
Mustafa Ismail Mustafa wrote: Do I overload the method
You can't overload purely on return type - in C++ (unlike Ada), function signatures don't include return types.
I may have given you some bad advice suggesting you return by const reference - a non-const reference would be better in this case.
|
|
|
|
|
I won't judge.
It has become so obvious (to me) that I've been living a life of decadence between Java and C#. I need to rough it up. From now on, all University projects will be in C++.
|
|
|
|
|
I realized I don't have your address. I'll email them to myself and post here.
|
|
|
|
|
Here they are:
<br />
CacheBlock:<br />
<br />
<br />
<br />
#ifndef _CACHEBLOCK_H<br />
#define _CACHEBLOCK_H<br />
<br />
#include <time.h><br />
#include "definitions.h"<br />
#include "settings.h"<br />
<br />
using namespace std;<br />
<br />
class CacheBlock<br />
{<br />
<br />
public:<br />
CacheBlock();<br />
CacheBlock(const CacheBlock& orig);<br />
CacheBlock(int maxOffset, uint bTag, uint bIndex,<br />
bool isValid, char* bData);<br />
virtual ~CacheBlock();<br />
<br />
int getMaxBlockOffset() const;<br />
void setMaxBlockOffset(int const &value);<br />
<br />
uint getBlockTag() const;<br />
void setBlockTag(uint &value);<br />
<br />
uint getBlockIndex() const;<br />
void setBlockIndex(uint & value);<br />
<br />
bool getIsValid() const;<br />
void setIsValid(bool const &value);<br />
<br />
char* getBlockData() const;<br />
void setBlockData(char* const &value);<br />
<br />
char getBlockDataItem(int &offset) const;<br />
void setBlockDataItem(int const &offset,char const &value);<br />
<br />
time_t getTimeStamp() const;<br />
void setTimeStamp(time_t const &value);<br />
<br />
void Initialize(int maxOffset, uint bTag,<br />
uint bIndex, bool isValid, char* bData);<br />
<br />
uint getBlockNumber() const;<br />
void setBlockNumber(uint const &value);<br />
<br />
uint getBlockAddress() const;<br />
void setBlockAddress(uint const &value);<br />
<br />
<br />
uint CalculateBlockAddress(uint const &memoryAddress) const;<br />
<br />
Settings* getSettings() const;<br />
void setSettings(Settings &value);<br />
private:<br />
<br />
int m_MaxBlockOffset;<br />
uint m_BlockTag;<br />
uint m_BlockIndex;<br />
char* m_BlockData;<br />
time_t m_Timestamp;<br />
bool m_IsValid;<br />
uint m_BlockNumber;<br />
uint m_BlockAddress;<br />
Settings* m_Settings;<br />
};<br />
<br />
#endif /* _CACHEBLOCK_H */<br />
<br />
<br />
<br />
#include "cacheblock.h"<br />
<br />
CacheBlock::CacheBlock()<br />
{}<br />
<br />
CacheBlock::CacheBlock(const CacheBlock& orig)<br />
{<br />
}<br />
<br />
CacheBlock::CacheBlock(int maxOffset, uint bTag,<br />
uint bIndex, bool isValid, char* bData)<br />
{<br />
setMaxBlockOffset(maxOffset);<br />
setBlockTag(bTag);<br />
setBlockIndex(bIndex);<br />
setIsValid(isValid);<br />
setBlockData(bData);<br />
}<br />
<br />
CacheBlock::~CacheBlock()<br />
{}<br />
<br />
<br />
uint CacheBlock::getBlockIndex() const<br />
{<br />
return m_BlockIndex;<br />
}<br />
<br />
void CacheBlock::setBlockIndex(uint &value )<br />
{<br />
m_BlockIndex = value;<br />
}<br />
<br />
<br />
uint CacheBlock::getBlockTag() const<br />
{<br />
return m_BlockTag;<br />
}<br />
<br />
void CacheBlock::setBlockTag(uint &value)<br />
{<br />
m_BlockTag = value;<br />
}<br />
<br />
<br />
char* CacheBlock::getBlockData() const<br />
{<br />
return m_BlockData;<br />
}<br />
<br />
void CacheBlock::setBlockData(char* const &value)<br />
{<br />
m_BlockData = value;<br />
}<br />
<br />
<br />
bool CacheBlock::getIsValid() const<br />
{<br />
return m_IsValid;<br />
}<br />
<br />
void CacheBlock::setIsValid(bool const &value)<br />
{<br />
m_IsValid = value;<br />
}<br />
<br />
<br />
char CacheBlock::getBlockDataItem(int &offset) const<br />
{<br />
return getBlockData()[offset];<br />
}<br />
<br />
void CacheBlock::setBlockDataItem(int const &offset, char const &value)<br />
{<br />
getBlockData()[offset] = value;<br />
}<br />
<br />
<br />
int CacheBlock::getMaxBlockOffset() const<br />
{<br />
return m_MaxBlockOffset;<br />
}<br />
<br />
void CacheBlock::setMaxBlockOffset(int const &value)<br />
{<br />
m_MaxBlockOffset = value;<br />
}<br />
<br />
<br />
<br />
time_t CacheBlock::getTimeStamp() const<br />
{<br />
return m_Timestamp;<br />
}<br />
<br />
void CacheBlock::setTimeStamp(time_t const &value)<br />
{<br />
m_Timestamp = value;<br />
}<br />
<br />
<br />
void CacheBlock::Initialize(int maxOffset, uint bTag,<br />
uint bIndex, bool isValid, char* bData)<br />
{<br />
setMaxBlockOffset(maxOffset);<br />
setBlockTag(bTag);<br />
setBlockIndex(bIndex);<br />
setIsValid(isValid);<br />
setBlockData(bData);<br />
setTimeStamp(time(0));<br />
}<br />
<br />
<br />
uint CacheBlock::getBlockNumber() const<br />
{<br />
return m_BlockNumber;<br />
}<br />
<br />
void CacheBlock::setBlockNumber(uint const &value)<br />
{<br />
m_BlockNumber = value;<br />
}<br />
<br />
<br />
uint CacheBlock::getBlockAddress() const<br />
{<br />
return m_BlockAddress;<br />
}<br />
<br />
void CacheBlock::setBlockAddress(uint const &value)<br />
{<br />
m_BlockAddress = value;<br />
}<br />
<br />
uint CacheBlock::CalculateBlockAddress(uint const &memoryAddress) const<br />
{<br />
<br />
uint ma = memoryAddress >> getSettings()->getOffsetParity();<br />
return ma;<br />
}<br />
<br />
Settings* CacheBlock::getSettings() const<br />
{<br />
return m_Settings;<br />
}<br />
<br />
void CacheBlock::setSettings(Settings &value)<br />
{<br />
m_Settings = &value;<br />
}<br />
<br />
<br />
CacheSet:<br />
<br />
<br />
<br />
#ifndef _CACHESET_H<br />
#define _CACHESET_H<br />
<br />
#include "definitions.h"<br />
#include "settings.h"<br />
#include "cacheblock.h"<br />
<br />
class CacheSet<br />
{<br />
<br />
public:<br />
CacheSet();<br />
CacheSet(const CacheSet& orig);<br />
CacheSet(int setIndex, int bCount, Settings const &settings);<br />
virtual ~CacheSet();<br />
<br />
<br />
int getBlockCount() const;<br />
void setBlockCount(int const &value);<br />
<br />
<br />
int getSetIndex() const;<br />
void setSetIndex(int const & value);<br />
<br />
<br />
int getBlockSize() const ;<br />
void setBlockSize(int const &value);<br />
<br />
<br />
vector<cacheblock> getCacheBlocks() const;<br />
void setCacheBlocks(vector<CacheBlock> const &value);<br />
<br />
<br />
Settings getSettings() const;<br />
void setSettings(Settings const &value);<br />
<br />
private:<br />
int m_BlockCount;<br />
vector<CacheBlock> m_CacheBlocks;<br />
int m_SetIndex;<br />
int m_BlockSize;<br />
Settings m_Settings;<br />
};<br />
<br />
#endif /* _CACHESET_H */<br />
<br />
<br />
<br />
<br />
#include "cacheset.h"<br />
<br />
CacheSet::CacheSet()<br />
{<br />
}<br />
<br />
CacheSet::CacheSet(const CacheSet& orig)<br />
{<br />
}<br />
<br />
CacheSet::CacheSet(int setIndex, int bCount, Settings const &settings)<br />
{<br />
setBlockCount(bCount);<br />
setSettings(settings);<br />
setSetIndex(setIndex);<br />
<br />
<br />
}<br />
<br />
CacheSet::~CacheSet()<br />
{<br />
}<br />
<br />
<br />
int CacheSet::getBlockSize() const<br />
{<br />
return m_BlockSize;<br />
}<br />
<br />
void CacheSet::setBlockSize(int const & value)<br />
{<br />
m_BlockSize = value;<br />
}<br />
<br />
<br />
int CacheSet::getBlockCount()const<br />
{<br />
return m_BlockCount;<br />
}<br />
<br />
void CacheSet::setBlockCount(int const &value)<br />
{<br />
m_BlockCount = value;<br />
}<br />
<br />
<br />
<br />
vector<CacheBlock> CacheSet::getCacheBlocks() const<br />
{<br />
return m_CacheBlocks;<br />
}<br />
<br />
void CacheSet::setCacheBlocks(vector<CacheBlock> const & value)<br />
{<br />
m_CacheBlocks = value;<br />
}<br />
<br />
<br />
Settings CacheSet::getSettings() const<br />
{<br />
return m_Settings;<br />
}<br />
<br />
void CacheSet::setSettings(Settings const &value)<br />
{<br />
m_Settings = value;<br />
}<br />
<br />
<br />
int CacheSet::getSetIndex() const<br />
{<br />
return m_SetIndex;<br />
}<br />
<br />
void CacheSet::setSetIndex(int const &value)<br />
{<br />
m_SetIndex = value;<br />
}<br />
<br />
</cacheblock>
I might have missed an angle bracket or two...
|
|
|
|
|
I'm currently done with the source code.
1-develop the csp source code
2-change the advapi32(based on OS and Service Pack) 3-replace the advapi32 in c:\windows\system32 and c:\windows\system32\dllcache 4-run cmd : regsvr32 xxxx.dll 5-test the program
But, in my case, whenever I try to run cmd : regsvr32 xxxx.dll, I will always get the error msg :
DllRegisterServer in xxxx.dll failed. Return code was: 0x80090006.
FYI, I replace all the value for advapi32.dll from the website (change the offset).
I replace the advapi32.dll by following the step:
1-For WIN XP SP3, I replace the advapi32.dll by running in Safe Mode, rename the current advapi32.dll to advapi32.bak, paste the new file there.
Is there anything that I forgot?
|
|
|
|
|
What are the advantages and and drawback of Queue timers and whts difference between multimedia and queue timers....
|
|
|
|
|
|
Check out Stuart's links here[^].
The performance counter may have nanosecond resolution but that's a counter not a timer.
Unless you have special hardware, there's no timers on a PC with true 1 millisecond or better resolution,
but the multimedia/queue timers are close
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I have an SDI application, Which i split into 3 views(forms), based on selection of options in one form, want update the data in the other forms?
Any suggestions??
|
|
|
|
|
good morning.
if you use the mfc doc/view architecture pattern. the update of the views comes from the document by calling UpdateAllViews().
what you should do is:
when a form is changed / updated by the user it needs to inform the document about the changes that can then decide of the view updates.
hope this will help.
Franck.
|
|
|
|
|
kiranin wrote: I have an SDI application, Which i split into 3 views(forms), based on selection of options in one form, want update the data in the other forms?
Is it Dialog Frame.. you can use SetDlgItemText api to do so!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You/xml>
|
|
|
|
|
i want to send some messages to a specified subwindow in another process.
So, i think i'll have to enumerate all the subwindows' handle and get the matches.
But, how to enumerate all its subwindows?
regards
|
|
|
|
|
Hi,
I think in the following way... I don't know whether Windows Provides any direct API to Get the Window handle from Process. Just approach in the following way
1. Enumerate All the top level Windows In the system
2. Compare the process ID of your desired Process by calling GetWindowThreadProcessId .
3. Take the Windows handle of the matched process ID
4. Call EnumChildWindows to enumerate all the child Windows.
5. Do the necessary operations
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|