动态数组可不可以多次SetLength?

nonlyli 2004-11-20 10:27:02
做了个小程序,有时动态数组不够用了,想按程序运行来动态添加些,却会出现异常。
只要赋值了,就不能再重新用SetLength了。

是我做错了还是没有这种功能?
...全文
201 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
surpassable 2004-11-22
  • 打赏
  • 举报
回复
up~~~~~~~
nonlyli 2004-11-20
  • 打赏
  • 举报
回复
知道了。可能是我先前把动态数组的Index当成从1开始了。
nonlyli 2004-11-20
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
tArray:Array of Integer;
I:Integer;
begin
SetLength(tArray,10);
For I:=0 to Length(tArray)-1 do
tArray[I]:=I;

For I:=0 to Length(tArray)-1 do
ListBox1.Items.Add(IntToStr(tArray[I]));

SetLength(tArray,1000);

For I:=0 to Length(tArray)-1 do
tArray[I]:=I;

For I:=0 to Length(tArray)-1 do
ListBox1.Items.Add(IntToStr(tArray[I]));
end;

咋这次又对了呢?我再试试。
fj218 2004-11-20
  • 打赏
  • 举报
回复
动态数组可以动态通过Setlength进行扩充或减少
nonlyli 2004-11-20
  • 打赏
  • 举报
回复
测试做过了。就是说有没有办法解决。
nonlyli 2004-11-20
  • 打赏
  • 举报
回复
那如何简单地实现动态“按需扩充”动态数组呢?
王集鹄 2004-11-20
  • 打赏
  • 举报
回复
//做个测试不比发贴问来得明白?~~
var
A: array of Integer;
begin
SetLength(A, 1);
A[0] := 1234567;
SetLength(A, 2);
ShowMessage(IntToStr(A[0]));
end;
todouwang 2004-11-20
  • 打赏
  • 举报
回复
setlonth后数组的内存分配已固定,应该不能再次setlongth 了
IO ============================================================================================================================================= * Input /Output 输入 输出 保存文件 读取文件 java.io 包 java.io.File ============================================================================================ *表示磁盘文件或目录的路径 *可以表示一个不存在的路径 创建实例 ------------------------------------- 1 File f=new File("d:/abc") (d:\\abc) 2 File f=new File ("目录","文件名") 创建一个 File 封装对象 可以不存在 方法 -------------------------------------------- 文件、目录属性方法 文件、目录属性 canRead() canWrite() canExecute() 是否可读可写可执行 isHidden() 是否隐藏文件 exists() 表示的路径是否存在 getAbsolutePath() 完整路径 getName() 文件名 getParent() 父目录 lastModified() 最后修改时间,毫秒值 length() 文件字节量,对目录无效 isDirectory() 是否文件夹 isFile() 是否文件 getTotalSpace() 空间总大小 getFreeSpace() 可用空间 文件、目录操作 createNewFile() 创建文件 delete() 删除文件或“空目录” mkdir() 创建单层目录 mkdirs() 创建多层目录 renameTo() 改名、移动 *) 创建删除重命名方法返回 boolean,表示操作是否成功 File.createTempFile() 在系统临时目录创建临时文件 目录列表 list() 返回 String[],包含子文件、子目录名称 listFiles() 返回 File[],包含子文件、子目录的 File 对象 list(FilenameFilter) listFiles(FilenameFilter) listFiles(FileFilter) 只列出符合过滤条件的文件、目录, 参数: 外接的过滤器 private static void test1() { // File f=new File("d:/rand.txt"); // File f=new File("d:/abad"); File f=new File("d:/scq"); System.out.println("是否可读:"+f.canRead()); System.out.println("是否可写:"+f.canWrite()); System.out.println("是否是隐藏:"+f.isHidden()); System.out.println("文件的绝对路径:"+f.getAbsolutePath()); System.out.println("获得文件名:"+f.getName()); System.out.println("获得父类目录名:"+f.getParent()); System.out.println("获得最后一次修改时间:"+f.lastModified()); System.out.println("文件字节量:"+f.length()); System.out.println("是否是目录:"+f.isDirectory()); System.out.println("是否是文件:"+f.isFile()); System.out.println("获得总空间大小:"+f.getTotalSpace()); System.out.println("获得剩余空间大小:"+f.getFreeSpace()); } 文件目录操作方法 public class Test2 { /** * @author aibin zhang * @param args * @throws IOException */ public static void main(String[] args) throws IOException { test4(); } //创建临时文件 文件名称不能太短 private static void test4() throws IOException { File f = File.createTempFile("abc", ".txt"); System.out.println(f.getAbsolutePath()); } // 测试renameto方法 移动和更改问价名 private static void test3() { File f1 = new File("d:/rand.txt"); File f2 = new File("d:/r.txt"); // 刚改前查看文件是否存在 System.out.println(f1.getName() + "是否存在" + f1.exists()); System.out.println(f2.getName() + "是否存在" + f2.exists()); // 使用renameto方法 System.out.println("文件名是否更改成功:" + f1.renameTo(f2)); // 改名以后的的状态 System.out.println(f1.getName() + "是否存在" + f1.exists()); System.out.println(f2.getName() + "是否存在" + f2.exists()); } // 测试创建单层目录mkdir和多层目录mkdirs private static void test2() { File f = new File("d:/dir1/dir2"); if (f.exists()) { System.out.println("是否成功删除:" + f.delete()); // 获得父类目录文件对象实例调用delete方法删除 f.getParentFile().delete(); } else { System.out.println("是否成功创建:" + f.mkdirs()); } } // 测试创建和删除文件 private static void test1() throws IOException { File f = new File("d:/f1.dlkjkajsdklgjexe"); if (f.exists()) {// 是够存在此文件 System.out.println("是否成功删除:" + f.delete()); } else { System.out.println("是否成功创建:" + f.createNewFile()); } } } 目录列表 --------------------------------------------------------------------------------- list listFlie list(FilenameFilter ) 文件名称过滤器 listFiles(FilenameFilter) 文件属性过滤器 public class Test1 { public static void main(String[] args) { test1(); } /////////////////////2014-8-23文件筛选操作 private static void test1() { File f=new File("D:/bookandimage"); String [] name=f.list(new FilenameFilter() { public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".zip"); } }); File [] files=f.listFiles(new FileFilter() { public boolean accept(File f) { return f.length()>=20*1024; } }); for (File file : files) { int len=(int) (file.length()/1024); System.out.println(file.getName()+"---"+len+"KB"); } for( String na : name) { System.out.println(na); } } } ///////////查看目录大小 // 主要用到的是 listfiles isFile package tarena.day1802; import java.io.File; import java.util.Scanner; public class Test1 { public static void main(String[] args) { System.out.println("输入目录:"); String path=new Scanner(System.in).nextLine(); File dir=new File(path); long len=dirLength(dir); System.out.println(len/1024+"KB"); } private static long dirLength(File dir) { /* * 1 定义累加变量 long len * 2 获得目录列表 dir.listFiles赋给files * 3 判断files数组是否是null值 * 如果是null 返回return 0; * 5遍历从数组files取出的每个对象 赋给f * 6判断f是文件 * 获得文件大小累加到len * 否则是文件夹 * 再调用自身方法 dirLength * 求文件夹大小累加到len * return len; * */ long len=0; File [] files=dir.listFiles(); if(files==null){ return 0; } for (File file : files) { if(file.isFile()){ len+=file.length(); }else { len+=dirLength(file); } } return len; } } ////删除目录 public class Test1 { public static void main(String[] args) { System.out.println("输入目录名"); String path=new Scanner(System.in).nextLine(); File dir=new File(path); boolean success=dirDelete(dir); if(success){ System.out.println("删除成功!"); }else{ System.out.println("删除失败!!"); } } private static boolean dirDelete(File dir) { /* * 2 获得目录列表 dir.listFiles赋给files * 3 判断files数组是否是null值 * 并返货尝试直接删除是否成功; * 5遍历从数组files取出的每个对象 赋给f * 6判断f是文件 * 直接删除f * 如果删除返回false * 否则是文件夹 * 再调用自身方法dirDelete来删除文件夹f * 如果失败则返回false * 遍历结束 删除 dir * 如果失败则返回 * */ File[] files = dir.listFiles(); if(files==null)return dir.delete(); for (File file : files) { if(file.isFile()){ if(!file.delete())return false; }else{ if(!dirDelete(file))return false; } } return dir.delete(); } } ================================================================================== java.io.RandomAccessFile --------------------------------------------------------------- // ***用来读写文件 //将一个文件看做是一个字节数组 //用下标值访问摸个位置的字节值 创建实例 ----------------------- 1 RandomAccessFile raf= new RandomAccessFile(文件,“r”) r 只读模式 1 RandomAccessFile raf= new RandomAccessFile(文件,“rw”) r 读写模式 方法 ------------------------ 写字节 write() -------- -------- write (int b) 将int 四字节中的末尾字节 写到文件里 【1】【2】【3】【4】 --》【4】 write ( byte [] b) 将数组中所有字节值 全部写到文件 write (byte [] buf,int start ,int n) 将数组中的start开始位置,n个范围中的字节值,写到文件 读字节 read() --------- --------- read() 读取一个字节值,再前面补三个0字节 变成 int 类型 [4] --> [1][2][3][4] 如果没有数据,返回 -1; read ( byte[] buf) 根据数组的长度读取一批字节值,放入数组 一次读取的长度是数组的长度 返回每次存放到数组中的字节数量 如果没有数据 则返回 -1; seek(int position) 将指针定位到指定位置 public class Test1 { public static void main(String[] args) throws IOException{ /* * 如果文件不存在 自动新年检文件 * 如果文件夹不存在则出现FileNotFoundException、 * * */ RandomAccessFile raf=new RandomAccessFile("d:/f2.mp3", "rw"); //写入单个字节值 raf.write(97); raf.write(98); raf.write(99); raf.write(100); //写入一组数组字节 byte [] buf={101,102,103,104,105,106}; raf.write(buf); raf.write(buf,2,3); //调用seek 将指针调回 raf.seek(0); //读取文件字节 //单个字节读取 int b;//定义一个变量 int b 用来保存每次读取的字节值 while ((b=raf.read())!=-1){ System.out.println(b); } raf.seek(0); buf=new byte[5]; int n ; //用来保存每次读取或放入数组中的字节数量 while((n=raf.read(buf))!=-1){ System.out.print(n+"--"); System.out.println(Arrays.toString(buf)); // while循环最后会打印出重复数据 //for循环可以避免打印出重复数据 for (int i = 0; i < n; i++) { System.out.println(buf[i]); } } //关闭数据连接 raf.close(); } } print out 97 98 99 100 101 102 103 104 105 106 103 104 105 5--[97, 98, 99, 100, 101] 97 98 99 100 101 5--[102, 103, 104, 105, 106] 102 103 104 105 106 3--[103, 104, 105, 105, 106] 103 104 105 writeInt (int b ) 输出 int 的四个字节 writeDouble(double b) 输出 double 的八个字节 writeUTF(String s) 先输出2个字节 表示字符串的字节长度 在输出字符串的字节数据 readInt() 读取4个字节作为一个int值 readDouble () 读取8个字节作为一个double值 readUTF() 先读取2个字节来确定字符创长度 在读取字符串的字节值 EOFException read读取异常 public class Test2 { public static void main(String[] args) throws Exception { test1(); } private static void test1() throws Exception { RandomAccessFile raf=new RandomAccessFile("d:/f3.java", "rw"); raf.write(97); raf.writeInt(97); raf.writeDouble(3.14); raf.writeUTF("a中"); raf.seek(0); //从头到尾单字节输出 int b; while((b=raf.read())!=-1){ System.out.println(b); } System.out.println("****************************"); //从头到尾批量输出 raf.seek(0); byte [] buf=new byte[5]; while((b=raf.read(buf))!=-1){ System.out.println(b); System.out.println(Arrays.toString(buf)); } // //////////////////////////////////////////////// raf.seek(0); System.out.println("*********************************"); System.out.println("*********************************"); //read 是单字节读取 System.out.println(raf.read()); //读取int型数据 System.out.println(raf.readInt()); //读取Double类型数据 System.out.println(raf.readDouble()); //读取String类型数据 System.out.println(raf.readUTF()); raf.close(); } } getFilePointer() 获得指针当前位置 setLength(字节长度); 事先给数据把空间留足 可以将数据截取处理为指定长度 可以扩大数据物理空间为指定长度 -------------------------------------------------------------------------------- public class Test3 { /**@author aibin zhang * @param args */ public static void main(String[] args) { test1(); } private static void test1() { File f=new File("D:/bookandimage"); //转换成list String数组存放文件名称 String[] s=f.list(); //转换成listFiles file数组 File [] files=f.listFiles(); for (String s1 : s) { System.out.println(s1); } System.out.println("************************"); for (File file : files) { int l=(int) file.length()/1024/1024; System.out.println(file.getName()+"--"+l+"MB"); } } } 字段摘要 static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 static char pathSeparatorChar 与系统有关的路径分隔符。 static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 static char separatorChar 与系统有关的默认名称分隔符。 构造方法摘要 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。 方法摘要 boolean canExecute() 测试应用程序是否可以执行此抽象路径名表示的文件。 boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 int compareTo(File pathname) 按字母顺序比较两个抽象路径名。 boolean createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 static File createTempFile(String prefix, String suffix) 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 static File createTempFile(String prefix, String suffix, File directory) 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 boolean delete() 删除此抽象路径名表示的文件或目录。 void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。 boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 File getAbsoluteFile() 返回此抽象路径名的绝对路径名形式。 String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 File getCanonicalFile() 返回此抽象路径名的规范形式。 String getCanonicalPath() 返回此抽象路径名的规范路径名字符串。 long getFreeSpace() 返回此抽象路径名指定的分区中未分配的字节数。 String getName() 返回由此抽象路径名表示的文件或目录的名称。 String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 File getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 String getPath() 将此抽象路径名转换为一个路径名字符串。 long getTotalSpace() 返回此抽象路径名指定的分区大小。 long getUsableSpace() 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。 int hashCode() 计算此抽象路径名的哈希码。 boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。 boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 long length() 返回由此抽象路径名表示的文件的长度。 String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 File[] listFiles(FilenameFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。 static File[] listRoots() 列出可用的文件系统根。 boolean mkdir() 创建此抽象路径名指定的目录。 boolean mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。 boolean setExecutable(boolean executable) 设置此抽象路径名所有者执行权限的一个便捷方法。 boolean setExecutable(boolean executable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的执行权限。 boolean setLastModified(long time) 设置此抽象路径名指定的文件或目录的最后一次修改时间。 boolean setReadable(boolean readable) 设置此抽象路径名所有者读权限的一个便捷方法。 boolean setReadable(boolean readable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的读权限。 boolean setReadOnly() 标记此抽象路径名指定的文件或目录,从而只能对其进行读操作。 boolean setWritable(boolean writable) 设置此抽象路径名所有者写权限的一个便捷方法。 boolean setWritable(boolean writable, boolean ownerOnly) 设置此抽象路径名的所有者或所有用户的写权限。 String toString() 返回此抽象路径名的路径名字符串。 URI toURI() 构造一个表示此抽象路径名的 file: URI。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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