- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
void LinkedList::insertBack(int stationID, int year, int month, double temp) {
Node* newNode = new Node(stationID, year, month, temp);
if (tail != nullptr)
tail->next = newNode; //ERROR - EXC_BAD_ACCESS code = 2
tail = newNode;
if (head == nullptr) {
head = newNode;
}
}
这是我的一个项目代码的一部分,它接收数据并将它们放入链表中。我在错误中写了它出现在哪一行。我不认为实际问题出在这个函数中,但我会非常感谢任何帮助。谢谢你!我在下面附上了我的 .cpp 文件的其余部分。我也附上了我的 main.cpp。
LinkedList::LinkedList(string name) :
head(nullptr), tail(nullptr), name(name) {}
// Destructor
LinkedList::~LinkedList() {
clear();
cout << "LinkedList destructor called" << endl;
}
//Default constructor
LinkedList::LinkedList(){
cout << "LinkedList constructor called." << endl;
dataObj = new int;
*dataObj = 0;
return;
}
//Copy Constructor
LinkedList::LinkedList(const LinkedList& origClass) {
cout << "Copy Constructor called." << endl;
dataObj = new int;
*dataObj = *(origClass.dataObj);
return;
}
//Copy Assignment Operator
LinkedList& LinkedList::operator=(const LinkedList& objToCopy){
cout << "Assignment op called." << endl;
if (this != &objToCopy) {
delete dataObj;
dataObj = new int;
*dataObj = *(objToCopy.dataObj);
}
return *this;
}
void LinkedList::empty() {
if (head)
delete head;
}
void LinkedList::setName(string name) {
this->name = name;
}
string LinkedList::getName() const{
return name;
}
void LinkedList::insertFront(int stationID, int year, int month, double temp) {
Node* newNode = new Node(stationID, year, month, temp);
newNode->next = head; // attach to list
head = newNode;
if (tail == nullptr) { // empty list
tail = newNode; // only node is both head and tail
}
}
void LinkedList::insertBack(int stationID, int year, int month, double temp) {
Node* newNode = new Node(stationID, year, month, temp);
if (tail != nullptr)
tail->next = newNode; // attach to list
tail = newNode;
if (head == nullptr) { // empty list
head = newNode; // only node is both head and tail
}
}
void LinkedList::insertBack(int stationID, string command, int firstYear, int lastYear) {
Node* newNode = new Node(stationID, command, firstYear, lastYear);
if (tail != nullptr)
tail->next = newNode; // attach to list
tail = newNode;
if (head == nullptr) { // empty list
head = newNode; // only node is both head and tail
}
}
void LinkedList::clear() {
Node* del = head;
while (del != NULL) {
head = head->next;
delete del;
del = head;
}
head = tail = NULL;
}
int LinkedList::size()
{
int cnt = 0;
Node* node = head;
while (node != NULL) {
cnt++;
node = node->next;
}
return cnt;
}
void LinkedList::print() const {
print(cout);
}
void LinkedList::print(ostream& os) const {
os << this;
}
//Temp List
double LinkedList::getStationID(int index) const {
Node* current= head;
double count = 0.0;
double ID = 0.0;
while (current != NULL) {
if (count == index) {
ID = current->stationID;
}
count++;
current = current->next;
}
return ID;
}
double LinkedList::getYear(int index) const {
Node* current= head;
double count = 0.0;
double year = 0.0;
while (current != NULL) {
if (count == index) {
year = current->year;
}
count++;
current = current->next;
}
return year;
}
double LinkedList::getMonth(int index) const {
Node* current= head;
double count = 0.0;
double month = 0.0;
while (current != NULL) {
if (count == index) {
month = current->month;
}
count++;
current = current->next;
}
return month;
}
double LinkedList::getTemp(int index) const {
Node* current= head;
double count = 0.0;
double temp = 0.0;
while (current != NULL) {
if (count == index) {
temp = current->temperature;
}
count++;
current = current->next;
}
return temp;
}
//Query List
string LinkedList::getCommand(int index) {
Node* current= head;
double count = 0.0;
string phrase = "";
while (current != NULL) {
if (count == index) {
phrase = current->command;
}
count++;
current = current->next;
}
return phrase;
}
double LinkedList::getFirstYear(int index) const {
Node* current= head;
double count = 0.0;
double first = 0.0;
while (current != NULL) {
if (count == index) {
first = current->firstYear;
}
count++;
current = current->next;
}
return first;
}
double LinkedList::getSecondYear(int index) const {
Node* current= head;
double count = 0.0;
double last = 0.0;
while (current != NULL) {
if (count == index) {
last = current->lastYear;
}
count++;
current = current->next;
}
return last;
}
Node* LinkedList::search(double val)
{
Node* node = head;
/* traverse the list */
while (node != NULL) {
/* Target! */
if(node->value == val)
{
return node;
}
/* move to the next one */
node = node->next;
}
return NULL;
}
ostream& operator<<(ostream& os, const LinkedList& ll) {
os << ll.getName() << " {";
Node* current = ll.head;
if (current == nullptr) {
os << " <Empty List>";
}
while (current != nullptr) {
if (current != ll.head)
cout << ",";
cout << " " << current->stationID << ",";
cout << " " << current->year << ",";
cout << " " << current->month << ",";
cout << " " << current->temperature;
cout << " " << current->command;
cout << " " << current->firstYear;
cout << " " << current->lastYear;
current = current->next;
}
cout << " }";
return os;
}
主要.CPP
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <ios>
#include <iomanip>
#include <stdlib.h>
#include "LinkedList.hpp"
#include <string>
#include <cmath>
#include "Node.h"
int roundNum (float a) {
return floor(a + 0.5);
}
using namespace std;
int main(int argc, const char * argv[]) {
//What I need
int stationID = 0, year = 0, month = 0, firstYear = 0, lastYear = 0;
int maxCount = 0;
int maxNumber = 0;
int myCount = 0;
bool foundStation = false;
bool foundFirst = false;
bool foundLast = false;
string unknown = "unknown";
double temp = 0.0;
double total = 0.0;
double average = 0.0;
double count = 0.0;
int const CURRENT_YEAR = 2016;
string command = "";
vector<double>avg;
vector<double>mode;
vector<string>final;
LinkedList tempList;
LinkedList queryList;
//Read this file
ifstream tempFile = ifstream("3linetemp.dat");
ifstream queryFile = ifstream("queries.dat");
ofstream outputFile = ofstream("results.dat");
//Linked List for Temperature Data
while (tempFile >> stationID >> year >> month >> temp) {
try {
if (year < 1800 || year > CURRENT_YEAR) {throw runtime_error("Error.");}
if (month < 0 || month > 12) {throw runtime_error("Error.");}
if (temp == -99.99) {throw runtime_error("Error.");}
tempList.insertBack(stationID, year, month, temp);
}
catch(runtime_error& excpt) {cout << excpt.what() << endl;}
}
//Query Data
while (queryFile >> stationID >> command >> firstYear >> lastYear) {
queryList.insertBack(stationID, command, firstYear, lastYear);
}
//Get Average and Mode
for (int i = 0; i < queryList.size(); i++) {
//AVERAGE
if (queryList.getCommand(i) == "AVG") {
for (int j = 0; j < tempList.size(); j++) {
if (queryList.getStationID(i) == tempList.getStationID(j)) { foundStation = true;
if (tempList.getYear(j) >= queryList.getFirstYear(i)) { foundFirst = true;
if (tempList.getYear(j) <= queryList.getSecondYear(i)) { foundLast = true;
total += tempList.getTemp(j);
count++;
}
}
}
}
if (foundStation == false ||foundFirst == false || foundLast == false) /*Indicates no matching stationID*/ {final.push_back(unknown);}
else {
foundStation = false;
foundFirst = false;
foundLast = false;
average = total/count;
final.push_back(to_string(average));
average = 0.0;
total = 0.0;
count = 0.0;
}
}
//MODE
//Get possible modes
if (queryList.getCommand(i) == "MODE") {
for (int j = 0; j < tempList.size(); j++) {
if (queryList.getStationID(i) == tempList.getStationID(j)) { foundStation = true;
if (tempList.getYear(j) >= queryList.getFirstYear(i)) { foundFirst = true;
if (tempList.getYear(j) <= queryList.getSecondYear(i)) { foundLast = true;
int a = roundNum(tempList.getTemp(j));
mode.push_back(a);
}
}
}
} //If you can't find station ID
if (foundStation == false || foundFirst == false || foundLast == false) {final.push_back(unknown);}
//Find Mode
else {
foundStation = false;
foundFirst = false;
foundLast = false;
auto minmax = std::minmax_element(std::begin(mode), std::end(mode));
int max = *(minmax.second);
for (int i = 0; i <= max; i++) {
myCount = ::count(mode.begin(), mode.end(), i);
if (maxCount < myCount) {
maxCount = myCount;
maxNumber = i;
}
}
final.push_back(to_string(maxNumber));
}
}
}
cout << "File created." << endl;
//Make Results File
for (int i = 0; i < queryList.size(); i++) {
outputFile << queryList.getStationID(i) << " " << queryList.getFirstYear(i) << " " << queryList.getSecondYear(i) << " " << queryList.getCommand(i) << " " << final.at(i) << endl;
}
for (int i = 0; i < final.size(); i++) {
cout << final.at(i) << endl;
}
}
节点.H
#include "LinkedList.hpp"
#include "Temperature.hpp"
#include "Query.hpp"
#include "Node.h"
struct Node {
int stationID, year, month, firstYear, lastYear;
std::string command;
double temperature;
double value = 0;;
Node* next = nullptr;
//Temp Node
Node(int stationID, int year, int month, double temperature) : stationID(stationID), year(year), month(month), temperature(temperature) {}
//Query Node
Node (int stationID, std::string command, int firstYear, int lastYear) : stationID(stationID), command(command), firstYear(firstYear), lastYear(lastYear) {}
Node() : stationID(0), year(0), month(0), temperature(0), next(nullptr) {}
};
#endif /* Node_h */
最佳答案
我发现显示的代码存在多个问题。但是,由于显示的代码无法满足 minimal, complete, and verifiable example 的要求坠机的原因极有可能是其他原因。但是,我认为以下错误之一很可能是导致崩溃的未定义行为的原因,并且由于您“感谢任何建议”,因此这可以作为有效答案:
insertBack()
无法将 newNode->next
初始化为 nullptr
。如果 Node
的构造函数默认不初始化它,这将导致 tail
节点上的 next
指针未初始化。编辑:您发布了额外的代码,显示 next
是默认初始化的。
复制构造函数无法将 head
和 tail
初始化为 nullptr
。默认构造函数也无法做到这一点。
我怀疑您在复制构造或默认构造的列表上调用 insertBack()
而导致崩溃,其 tail
指针不是初始化,如上所述。如果是这样,这将是一个教科书示例,说明为什么当 C++ 程序在特定行崩溃时,并不一定意味着这是错误所在。
但是,为了确认观察到的未定义行为的原因,仍然有必要查看 minimal, complete, and verifiable example .
附言复制构造函数和赋值运算符是否应该复制实际列表也不清楚。如果是这样,那么不这样做将是另一个错误。
关于c++ - 链表 - EXC_BAD_ACCESS。我认为该错误是因为我错误地删除了一个节点,但我将不胜感激任何建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38689772/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!