0

我的代码遍历 JSON 文件中每个样本的值,并给出排序比较的次数、内存量以及排序发生所需的时间。但由于某种原因,代码给我一个错误。如果有人可以帮助我,我会很高兴。由于某种原因,我的代码中出现了 [json.exception.type_error.302] 。我知道错误是什么意思,但我不知道哪里有问题

确切地说,这是我得到的错误 - “libc++abi.dylib: terminating with uncaught exception of type 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;
}
4

1 回答 1

0

单步执行代码,异常发生在哪一行?如果您无法逐步完成,std::cerr请在整个过程中添加一些调用以查看失败的位置。我会假设错误发生在其中一条push_back线上,很可能是第一条。您有j <= arraysize,这很可能超出范围,因此当您尝试访问jsonObject[sample][arraysize]它时会导致错误。

此外,您可能只需要这样做quick = merge = insertion = jsonObject[sample].get<std::vector<int>>(),而不是需要循环

于 2019-10-31T11:38:24.220 回答