日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

n维数组实现(可变参数表的使用)

發(fā)布時(shí)間:2025/3/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 n维数组实现(可变参数表的使用) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先先介紹一下可變參數(shù)表需要用到的宏:

頭文件:#include<cstdarg>

void va_start( va_list arg_ptr, prev_param );?
type va_arg( va_list arg_ptr, type );?
void va_end( va_list arg_ptr );

?

va_list:用來(lái)保存宏va_start、va_arg和va_end所需信息的一種類(lèi)型。為了訪問(wèn)變長(zhǎng)參數(shù)列表中的參數(shù),必須聲明
???????????? va_list類(lèi)型的一個(gè)對(duì)象?????? 定義:?typedef char *? va_list;
va_start:訪問(wèn)變長(zhǎng)參數(shù)列表中的參數(shù)之前使用的宏,它初始化用va_list聲明的對(duì)象,初始化結(jié)果供宏va_arg和
?????????????? va_end使用;
va_arg:?展開(kāi)成一個(gè)表達(dá)式的宏,該表達(dá)式具有變長(zhǎng)參數(shù)列表中下一個(gè)參數(shù)的值和類(lèi)型。每次調(diào)用va_arg都會(huì)修改
????????????? 用va_list聲明的對(duì)象,從而使該對(duì)象指向參數(shù)列表中的下一個(gè)參數(shù);
va_end:該宏使程序能夠從變長(zhǎng)參數(shù)列表用宏va_start引用的函數(shù)中正常返回。
va在這里是variable-argument(可變參數(shù))的意思.?
這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫(xiě)一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),改函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值.

/*C++中好像不區(qū)分內(nèi)部類(lèi)與嵌套類(lèi)兩個(gè)名詞。內(nèi)部類(lèi)與嵌套類(lèi)都是指在類(lèi)中定義類(lèi)。局部類(lèi)是指在函數(shù)中定義類(lèi)。(c++不能在函數(shù)中定義函數(shù)。c++在類(lèi)中定義的函數(shù)也就是成員函數(shù)。)(c++內(nèi)部類(lèi)與java內(nèi)部類(lèi)最大的區(qū)別就是:c++的內(nèi)部類(lèi)對(duì)象沒(méi)有外部類(lèi)對(duì)象的指針,不能訪問(wèn)外部類(lèi)對(duì)象的非靜態(tài)成員;java的非靜態(tài)內(nèi)部類(lèi)對(duì)象有外部類(lèi)對(duì)象的指針,能訪問(wèn)外部類(lèi)對(duì)象的非靜態(tài)成員。) */ #include<cstdarg>//標(biāo)準(zhǔn)頭文件,提供宏va_start, va_arg, 和 va_end #include<cstdio> #include<cstdlib> #include<iostream> #include<string> #include<cstring> #define MAX_ARRAY_DIM 8 //假設(shè)數(shù)組的維數(shù)的最大值為8 using namespace std;template <typename ElemType> class MyArray{private:public:class Array{public:ElemType *base;//數(shù)組元素的基址 int dim;//數(shù)組的維數(shù)int * bounds;//數(shù)組維界基址int * constants; //數(shù)組映像函數(shù)常量基址 };static const int ERROR = -1;static const int OK = 1;int InitArray(Array &A, int dim, ...);//若維數(shù)dim和隨后的各維的長(zhǎng)度合法,則構(gòu)造相應(yīng)的數(shù)組A int DestoryArray(Array &A);//銷(xiāo)毀數(shù)組A int Value(Array A, ElemType &e, ...);//A是n為數(shù)組,e為元素變量,隨后是n個(gè)下標(biāo)值,將下標(biāo)值對(duì)應(yīng)的元素賦給e int Assign(Array &A, ElemType e, ...);//將元素e賦給指定的下標(biāo)值int Locate(Array A, va_list ap, int &off);//返回指定的下標(biāo)值對(duì)應(yīng)的偏移地址, 存放在off };template <typename ElemType> int MyArray<ElemType>::InitArray(Array &A, int dim, ...){if(dim<1 || dim > MAX_ARRAY_DIM) return MyArray::ERROR;A.dim = dim;A.bounds = (int *)malloc(dim * sizeof(int));if(!A.bounds) return MyArray::ERROR;int elemtotal = 1;va_list ap;va_start(ap, dim);//獲取存放變長(zhǎng)參數(shù)信息的數(shù)組 for(int i=0; i<dim; ++i){A.bounds[i] = va_arg(ap, int);if(A.bounds[i] < 0) return MyArray::ERROR;elemtotal *= A.bounds[i];}va_end(ap);A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType));if(!A.base) return MyArray::ERROR;A.constants = (int *)malloc(dim * sizeof(int));if(!A.constants) return MyArray::ERROR;//開(kāi)始求映像數(shù)組//int L = sizeof(ElemType);//每一個(gè)元素的大小int L = 1;//注意這里的元素的單位大小就是 1, 因?yàn)?A.base + off 實(shí)際上是 A.base+off*sizeof(ElemType);A.constants[dim-1] = L; for(int i=dim-2; i>=0; --i)A.constants[i] = A.bounds[i+1] * A.constants[i+1];return MyArray::OK; }template <typename ElemType> int MyArray<ElemType>::DestoryArray(Array &A){if(!A.base) return MyArray::ERROR;free(A.base);if(!A.bounds) return MyArray::ERROR;free(A.bounds);if(!A.constants) return MyArray::ERROR;free(A.constants); } template <typename ElemType> int MyArray<ElemType>::Value(Array A, ElemType &e, ...){va_list ap;int off;va_start(ap, e);if(Locate(A, ap, off)==MyArray::ERROR) return MyArray::ERROR;e = *(A.base+off);va_end(ap);return MyArray::OK; }template <typename ElemType> int MyArray<ElemType>::Assign(Array &A, ElemType e, ...){va_list ap;int off;va_start(ap, e);if(Locate(A, ap, off)==MyArray::ERROR) return MyArray::ERROR;*(A.base+off) = e;va_end(ap);return MyArray::OK; }template <typename ElemType> int MyArray<ElemType>::Locate(Array A, va_list ap, int &off){off = 0;for(int i=0; i<A.dim; ++i){int ind = va_arg(ap, int);if(ind<0 || ind >= A.bounds[i]) return MyArray::ERROR;off += A.constants[i]*ind;}return MyArray::OK; }class Student{public:char *name; int age;Student(){}Student(char *name, int age){this->name = name;this->age = age; }void outMsg(){cout<<"姓名: " << name << ", 年齡: " << age;} };int main(){MyArray<int> testArray;MyArray<int>::Array A;testArray.InitArray(A, 4, 1, 2, 3, 4);for(int i=0; i<1; ++i)for(int j=0; j<2; ++j)for(int k=0; k<3; ++k)for(int n=0; n<4; ++n){int e = i+j+k+n;testArray.Assign(A, e, i, j, k, n);}for(int i=0; i<1; ++i)for(int j=0; j<2; ++j)for(int k=0; k<3; ++k)for(int n=0; n<4; ++n){int e;testArray.Value(A, e, i, j, k, n);printf("%d\n", e);}MyArray<Student> testArrayx;MyArray<Student>::Array Ax;testArrayx.InitArray(Ax, 3, 4, 10, 20);//4, 10, 20分別表示六層, 座位行號(hào), 座位列號(hào) Student s("hjzgg", 23);testArrayx.Assign(Ax, s, 1, 2, 3);s.name = "lxkdd"; testArrayx.Value(Ax, s, 1, 2, 3);s.outMsg();return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/4639440.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的n维数组实现(可变参数表的使用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。