http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4089|回复: 9

[其他] 请教C#结构体方面的使用(结构体数组)

[复制链接]
发表于 2014-8-15 15:06:53 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 zhushuazi 于 2014-8-15 15:08 编辑

下面的代码提示错误:说未将对象引用设置到对象的实例

代码如下:请问大家我的错误在哪里?
public struct Crossing
    {
        public Crossing(int i)
        {
            flow_in = new float[4];
            returning_ratio = new float[4, 3];
            tongxing = new float[4, 3];
        }
        public float[] flow_in;
        public float[,] returning_ratio;
        public float[,] tongxing;
}
    class Program
    {

        static void Main(string[] args)
        {
            Crossing[] crossings = new Crossing[20];

            StreamReader sr = new StreamReader("F:\\c# exercise\\baoheduCeshiDemo\\baoheceshi.txt");
            string line;
            for (int i = 0; i < 20 ; i++)
                  for (int j = 0; j < 4 && ((line = sr.ReadLine()) != null); j++)
                      crossings.flow_in[j] = float.Parse(line);
        }
}  


最佳答案

查看完整内容

没有初始化,结构体的用法和类非常相似,你只是声明了一下结构体,但是并没有给结构体初始化,系统就不会给结构体对象分配内存空间,所以结构体对象的引用地址是空的,就会报错


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-8-15 15:06:54 | 显示全部楼层
没有初始化,结构体的用法和类非常相似,你只是声明了一下结构体,但是并没有给结构体初始化,系统就不会给结构体对象分配内存空间,所以结构体对象的引用地址是空的,就会报错
回复

使用道具 举报

发表于 2014-8-15 15:43:22 | 显示全部楼层
没有初始化,结构体的用法和类非常相似,你只是声明了一下结构体,但是并没有给结构体初始化,系统就不会给结构体对象分配内存空间,所以结构体对象的引用地址是空的,就会报错
回复

使用道具 举报

 楼主| 发表于 2014-8-15 15:53:35 | 显示全部楼层
xfqsean 发表于 2014-8-15 15:43
没有初始化,结构体的用法和类非常相似,你只是声明了一下结构体,但是并没有给结构体初始化,系统就不会给 ...

请问怎么初始化呢?我刚刚接触,不太会。想把结构体中的变量全部设为0
回复

使用道具 举报

发表于 2014-8-15 16:18:53 | 显示全部楼层
            for (int i = 0; i < 20; i++)
                for (int j = 0; j < 4 && ((line = sr.ReadLine()) != null); j++)
                    crossings[i].flow_in[j] = float.Parse(line);

试试这样!
回复

使用道具 举报

 楼主| 发表于 2014-8-15 16:26:42 | 显示全部楼层
mkstronger 发表于 2014-8-15 16:18
for (int i = 0; i < 20; i++)
                for (int j = 0; j < 4 && ((line = sr.ReadL ...

嗯 刚才试过了,还是不行,说是未将对象引用设置到对象的实例
回复

使用道具 举报

发表于 2014-8-15 19:35:01 | 显示全部楼层
本帖最后由 sandy1231 于 2014-8-15 19:36 编辑

crossings.flow_in[j] = float.Parse(line);
是这里报错吧,你之前声明的是对象数组,应该先实例化对象crossings[  i  ]=new Crossing(参数);
再实例化 crossings  [  i ].flow_in[]
回复

使用道具 举报

 楼主| 发表于 2014-8-15 19:54:38 | 显示全部楼层
sandy1231 发表于 2014-8-15 19:35
crossings.flow_in[j] = float.Parse(line);
是这里报错吧,你之前声明的是对象数组,应该先实例化对象cr ...

我感觉可能是我结构体初始化不对,但我不太清楚结构体中若含有数组(像我这样),怎么进行初始化?
回复

使用道具 举报

发表于 2014-8-16 09:39:26 | 显示全部楼层
[C#] 纯文本查看 复制代码
 public Crossing(int i)
        {
            flow_in = new float[4];
            returning_ratio = new float[4, 3];
            tongxing = new float[4, 3];
        }


不考虑你这个构造函数 int i 参数的用意的话,可以把 int i 去掉试试,这样保证你的三个float数组能够正确的被初始化,而你这个带参数的构造函数需要你自己显式调用
回复

使用道具 举报

发表于 2014-8-18 13:23:25 | 显示全部楼层
就当成类来实例化就行了啊
for (int i = 0; i < 20 ; i++)
        for (int j = 0; j < 4 && ((line = sr.ReadLine()) != null); j++)
           {
             crossings[i]=new Crossing(参数);
             crossings[i].flow_in[j] = float.Parse(line);
            }

如果结构体构造函数的参数没有意义的话,就去掉,然后初始化的时候,就不用带参数了,直接new就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-1 08:29

© 2014-2021

快速回复 返回顶部 返回列表