2014-12-18 3 views
0

Интересно, как я могу вычеркнуть массив из C в несколько аргументов функции. После того, как я увидел удивительный синтаксический сахар от Go (golang), я думаю об этом.Как передать массив как список аргументов функции с различным количеством параметров в C

С код:

#include <stdio.h> 
#include <stdarg.h> 

// assert: all args are valid ints 
void printEach(int len, ...) { 
     // Irrelevant, this function print their arguments 
     // And I know how to use va_start, va_arg... 
} 

void handleVet(int* v, int n) { 
    // **HERE is my the question!!!** 
    printEach(n, v[0]...[n]) // <----------- NON-C code. I need it. 
} 

int main(void) { 
    int v[] = {12,14,15,15}; 
    //I can do that only because the vector is static. I know the len when I'm coding 
     printEach(4, v[0],v[1],v[2],v[3]); 
    // But if we imagine an arbitrary vector, we got a problem 
     handleVet(v, 4); 
    return 0; 
} 

К примеру, в ходу было бы:

package main 

import "fmt" 

func printEach (v ...int64) { 
    // Irrelevant, this function print their arguments 
} 

func main() { 
    var arr []int64 = []int64{1,14,15,} 
    printEach(arr...) 
} 

Как можно достичь того же эффекта "printEach (обр ...)" в C?

+0

Если вы хотите решение в C не маркируют C++. – Borgleader

+0

Должно ли это быть ** массив **? – Nard

+0

Не знаю. Но он просит var_arg в C или это проще? – dhein

ответ

0

Это элементарный пример того, как vararg работает в С. я не был в состоянии взять референс к вашему ходу, например, как я не udnerstand, что делает ваш код , Надеюсь, этот минимальный пример достаточно ясен. Если у вас есть какие-либо вопросы, спрашивайте меня, и я буду редактировать его в

void Foo(size_t sizeParamAmount, char *types, ...); 
void Foo(size_t sizeParamAmount, char *types, ...) 
{ 
    size_t i; 
    float fTmp; 
    int iTmp;  
    va_list vlArgList; 

    va_start (vlArgList, sizeParamAmount); 

    for (i= 0; i< sizeParamAmount; i++) 
    { 
     switch (types[i]) 
     {   
      case 'i': 
       iTmp = va_arg (vlArgList, int)); 
       break; 
      case 'f': 
       fTmp = va_arg (vlArgList, float)); 
       break; 
      default: 
       return;//error 
     } 
    } 
    va_end(vlArgList); 
} 

После прочтения вашего редактирования:.

Как я уже сделал в моем минимальном примере, вы можете передать в указатель перед var_arg, который является объясняя, какой аргумент какого типа. так что вы могли бы назвать Foo таким образом:

Foo (3, "ifi", 3, 5.973, 92); 

И после прочтения вашего комментария к другому ответу, который я получил то, что вы спрашиваете.

В этом случае вы действительно должны указывать указатель (или массив без [] ведет себя так же), который содержит токен конца содержимого.

В любом случае есть способ. но вам приходилось обманывать токены предварительной обработки.

И будет полностью соответствовать вашим потребностям. Этот ответ в любом случае предоставит вам запрошенную нотацию. вам нужно было установить для PRED ограничение по размеру (yourarray), и пусть OP принимает отдельные элементы.

https://stackoverflow.com/a/10542793/2003898

Но, к сожалению, не более минимальный пример.

+0

Это все еще не то, что я хочу. Я попробую объяснить это снова в моем вопросе. Но хороший ответ (я не могу отдать должное вам, потому что моя репутация низкая. Извините). – Danilo

+1

Хорошо. Я выбираю ваш ответ, но, думаю, вы так много внимания уделяли неправильному ответу. Я знал, как использовать stdarg.h в C. Самая важная часть вашего ответа - финал. – Danilo

0

Вам нужно указать размер массива. Вот что это может выглядеть следующим образом:

void printEach(int* values, int size) 
{ 
    if(size==0) 
    return; 
    printf("%d", value[0]); 
    printEach(values+1, size-1); 
} 
Смежные вопросы