注册 登录
编程论坛 C++教室

怎样才能定义一个动态的数组?

hyb472221439 发布于 2011-10-04 18:42, 7886 次点击
大一新生 C自习到数组了   线代刚好上到 矩阵 突发奇想 用C的数组解矩阵  
算法上有那么点想法 但是 却感觉无从下手

书上写了数组 不能动态定义 这让我很郁闷 不知道高手是怎么解决这个问题的


如果已经有写好的代码  发来 让我参考 参考 我也会不胜感激的!!
15 回复
#2
lucky5635912011-10-04 18:55
定义一个指针,然后动态申请,如
int *p;
int n;
p=new int[n];
#3
hyb4722214392011-10-04 19:16
回复 2楼 lucky563591
郁闷我还没学指针呢...
#4
lz10919149992011-10-04 19:50
程序代码:
#include <iostream>
#include <cstring>
using namespace std;

class NullPointerException {};
class MemoryException {};
class ArrayIndexOutOfBoundsException {};

class Array {
    int rows;
    int cols;
    int *pArray;
public:
    Array() : rows(0), cols(0), pArray(0) {}
    Array(int r, int c) : rows(r), cols(c)
    {
        pArray = new int[r * c];
        if (!pArray)
            throw MemoryException();
        memset(pArray, 0, sizeof(int) * r * c);
    }
    virtual void modify(int r, int c)
    {
        if (pArray)
            delete []pArray;
        pArray = new int[r * c];
        if (!pArray)
            throw MemoryException();
        memset(pArray, 0, sizeof(int) * r * c);
    }
    virtual ~Array() {
        if (pArray)
            delete []pArray;
    }
    virtual void set(int x, int y, int value)
    {
        if (!pArray)
            throw NullPointerException();
        if (x < 0 || y < 0 || x >= rows || y >= rows)
            throw ArrayIndexOutOfBoundsException();
        *(pArray + (x * cols + y)) = value;
    }
    virtual int get(int x, int y)
    {
        if (!pArray)
            throw NullPointerException();
        if (x < 0 || y < 0 || x >= rows || y >= cols)
            throw ArrayIndexOutOfBoundsException();
        return *(pArray + (x * cols + y));
    }
};

int main()
{
    Array a(5, 5);
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            a.set(i, j, i * 5 + j);
    for (int i = 0; i < 5; i++)
        for (int j = 0; j < 5; j++)
            cout << "a.get(" << i << ", " << j << ") = " << a.get(i, j) << endl;
}
这样可以不?
#5
longwu872011-10-04 20:35
别人都说了  只是C的 水平   ,你弄那么多class出来   干嘛呀   
#6
hyb4722214392011-10-04 20:37
回复 4楼 lz1091914999
郁闷...体会下新手的感受好不  给点注释啊
#7
pangding2011-10-04 20:37
如果刚开始学的话,不用在意那么多。动态的和静态的有本质上的一些区别。往后学学就知道了。
动态申请是个办法,但是比较麻烦。用 stl 里的 vector 也可以。反正就往后学就行了。
#8
hyb4722214392011-10-04 20:40
回复 7楼 pangding
那么说我现在还解决不了这个问题了
#9
pangding2011-10-04 20:40
4楼 帖的估计也是他以前写过的代码,现在加注释也比较麻烦。而且他那里用的东西多了,除了动态申请内存以外,还有异常处理之类的东西。楼主不必过多在意。
#10
pangding2011-10-04 20:43
回复 8楼 hyb472221439
总的来说是的,因为可能要用到你后面会学到的东西。

你如果想练,可以就写一个固定大小的。练算法和语法之类的不受这些东西的影响。
#11
hyb4722214392011-10-05 01:12
回复 3楼 hyb472221439
这个应该在哪里创建?为什么C++里创建出现一个1 error(s)

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Documents and Settings\Administrator\Cpp1.cpp(59) : error C2374: 'i' : redefinition; multiple initialization
        C:\Documents and Settings\Administrator\Cpp1.cpp(56) : see declaration of 'i'
C:\Documents and Settings\Administrator\Cpp1.cpp(62) : warning C4508: 'main' : function should return a value; 'void' return type assumed
执行 cl.exe 时出错.
#12
phoenzoin2011-10-05 11:02
你该不会是直接把楼上那个程序在你的编程环境下运行了吧。。。他那个应该是在VS10上写的,如果不是这个版本,main函数前应该是加void的,VS10就是加int了。。
#13
pangding2011-10-05 19:33
回复 11楼 hyb472221439
main 里面用了两次 i j,第二次 i j 你随便换两个字母就行。
#14
lz10919149992011-10-05 21:53
程序代码:
#include <stdio.h>
#include <stdlib.h>

static int *pArray;         // 指向一个任意维数的数组
static int *pDimensions;    // 所有维数
static int Dimension;       // 维数

// 初始化数组
int *initArray(int dimension, ...)
{
    int i, j = 1;
    Dimension = dimension;
    pDimensions = malloc(sizeof(int) * dimension);
    for (i = 1; i <= dimension; i++) {
        pDimensions[i - 1] = (&dimension)[i];
        j *= (&dimension)[i];
    }
    pArray = malloc(sizeof(int) * j);
}

// 根据索引获得值
int get(int dimension, ...)
{
    int i, j, k, offset = (&dimension)[dimension];
    for (i = 1; i < dimension; i++) {
        k = 1;
        for (j = 1; j <= i; j++)
            k *= pDimensions[dimension - j];
        offset += k * (&dimension)[dimension - i];
    }
    return pArray[offset];
}

// 根据索引设置值
void set(int value, ...)
{
    int i, j, k, offset = (&value)[Dimension];
    for (i = 1; i < Dimension; i++) {
        k = 1;
        for (j = 1; j <= i; j++)
            k *= pDimensions[Dimension - j];
        offset += k * (&value)[Dimension - i];
    }
    pArray[offset] = value;
}

// 释放内存
void destroy()
{
    free(pArray);
    free(pDimensions);
}

int main(void)
{
/*
    initArray(2, 3, 4) -> int[3][4]
    initArray(1, 5) -> int[5]
    initArray(3, 3, 3, 3) -> int[3][3][3]
    ...
*/
    initArray(3, 3, 3, 3);  // 三维数组
    int a[3][3][3];
    int i, j, k, count = 1;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            for (k = 0; k < 3; k++) {
                set(count, i, j, k);
                a[i][j][k] = count++;
            }
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            for (k = 0; k < 3; k++)
                printf("a[%d][%d][%d]: %d\nget(%d, %d, %d, %d): %d\n", i, j, k, a[i][j][k], 3, i, j, k, get(3, i, j, k));
    destroy();
}

/*
a[0][0][0]: 1
get(3, 0, 0, 0): 1
a[0][0][1]: 2
get(3, 0, 0, 1): 2
a[0][0][2]: 3
get(3, 0, 0, 2): 3
a[0][1][0]: 4
get(3, 0, 1, 0): 4
a[0][1][1]: 5
get(3, 0, 1, 1): 5
a[0][1][2]: 6
get(3, 0, 1, 2): 6
a[0][2][0]: 7
get(3, 0, 2, 0): 7
a[0][2][1]: 8
get(3, 0, 2, 1): 8
a[0][2][2]: 9
get(3, 0, 2, 2): 9
a[1][0][0]: 10
get(3, 1, 0, 0): 10
a[1][0][1]: 11
get(3, 1, 0, 1): 11
a[1][0][2]: 12
get(3, 1, 0, 2): 12
a[1][1][0]: 13
get(3, 1, 1, 0): 13
a[1][1][1]: 14
get(3, 1, 1, 1): 14
a[1][1][2]: 15
get(3, 1, 1, 2): 15
a[1][2][0]: 16
get(3, 1, 2, 0): 16
a[1][2][1]: 17
get(3, 1, 2, 1): 17
a[1][2][2]: 18
get(3, 1, 2, 2): 18
a[2][0][0]: 19
get(3, 2, 0, 0): 19
a[2][0][1]: 20
get(3, 2, 0, 1): 20
a[2][0][2]: 21
get(3, 2, 0, 2): 21
a[2][1][0]: 22
get(3, 2, 1, 0): 22
a[2][1][1]: 23
get(3, 2, 1, 1): 23
a[2][1][2]: 24
get(3, 2, 1, 2): 24
a[2][2][0]: 25
get(3, 2, 2, 0): 25
a[2][2][1]: 26
get(3, 2, 2, 1): 26
a[2][2][2]: 27
get(3, 2, 2, 2): 27

Process returned 1 (0x1)   execution time : 0.359 s
Press any key to continue.
*/


[ 本帖最后由 lz1091914999 于 2011-10-5 21:55 编辑 ]
#15
guilin08222011-10-06 01:02
     在c里面好像没有动态数组,如:数组a[n]其中n为变量,这种型形是禁止的。因为c在初始化时,必须对每个数组分配空间,当然如果n是变量则不能分配空间。这是C的特点。
     不过,动态数组还是可以间接做到的。
     比如定义一个足够大的数组a[m],m=1000,或更大(也就是足够大)。在程序中,可以再定义一个int变量n(n<=m),用它来控制你要取数组a[m]中的前几个元素(因为,现在不是定义数组,所以,这个n可以是变量。)。其中,在每次用完后,要记得把数组中各无素的值赋成0.为防止在后面程序中调用时出错。
#16
jcw081201102011-10-06 16:24
动态数组的形式就是指针;指向某个东西~ 但是你不知道其大小!也不可能知道除非你做一个遍历! C 也可以模拟动态数组的实现! 为什么vector 可以知道其大小那是因为 vector里面存储了一个整形值 所以能提取出大小!
1