Я получаю [json.exception.type_error.302] по некоторым причинам в моем коде. Я знаю, что означает ошибка, но я не знаю, где есть ошибка - PullRequest
0 голосов
/ 31 октября 2019

Мой код просматривает значения каждой выборки в файле JSON и выдает количество сравнений сортировки, объем памяти и время, необходимое для выполнения сортировки. Но по какой-то причине код выдает ошибку. Хотелось бы, чтобы кто-нибудь помог мне. Я получаю [json.exception.type_error.302] по некоторым причинам в моем коде. Я знаю, что означает ошибка, но я не знаю, где есть ошибка

Если быть точным, это ошибка, которую я получаю - "libc ++ abi.dylib: завершение с неперехваченным исключением типа nlohmann:: detail :: type_error: [json.exception.type_error.302] тип должен быть числом, но равен нулю "

#include <iostream>
#include <fstream>
#include "json.hpp"
#include "mergesort.h"
#include "insertionsort.h"
#include "quicksort.h"
#include <ctime>
#include <iomanip>

int main(int argc, char* argv[]) {
  std::ifstream file;
  file.open(argv[1]);
  nlohmann::json jsonObject;
  if (file.is_open()) {
    file >> jsonObject;
  } else {
    std::cout << "Invalid Argument" << std::endl;
  }

  clock_t mergeTime, quickTime, insertTime;
  extern int insertMemAccesses, insertCompare, mergeMemAccesses, mergeCompare, quickCompare, quickMemAccesses;
//    std::cout << jsonObject;
//    nlohmann::json jsonOutput;

  std::cout << "Sample,InsertSortTime,InsertionSortCompares,InsertionSortMemaccess,MergeSortCompares,MergeSortMemaccess,QuickSortTime,QuickSortCompares,QuickSortMemaccess";

  int arraysize = jsonObject["metadata"]["arraySize"];
  int numsamples = jsonObject["metadata"]["numSamples"];


  for (int i = 0; i <= numsamples; i++) {
    std::string sample;
    if (i < 9) {
      sample = "Sample0" + std::to_string(i+1);
    } else {
      sample = "Sample" + std::to_string(i+1);
    }

    std::vector<int> insertion;
    std::vector<int> merge;
    std::vector<int> quick;

    for(int j = 0; j <= arraysize; j++){
      insertion.push_back(jsonObject[sample][j]);
      merge.push_back(jsonObject[sample][j]);
      quick.push_back(jsonObject[sample][j]);
    }

    insertTime = clock();
    InsertionSort(&insertion);
    insertTime = clock() - insertTime;

    insertTime = ((unsigned long)insertTime)/CLOCKS_PER_SEC;

    mergeTime = clock();
    MergeSort(&merge);
    mergeTime = clock() - mergeTime;

    mergeTime = ((unsigned long)mergeTime)/CLOCKS_PER_SEC;

    quickTime = clock();
    QuickSort(&quick);
    quickTime = clock() - quickTime;

    quickTime = ((unsigned long)quickTime)/CLOCKS_PER_SEC;

    std::cout<<sample<<",";
    printf("%.6lu,%d,%d,%.6lu,%d,%d,%.6lu,%d,%d\n",insertTime,insertCompare,insertMemAccesses,mergeTime,mergeCompare,mergeMemAccesses,quickTime,quickCompare,quickMemAccesses);


    insertCompare = 0;
    insertMemAccesses = 0;
    mergeCompare = 0;
    mergeMemAccesses = 0;
    quickCompare = 0;
    quickMemAccesses = 0;

  }
  return 0;
}

1 Ответ

0 голосов
/ 31 октября 2019

Пошаговый код, и в какой строке происходит исключение? Если у вас нет способа пошагового выполнения, добавьте несколько вызовов std::cerr, чтобы увидеть, где происходит сбой. Я бы предположил, что ошибка возникает в одной из push_back строк, скорее всего, в первой. У вас есть j <= arraysize, который, скорее всего, выходит за пределы, поэтому при попытке доступа к jsonObject[sample][arraysize] это вызывает ошибку.

Кроме того, вы, вероятно, можете просто сделать quick = merge = insertion = jsonObject[sample].get<std::vector<int>>(), вместо того, чтобы использовать цикл

...