проблема при отправке данных в вектор в цикле - PullRequest
0 голосов
/ 11 марта 2020

Это мой txt файл, где первая строка - это номер dataSets. 2-я строка (переменная size1) равна количеству элементов в 3-й строке (массив A1), а 4-я строка (переменная size2) равна числу элементов в 5-й строке (массив A2). Моя функция readFile должна перезаписывать переменные и массивы, перечисленные выше, без перезаписи dataSets переменной.

Моя countElementsInArray функция предназначена для подсчета количества появлений цифр из массива A2 в массиве A1. Моя программа работает с одним dataSet (5 строк в txt), но когда дело доходит, например, до 3 dataSets (13 строк), моя функция readFile останавливается при возврате результатов в вектор с именованным числом. У меня вопрос, почему это неправильно и как его заменить?

txt:

3
4
-5 -1 0 8
7
7 9 2 0 -7 2 -5
4
1 2 3 4
2
1 1
5
0 0 0 0 0
1
3

Result for above input should be:
Dataset1:
0 0 0 1 0 0 1
Dataset2:
1 1
Dataset3:
0
int main() {

    int dataSets = 0, size1 = 0, size2 = 0;
    std::fstream file;
    openFile(file);

    int *A1 = new int[size1];
    int *A2 = new int[size2];

    readFile(file, dataSets, size1, size2, A1, A2);
}

void readFile(std::fstream &file, int &dataSets, int &size1, int &size2, int *&A1, int *&A2) {

    std::vector<int> counts;

    file >> dataSets;

    for (size_t i = 0; i < dataSets; i++) {
        file >> size1;

        for (size_t j = 0; j < size1; j++)
            file >> A1[j];

        file >> size2;

        for (size_t j = 0; j < size2; j++)
            file >> A2[j];

        for (size_t j = 0; j < size2; j++) {
            int searchValue = A2[j];
            counts.push_back(countElementsInArray(A1, size1, searchValue));
        }

        int numberOfDataSet = i + 1;
        std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
        for (size_t j = 0; j < size2; j++) {
            std::cout << counts[j] << " ";
        }

        std::cout << std::endl;
    }

}



int countElementsInArray(int *A, int size, int searchValue) {

    int count = 0, first = 0, last = size;
    int i = 1;
    int j = 1;
    while (first <= last) {
        int mid = first + (last - 1) / 2;

        if (A[mid] == searchValue) {
            count++;
            do {
                if (A[mid + i] == searchValue && A[mid - j] == searchValue) {
                    count += 2;
                    i++;
                    j++;
                } else if (A[mid + i] == searchValue) {
                    count++;
                    i++;
                } else if (A[mid - j] == searchValue) {
                    count++;
                    j++;
                }

                return count;
            } while (A[mid + i] == searchValue || A[mid - j] == searchValue);
        } else if (searchValue < A[mid])
            last = mid - 1;

        else if (searchValue > A[mid])
            first = mid + 1;
    }
    return count;
}

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

@ anastaciu Я немного изменил код, и теперь я вижу в отладчике, что программа передает счет в векторное число, но я все еще не могу отобразить его

void fread(std::fstream &file, std::vector<int> &A1, std::vector<int> &A2) {

    std::vector<int> counts;
    int dataSets, size1, size2, x, y;
    file >> dataSets;
    for (size_t i = 0; i < dataSets; i++) {
        file >> size1;

        for (size_t j = 0; j < size1; j++) {
            file >> x;
            A1.push_back(x);
        }

        file >> size2;

        for (size_t j = 0; j < size2; j++) {
            file >> y;
            A2.push_back(y);
        }

        for (size_t j = 0; j < size2; j++) {
            int searchValue = A2[j];
            counts.push_back(fcount(A1, size1, searchValue));
        }

        int numberOfDataSet = i + 1;
        std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
        for(auto& k : counts)
            std::cout << k;
        std::cout << std::endl;
    }
}
0 голосов
/ 11 марта 2020

Одна проблема, которая выделяется, это

int *A1 = new int[size1];
int *A2 = new int[size2]; 

, являющаяся size1 и size2 равной 0, по сути, у вас есть массив фиксированного размера с размером 0, он не может содержать любое значение так что

file >> A1[j];

и

file >> A2[j];

оба являются неопределенным поведением .

Изменение size1 и size на 10 только для проверки позволяет получить результат.

Образец:

https://wandbox.org/permlink/ra2AE4uff74NXAXp

Когда предыдущий код содержал некрасивый вздор sh:

https://wandbox.org/permlink/tHGK8unYj0ww9KSe

Я думаю, что отсюда вы можете исправить остальную часть вашей программы.

Замена

for (size_t j = 0; j < size2; j++) {
     std::cout << counts[j] << " ";
}

На:

for(auto& i : counts)
   std::cout << i;

Покажет вам все элементы в массиве, которые я собираю не правильно, вы должны настроить сбор данных из файла чтобы размеры были правильными, и инициализируйте A1 и A2 внутри функции с правильными размерами.

Обратите внимание, что определение openFile(); по-прежнему отсутствует, я предполагаю, что это просто открыть файл е.

...