C#代码问题

JS 2013-07-16 06:01:57
斜体indices = new int[1]处,我不明白,为什么要new一个,
粗体indices=new int[count];我知道怎么回事,
但是斜体的代码块只用到indices[0]啊,刚接触不太懂,请高手指教


//函数Maxima
static int Maxima(int[] integers, out int[] indices)
{
Debug.WriteLine("Maximum values search started.");
indices=new int[1];
int maxVal=integers[0];
indices[0]=0;
int count = 1;
Debug.WriteLine(string.Format("Maximum values initialised to {0},at element index 0.", maxVal));
for (int i = 1; i < integers.Length; i++)
{
Debug.WriteLine(string.Format("Now looking at element at index{0}",i));
if (integers > maxVal)
{
maxVal = integers[i];
count = 1;
[i]indices = new int[1];

indices[0] = i;
Debug.WriteLine(string.Format("Now maximun found,Now value is {0},at element index{1}", maxVal, i));
}
else
{
if (integers[i] == maxVal)
{
count++;
int[] oldIndices = indices;
indices=new int[count];
oldIndices.CopyTo(indices,0);
indices[count-1]=i;
Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i));
}
}
}
Trace.WriteLine(string.Format("Maximum value {0} found,with {1} occurrences",maxVal,count));
Debug.WriteLine("Maximum values search completed.");
return maxVal;
}

//主程序
int[] testArray = { 4, 7, 4, 2, 7, 3, 7, 8, 3, 9, 1, 9 };
int[] maxValIndices;
int maxVal = Maxima(testArray, out maxValIndices);
Console.WriteLine("Maximum value {0} found at element indices:",maxVal);
foreach (int index in maxValIndices)
{
Console.WriteLine(index);
}
Console.ReadKey();

...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2013-07-16
  • 打赏
  • 举报
回复
引用 7 楼 CJavaer 的回复:
[quote=引用 4 楼 soaringbird 的回复:] for循环有可能不执行,只在for里初始化,会有编译错误提示。
原始代码是这样的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication12
{
    class Program
    {
        static int Maxima(int[] integers, out int[] indices)
        {
            Debug.WriteLine("Maximum values search started.");
            indices=new int[1];
            int maxVal=integers[0];
            indices[0]=0;
            int count = 1;
            Debug.WriteLine(string.Format("Maximum values initialised to {0},at element index 0.", maxVal));
            for (int i = 1; i < integers.Length; i++)
            {
                Debug.WriteLine(string.Format("Now looking at element at index{0}",i));
                if (integers[i] > maxVal)
                {
                    maxVal = integers[i];
                    count = 1;
                    indices = new int[1];
                    indices[0] = i;
                    Debug.WriteLine(string.Format("Now maximun found,Now value is {0},at element index{1}", maxVal, i));
                }
                else
                {
                    if (integers[i] == maxVal)
                    {
                        count++;
                        int[] oldIndices = indices;
                        indices=new int[count];
                        oldIndices.CopyTo(indices,0);
                        indices[count-1]=i;
                        Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i));
                    }
                }
            }
            Trace.WriteLine(string.Format("Maximum value {0} found,with {1} occurrences",maxVal,count));
            Debug.WriteLine("Maximum values search completed.");
            return maxVal;
        }
        static void Main(string[] args)
        {
            int[] testArray = { 4, 7, 4, 2, 7, 3, 7, 8, 3, 9, 1, 9 };
            int[] maxValIndices;
            int maxVal = Maxima(testArray, out maxValIndices);
            Console.WriteLine("Maximum value {0} found at element indices:", maxVal);
            foreach (int index in maxValIndices)
            {
                Console.WriteLine(index);
            }
            Console.ReadKey();
        }
    }
}
我现在想把line26 注销掉,但是报错,我不知道这句这这里是什么意思, 函数一开始不就初始化了么[/quote] 不为什么,out参数必须在函数内初始化(不同于ref),这是王八的屁股——规定。
JS 2013-07-16
  • 打赏
  • 举报
回复
我应该知道原因在哪里了,假如去掉line26的话, 初始化数组里面有3个7,indices数组最大长度为3,当循环到第2个9时, int[] oldIndices = indices; indices=new int[count]; oldIndices.CopyTo(indices,0); 这个复制会出错,谢谢大家的帮助
JS 2013-07-16
  • 打赏
  • 举报
回复
引用 4 楼 soaringbird 的回复:
for循环有可能不执行,只在for里初始化,会有编译错误提示。
原始代码是这样的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication12
{
    class Program
    {
        static int Maxima(int[] integers, out int[] indices)
        {
            Debug.WriteLine("Maximum values search started.");
            indices=new int[1];
            int maxVal=integers[0];
            indices[0]=0;
            int count = 1;
            Debug.WriteLine(string.Format("Maximum values initialised to {0},at element index 0.", maxVal));
            for (int i = 1; i < integers.Length; i++)
            {
                Debug.WriteLine(string.Format("Now looking at element at index{0}",i));
                if (integers[i] > maxVal)
                {
                    maxVal = integers[i];
                    count = 1;
                    indices = new int[1];
                    indices[0] = i;
                    Debug.WriteLine(string.Format("Now maximun found,Now value is {0},at element index{1}", maxVal, i));
                }
                else
                {
                    if (integers[i] == maxVal)
                    {
                        count++;
                        int[] oldIndices = indices;
                        indices=new int[count];
                        oldIndices.CopyTo(indices,0);
                        indices[count-1]=i;
                        Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i));
                    }
                }
            }
            Trace.WriteLine(string.Format("Maximum value {0} found,with {1} occurrences",maxVal,count));
            Debug.WriteLine("Maximum values search completed.");
            return maxVal;
        }
        static void Main(string[] args)
        {
            int[] testArray = { 4, 7, 4, 2, 7, 3, 7, 8, 3, 9, 1, 9 };
            int[] maxValIndices;
            int maxVal = Maxima(testArray, out maxValIndices);
            Console.WriteLine("Maximum value {0} found at element indices:", maxVal);
            foreach (int index in maxValIndices)
            {
                Console.WriteLine(index);
            }
            Console.ReadKey();
        }
    }
}
我现在想把line26 注销掉,但是报错,我不知道这句这这里是什么意思, 函数一开始不就初始化了么
soaringbird 2013-07-16
  • 打赏
  • 举报
回复
引用 5 楼 CJavaer 的回复:
[quote=引用 4 楼 soaringbird 的回复:] for循环有可能不执行,只在for里初始化,会有编译错误提示。
你好,在函数一开始不就初始化indices了么,为什么还要在for里面初始化呢[/quote] 可能数量不一样
JS 2013-07-16
  • 打赏
  • 举报
回复
引用 4 楼 soaringbird 的回复:
for循环有可能不执行,只在for里初始化,会有编译错误提示。
你好,在函数一开始不就初始化indices了么,为什么还要在for里面初始化呢
soaringbird 2013-07-16
  • 打赏
  • 举报
回复
for循环有可能不执行,只在for里初始化,会有编译错误提示。
EnForGrass 2013-07-16
  • 打赏
  • 举报
回复
引用 2 楼 CJavaer 的回复:
[quote=引用 1 楼 caozhy 的回复:] indices=new int[1]; indices[0]=0; 其实就是 indices = { 0 }; 因为是out修饰的参数,所以必须函数自己去初始化。
你好,谢谢你的解答,indices在for循环外面不是初始化了么, 为什么在for循环里面if中还要初始化呢 if (integers[i] > maxVal) { maxVal = integers[i]; count = 1; indices = new int[1]; indices[0] = i; Debug.WriteLine(string.Format("Now maximun found,Now value is {0},at element index{1}", maxVal, i)); } 这里面的初始化的原因是因为indices数值变化了,需要扩展数组么 if (integers[i] == maxVal) { count++; int[] oldIndices = indices; indices=new int[count]; oldIndices.CopyTo(indices,0); indices[count-1]=i; Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i)); }[/quote] 开始indices长度只有一个,后面数组长度变长了。具体要看代码的逻辑了。
JS 2013-07-16
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
indices=new int[1]; indices[0]=0; 其实就是 indices = { 0 }; 因为是out修饰的参数,所以必须函数自己去初始化。
你好,谢谢你的解答,indices在for循环外面不是初始化了么, 为什么在for循环里面if中还要初始化呢 if (integers[i] > maxVal) { maxVal = integers[i]; count = 1; indices = new int[1]; indices[0] = i; Debug.WriteLine(string.Format("Now maximun found,Now value is {0},at element index{1}", maxVal, i)); } 这里面的初始化的原因是因为indices数值变化了,需要扩展数组么 if (integers[i] == maxVal) { count++; int[] oldIndices = indices; indices=new int[count]; oldIndices.CopyTo(indices,0); indices[count-1]=i; Debug.WriteLine(string.Format("Duplicate maximum found at element index {0}",i)); }
threenewbee 2013-07-16
  • 打赏
  • 举报
回复
indices=new int[1]; indices[0]=0; 其实就是 indices = { 0 }; 因为是out修饰的参数,所以必须函数自己去初始化。

110,551

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧