-
FFIVE
您在这里的选择是返回一个包含您喜欢的元素的结构,或者使用函数来处理带有指针的参数。/* method 1 */struct Bar{
int x;
int y;};struct Bar funct();struct Bar funct(){
struct Bar result;
result.x = 1;
result.y = 2;
return result;}/* method 2 */void funct2(int *x, int *y);void funct2(int *x, int *y){
/* dereferencing and setting */
*x = 1;
*y = 2;}int main(int argc, char* argv[]) {
struct Bar dunno = funct();
int x,y;
funct2(&x, &y);
// dunno.x == x
// dunno.y == y
return 0;}
-
慕尼黑的夜晚无繁华
你不能直接这么做。您的选项是将多个值包装到一个结构中,或者将它们作为指针参数传递给函数。G.typedef struct blah{
int a;
float b;} blah_t;blah_t my_func(){
blah_t blah;
blah.a = 1;
blah.b = 2.0f;
return blah;}或:void my_func(int *p_a, float *p_b){
*p_a = 1;
*p_b = 2.0f;}
-
蝴蝶不菲
首先,后退一步,询问为什么需要返回多个值。如果这些值在某种程度上不相关(无论是功能上的还是操作上的),那么您需要停止并重新考虑您正在做的事情。如果各种数据项是较大的复合数据类型的一部分(例如邮件地址,或销售订单中的行项,或由多个属性描述的其他类型),则定义一个struct类型来表示单值这种综合类型:struct addr { // struct type to represent mailing address
char *name;
int streetNumber;
char *streetName;
char *unitNumber;
char *city;
char state[3];
int ZIP;};struct addr getAddressFor(char *name) {...}struct point2D {
int x;
int y;};struct polygon2D {
size_t numPoints;
struct point2D *points;};struct point2D getOrigin(struct polygon2D poly) {...}做不定义一个结构来收集与彼此无关的随机项;这只会给您和任何需要维护代码的人带来混乱。如果数据项在功能上不相关,而是以某种方式操作上相关(例如,数据加上状态标志加上关于操作或项的元数据,作为单个输入操作的一部分),然后使用多个可写参数。最明显的例子是*scanf()函数在标准库中。还有strtod()和strtol()函数,该函数转换数字的字符串表示形式;它们返回转换后的值,但它们也编写未转换为单独参数的第一个字符:char *str = "3.14159";double value;char *chk;value = strtod(str, &chk);if (!isspace(*chk) && *chk != 0)
printf("Non-numeric character found in %s\n", str);您可以将这些方法结合在一起;下面是一个受我目前正在做的工作启发的示例:typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status;typedef struct bounds {...} Bounds; tyepdef struct metadata {
size_t bytesRead;
size_t elementsRead;
size_t rows;
size_t cols;} Metadata;typedef struct elevations {
size_t numValues;
short *elevations;} Elevations;Elevations elevs;Metadata meta;Bounds b = ...; // set up search boundaryStatus stat = getElevationsFor(b, &elevs, &meta);我请求提升数据的服务返回值的一维序列;数组的维度作为元数据的一部分返回。