【问题标题】:Trouble filling a c++ array, only last item at every index填充c ++数组时遇到问题,每个索引只有最后一项
【发布时间】:2012-05-18 18:39:27
【问题描述】:

首先,这是一个类,所以我们能做什么和不能做什么是有限制的,而且我对 c++ 和一般编程非常陌生,所以这就是为什么代码可能有点废话。

我不知道为什么当我在第一个 for 循环中使用第一组 cout 行显示 item_list 时,它会按原样显示每个单独的项目(它是天际成分及其效果的列表)。

但是,当第二个 for 循环执行时,item_list 只填充了应该插入的最后一个项目(wisp wrappings 及其效果)。

即使只是指出我正确的方向也会非常感激:)

干杯

int client::fill_list(int size_in, int h1size, int h2size)
{
    char temp[ASIZE] = {'\0'};
    int j = 0;
    ifstream ifile;
    ifile.open("test.txt");

    if(ifile.is_open())
    {
        for(int i = 0; i < size_in; ++i)
        {    
            if(ifile.good())
            {       
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.name, temp, j);
            }


            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect1, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect2, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect3, temp, j);
            }

            if(ifile.good())
            {
                j = 0;
                do
                {                   
                    temp[j] = char(ifile.get());
                    ++j;
                }while(ifile.peek() != '*');
                temp[j] = char(ifile.get());
                copy(client_item.effect4, temp, j);
            }
            reference.into_list(i,client_item);
        cout << reference.item_list[i].name;
        cout << reference.item_list[i].effect1;
        cout << reference.item_list[i].effect2;
        cout << reference.item_list[i].effect3;
        cout << reference.item_list[i].effect4;
        getchar();
        }
    }
    for(int k = 0; k < SIZE; ++k)
    {
        cout << reference.item_list[k].name;
        cout << reference.item_list[k].effect1;
        cout << reference.item_list[k].effect2;
        cout << reference.item_list[k].effect3;
        cout << reference.item_list[k].effect4;
    }
    getchar();
    return 0;
}

...

int table::into_list(int index, item&item_in)
{
    if(index < SIZE)
    {
        item_list[index] = item_in;
        return 0;
    }
    else
        return 1;
}

... 表类的标题

#include "hash.h"

class table
{
public:
    table()
    {
        item_list = new item [SIZE];
    }
    ~table();
    int fill(item*);
    int insert(item&, nHash&);
    int insert(item&, eHash&, int);
    int retrieve(char*,item*,int);
    int remove(int,item&);
    int remove(int);
    int check_hash(int,int,int);
    int keygen(char*, int);
    int from_list(int, item&);
    int into_list(int, item&);

//private:
    item * item_list;
    nHash name_table;
    eHash ef1_table;
    eHash ef2_table;
    eHash ef3_table;
    eHash ef4_table;
};

.... 主要的开始

#include "client.h"

int main()
{
    client program;

    program.fill_list(SIZE,HNSIZE,HESIZE);

    for(int i = 0; i < SIZE; ++i)
    {
        cout << program.reference.item_list[i].name;
        cout << program.reference.item_list[i].effect1 << endl;
        cout << program.reference.item_list[i].effect2 << endl;
        cout << program.reference.item_list[i].effect3 << endl;
        cout << program.reference.item_list[i].effect4 << endl;
    }

....

项目标题

#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int ASIZE = 30;
const int SIZE = 92;
const int HNSIZE = 41;
const int HESIZE = 17;

struct item
{
    item();
    ~item();
    char * name;
    char * effect1;
    char * effect2;
    char * effect3;
    char * effect4;
    int count;
    //int keygen(int,int);
    /*int name_key;
    int ef1_key;
    int ef2_key;
    int ef3_key;
    int ef4_key;*/
};

【问题讨论】:

  • 你的编程课整合了天际练习?我在哪里注册?
  • reference.item_list[k] 是否使用向量或其他东西执行某种pop_back(); pop(); 操作? reference_item的类型是什么?
  • 查看更多涉及reference 的代码可能会很有用:into_list 方法、item_list 的类型等。
  • @chris 直到整个发条橙的事情都很棒。现在每次我去制作药水时,我的眼睛都会流血。
  • @Drise,后增量可能在某些书籍等中,但使用前增量是一个好习惯,因为它可以节省您制作有时昂贵的副本。

标签: c++ arrays for-loop ifstream cout


【解决方案1】:

问题的一部分可能是您如何在此处复制client_item

reference.into_list(i,client_item);

这只是将client_item 分配给item_list,如下所示:

item_list[index] = item_in;

...但是由于item 是这样定义的:

struct item
{
    item();
    ~item();
    char * name;
    char * effect1;
    ...

...item_list 中的所有items 都将具有指向与client_item 中的内存相同的内存的指针(如name 等)。

例如,每次赋值后,指针item_list[index].nameitem_in.name 将具有相同的值。 (如果您好奇,可以通过打印两个指针来检查。)由于它们都指向同一个内存,如果您更改存储在该内存中的内容,两个对象似乎会同时更改。

这意味着对client_item 的后续更改(例如将新字符串复制到它指向的位置之一)也会影响所有已保存的项目。

【讨论】:

  • 这听起来是我最理智的回答。
  • 呸!这很明显,我怎么错过了?
  • 就是这样!谢谢大家的帮助,真的很感激
  • 所以我认为我需要创建一个新函数或修改该函数以创建适当大小的新 char 数组,然后按数组而不是作为结构复制客户端数据数组
  • @user1404053:听起来很合理。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 2019-11-19
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多