Я пытаюсь записать powerset в файл, но я получаю кучу повреждений, если мой начальный массив больше, чем размер 6, и я не уверен, почему. Он отлично работает с любым размером массива 6 или ниже. Не могу понять это.
Кроме того, test.txt — это то, где я читаю в массиве. Если файл содержит «1,2,3,4,5,6», он работает нормально, но содержит «1,2,3,4,5,6,7». Я получаю кучу повреждений.
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include "N26.h"#include <math.h>
using namespace std;
void increaseArray(int* theArray, int size)
{
int i = size;
int n = i+1;
int* newArray = new int[n];
for(int cnt=0;cnt<n;cnt++)
{
newArray[cnt] = theArray[cnt];
}
newArray[n-1]= NULL;
theArray = newArray;
return;
}
void printPowerSet(int *s, int n)
{
int i=0,j=0;
ofstream myFile;
double SetSize=pow(2.0,n);
myFile.open("powerset1.txt", std::ios_base::app);
cout<<"{size of original}"<< n <<endl;
cout<<"{number of sets}"<< SetSize-1 <<endl;
for(i=1;i<SetSize;++i)
{
for(j=0;j<n;++j)
{
if(((i>>j)&1)==1)
{
myFile << s[j] <<",";
}
}
myFile<<endl;
}
return;
}
int main()
{
ifstream myFile;
int item;
string input ="";
string fileName = "test.txt";
myFile.open(fileName);
while(myFile)
{
int k = 1;
int* transaction= new int[1];
if(!getline(myFile,input))
break;
istringstream ss(input);
while(ss)
{
if(!getline(ss,input, ','))
break;
input.erase(remove_if(input.begin(), input.end(), isspace), input.end());
item = atoi(input.c_str());
transaction[k-1] = item;
increaseArray(transaction,k);
k++;
}
for(int i =0; i<k-1;i++)
{
cout << transaction[i];
}
printPowerSet(transaction, k-1);
cout << endl;
transaction=NULL;
}
system("Pause");
return 0;
}
Ваш increaseArray()
Функция не работает, потому что вы изменяете только локальную копию указателя. Вам нужно будет передать двойной указатель или ссылку на указатель, чтобы сделать то, что вы хотите.
Пример ссылки на указатель:
void увеличитьArray (int *& theArray, int size)
Вместо этого я бы рекомендовал использовать std::vector
, поскольку это будет расти автоматически.
Я сомневаюсь, что это имеет какое-то отношение к вашей проблеме, но я не вижу, чтобы вы когда-либо удаляли. У тебя утечка памяти. Перед переназначением вашего указателя с новым выделением удалите старое выделение:
delete [] theArray; // The "[]" is important!
theArray = newArray;
В дополнение к ответу Фреда.
Посмотрите, что происходит внутри increaseArray()
конкретно эти строки:
int i = size;
int n = i+1;
int* newArray = new int[n];
for(int cnt=0;cnt<n;cnt++)
{
newArray[cnt] = theArray[cnt];
}
Вы выделяете массив size + 1
элементы, а затем перебрать оригинал. Это одно за другим, то есть вы получаете доступ к одному элементу вне исходного массива. Тот может быть вы получите ошибку сегментации в зависимости от того, как new
выкладывает кучу, но точно неопределенное поведение.