I'm getting an access violation with this python function that I'm calling to in C++. I'm trying to read a file and write a new one that will show items and count all instances of a word in the reading file and display it in the write file. I'm a little rusty with python but I'm really not sure what I'm doing wrong
def GetHistogram(): #FIXME
frequency = {}
with open('input.txt','r') as itemList, open('frequency.dat','w') as frequencyFile:
if frequencyFile.closed:
print("file closed")
itemString = itemList.read().lower() #reads file and sets all to lowercase to make matching easier
matches = re.findall(r'\b[a-z]{1,25}\b', itemString) #finds all matches within boundaries
for item in matches: # for loop to iterate over matches
count = frequency.get(item, 0) #using get() to return value of item
frequency[item] = count + 1 #counts the frequency of each word in matches
List = frequency.keys() #assigns list with keys in dictionary (items)
for items in List:
frequencyFile.write(items.title(), frequency[items]) #prints items (titled again) and frequency
return;
Editing for C++, here are the related functions:
void displayHistogram() { //FIXME
ifstream frequencyFile("frequency.dat");
cout << "\n\nWriting items and quantities sold today to a file: \n\n";
CallProcedure("GetHistogram");
if (!frequencyFile.is_open()) {
cout << "could not open file" << endl;
}
string item;
int count;
string histo;
while (frequencyFile >> item >> count) {
histo = (count * '*');
cout << item << ": " << histo << endl;
}
frequencyFile.close();
}
and CallProcedure() :
void CallProcedure(string pName)
{
char* procname = new char[pName.length() + 1];
std::strcpy(procname, pName.c_str());
Py_Initialize();
PyObject* my_module = PyImport_ImportModule("PythonCode");
PyErr_Print();
PyObject* my_function = PyObject_GetAttrString(my_module, procname);
PyObject* my_result = PyObject_CallObject(my_function, NULL);
Py_Finalize();
delete[] procname;
}
When I build, it succeeds, so I was assuming it was on the python side. The violation I'm getting is occurring in the call procedure function :
Exception thrown at 0x1D6EC348 (python36.dll) in Groceries.exe: 0xC0000005: Access violation reading location 0x00000004.
source https://stackoverflow.com/questions/71895748/access-violation-counting-occurrences
Comments
Post a Comment