2015-08-28 3 views
2

После компиляции моего C кода с -Wall активированного следующие предупреждений появилосьВозвращение заявления с более чем аргументами

left operand of comma operator has no effect 

, которые связаны с многочисленными аргументами, представленных в моих return заявлениях. История такова: Предположим, что у вас есть куча динамически распределенных 3D-массивов (A, B и C) и вы хотите сделать некоторые манипуляции с ними. Массивы определяются как указатель на указатель на указатель и выделяются с помощью malloc (стандартная процедура). Манипуляция с ними будет выполняться в отдельных функциях. По какой-то причине я объявляю функции как тройной указатель и следующим образом:

***func(double ***A, double ***B, double ***C) 
{ 
    do some work here on A, B and C 
    return(A, B, C); 
} 

Я знаю, что массивы переходят в функцию в качестве ссылки так, по существу нет необходимости возвращать что-то из этой функции. Но, можете ли вы сказать мне, почему кто-то объявит функцию таким образом. Этот персонал меня смущает. Заранее спасибо

+0

Почему бы не вернуть массив – Sunny

+1

'*** FUNC (...' не действует C. По крайней мере, если нет предварительной процессор магии пошел на перед компиляцией ... – alk

+0

@sergej Да. Спасибо – dimpep

ответ

5

return(A, B, C) is not C, вы можете использовать struct для возврата более чем к одному аргументу.

struct array3d{ 
    double* A; 
    double* B; 
    double* C; 
}; 

struct array3d* func(struct array3d* p) { 
    /* do some work here on p->A, p->B and p->C */ 
    return p; 
} 

Вот рабочий пример с *** указателями:

#include <stdio.h> 
#include <malloc.h> 

struct array3d { 
    double*** A; 
    double*** B; 
    double*** C; 
}; 

struct array3d* func(struct array3d* p) { 
    /* do some work here on A, B and C */ 

    ***p->A /= 42.0; 
    ***p->B /= 42.0; 
    ***p->C /= 42.0; 

    return p; 
} 

int main() 
{ 
    struct array3d arr; 
    struct array3d* p_arr; 

    double A[] = { 1.0, 3.0}; // ... 
    double B[] = {-1.0, -2.0}; 
    double C[] = { 2.0, 4.0}; 

    double* p1A = A; 
    double* p1B = B; 
    double* p1C = C; 

    double** p2A = &p1A; 
    double** p2B = &p1B; 
    double** p2C = &p1C; 

    arr.A = &p2A; 
    arr.B = &p2B; 
    arr.C = &p2C; 

    p_arr = func(&arr); 

    printf("(A = %f, B = %f, C = %f)\n", ***p_arr->A, ***p_arr->B, ***p_arr->C); 

    return 0; 
} 
+0

@MichaelWalz Спасибо. – sergej

0

Код

***func(double ***A, double ***B, double ***C) 
{ 
    do some work here on A, B and C 
    return(A, B, C); 
} 

просто неправильно, даже если она составляет:

  1. Если функция retur ns все через свои аргументы A, B и C, он не должен иметь тип возврата. . I. е, она должна быть объявлена ​​вернуться void:

    void func(double ***A, double ***B, double ***C) { 
    
  2. Синтаксис return(A, B, C) не делать то, что вы думаете, что он делает. Он не создает список или передает три значения в return. Вместо этого он вычисляет выражение A, отклоняет его значение, вычисляет B, выдает его значение, вычисляет C, принимает значение C как значение выражения (A, B, C) и, наконец, возвращает это значение из функции. (Google «C-comma operator» для получения дополнительной информации.)

  3. Если ваша функция объявлена ​​как возвращающая void (как это и должно быть), просто нет необходимости в операторе return.

Смежные вопросы