【问题标题】:C++ program out of memoryC++程序内存不足
【发布时间】:2014-01-18 08:59:54
【问题描述】:

首先我真的很抱歉,但我不知道我的程序中的错误在哪里,我已经经历了一百次但我找不到它。
当我在 VB2010 中调试时,我遇到了访问验证错误,因此必须有一个函数从某个不允许的地方获取内存。编写程序从数据库中获取一些数据,对其进行排序并返回到 output.txt。
它是拉丁语-克罗地亚语词典。无论如何请帮忙。

这是我的代码:

#include <iostream>
#include <fstream>
#include <string> 
#include <cmath>
#include <string>
#include<stdlib.h>
using namespace std;
void ascii_convert(int);
void string_compare(string);
void word_sort(int a,string inp);
string word1=0;
string word2=0;
string word3=0;
string upis;
string word[30] = {};
int match=0;
int input=0;
int broj_rijeci = 0;

int main()
{
  string line;
  ifstream myfile ("database.txt");            //loading database.txt
  int count = 0; 
  if (myfile.is_open()){
  while ( getline (myfile,line) ){
  if(line.at(0) == '['){                       //get's the number of words in database..
     int i = line.length()-1;                  //...that is the first line of databse
     int brojac = 0;
     while(line.at(i) != line.at(0)){
        input = line.at(i);
        ascii_convert(input);
        broj_rijeci = broj_rijeci + input*static_cast<int>(pow(static_cast<double>(10),brojac));
        i--;
        brojac++;
    }
  }
  if(line.at(0) != '['){
     for(int i = 0; line.at(i)!=' ' ;i++){
        word[count] = word[count] + line.at(i);
       }
     count++;   
    }
}
myfile.close();
}
else cout << "Unable to open file"; 

for(int i = 0; i<broj_rijeci ;i++) cout<<word[i]<<endl;    
cin>>upis;
string_compare(upis);  //after this line I will put the output as output.txt
system("pause");      
return 0;
}

void string_compare(string){
int len1 = upis.length();   
int len;
for(int i = 0; i < broj_rijeci; i++){
 int len2 = word[i].length();
 if (len1<len2) len = len1;
 else len = len2;
 for(int y = 0; y < len; y++){
     if(upis.at(y) == word[i].at(y)) match++;          
    }
    word_sort(match,word[i]);  
  }
}
void word_sort(int a,string inp){
    int match1 = 0;
    int len1 = upis.length();   
    int len;
    for(int i = 0; i < broj_rijeci; i++){
        int len2 = word1.length();
        if (len1<len2) len = len1;
        else len = len2;
        for(int y = 0; y < len; y++){
            if(upis.at(y) == word1.at(y)) match1++;          
        }  
    }
    if(a>match1){
     word3 = word2;
     word2 = word1;
     word1 = inp; 
    }else{
      int match1 = 0;
        int len1 = upis.length();   
        int len;
        for(int i = 0; i < broj_rijeci; i++){
            int len2 = word2.length();
            if (len1<len2) len = len1;
            else len = len2;
            for(int y = 0; y < len; y++){
                if(upis.at(y) == word2.at(y)) match1++;          
            }  
        }
       if(a>match1){
         word3 = word2;
         word2 = inp;   
        }else{
            int match1 = 0;
            int len1 = upis.length();   
            int len;
            for(int i = 0; i < broj_rijeci; i++){
                int len2 = word3.length();
                if (len1<len2) len = len1;
                else len = len2;
                for(int y = 0; y < len; y++){
                    if(upis.at(y) == word3.at(y)) match1++;          
                }     
            }
            if(a>match1) word3 = inp;
        }  
    }
}

void ascii_convert(int){         //function for converting variable "input"  
if(input == 48){                //from ascii to decimal numbers
    input = 0;
}
if(input == 49){
    input = 1;
}
if(input == 50){
    input = 2;
}
if(input == 51){
    input = 3;
}
if(input == 52){
    input = 4;
}
if(input == 53){
    input = 5;
}
if(input == 54){
    input = 6;
}
if(input == 55){
    input = 7;
}
if(input == 56){
    input = 8;
}
if(input == 57){
    input = 9;
 }         
}

这是我的“database.txt”:

[4]
terra ae f zemlja
amica ae f prijateljica
puela ae f djevojcica
nauta ae m mornar

感谢您的支持

【问题讨论】:

  • 你的ascii_converter函数是没有作用的(如果你弄清楚输入和输出值之间的关系也可以写成一行)。
  • @sftrabbit:很遗憾,它会正常工作。 input 是全球性的。
  • @CHAO 哦。有趣的是他们将input 传递给未命名的参数...
  • @sftrabbit:是的,这个函数似乎很矛盾,它是要接受参数还是要弄乱全局变量。 :P
  • 您是否尝试过使用valgrind?它是调试内存管理问题的最佳工具之一。

标签: c++ memory crash


【解决方案1】:

首先,所有这些都必须修复

string word1=0;
string word2=0;
string word3=0;

这些将string 对象初始化为被解释为转换后的 NULL 指针。不好。坦率地说,我很震惊你的程序甚至在 main() 之前完成了全局初始化,因为它肯定不在我的工具链上。

接下来,这是在其数组声明的大小之外使用索引far

for(int i = 0; i<broj_rijeci ;i++) cout<<word[i]<<endl;

使用给定的输入文件并利用 您的 加载算法,broj_rijeci 计算为 133,仅比 word[] 的大小长 94 个条目。简而言之,您对该变量的计算完全错误,或者数组方式 过小。无论哪种方式,它的未定义行为。我倾向于前者(加载算法是错误的)。但是,如果没有关于每一行每个实体的目的的精确信息,我在这方面就无法提供更多的输入。

除此之外,这还充斥着编程的反复无常和不良做法。函数传递参数只是为了修改传递参数的全局变量只是冰山一角。

克罗地亚语-英语备忘单

对于想要扩展该算法(或至少尝试并理解它正在尝试做什么)的相关方:

  • brojač = 计数器
  • broj = 数量或大小
  • riječi = 单词
  • ae = 生成器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2020-12-23
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多