Основы С++ или как решить ребус.

Тема в разделе "WASM.BEGINNERS", создана пользователем vb_man, 23 ноя 2009.

  1. vb_man

    vb_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2009
    Сообщения:
    24
    Чего не хватает в функции f() чтобы убрать комментарии?
    Код (Text):
    1. #include <stdio.h>                      //
    2. ///////////////////
    3. int x[2][3]={1,2,3,4,5,6};
    4. int y[2][2]={10,20,30,40};
    5. ////////////////////
    6. int f1(int arr[][3])
    7. {
    8.    return(arr[1][1]);
    9. }
    10. //////////////////
    11. int f2(int arr[][2])
    12. {
    13.    return(arr[1][1]);
    14. }
    15. //////////////////
    16. /*
    17. int f(??????????)
    18. {
    19.    return(arr[1][1]);
    20. }
    21. */
    22. ///////////////
    23. void main(void)              
    24. {
    25.   printf("result f1 =    %d\n", f1(x));
    26.   printf("result f2 =    %d\n", f2(y));
    27. //  printf("result f =    %d\n", f(x));????????????
    28. //  printf("result f =    %d\n", f(y));????????????
    29. }
    Возможно ли в принципе передать размерность массива в функцию?
    В конечном счете нужна функция в которой надо работать со статическими многомерными массивами разных размерностей.

    Помогите, пожалуйста, знатоки!
     
  2. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Код (Text):
    1. // columns - количество столбцов
    2. int f(int columns, void *arr)
    3. {
    4.    int i=1,j=1;
    5.    // i - строка, j - столбец (переменные чисто для наглядности)
    6.    return *((int *)arr+i*columns+j);
    7. }
     
  3. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    любая функция строиться так: тип_возращаемого_значения само_название(тип_параметров)
    для массива будет так тип_возращаемого_значения, название_функции(масив,размер_масива)
    у тебя результат выводиться на экран, из функции печатает...стало быть вместо вопросов все че угодно мона написать главное чтоб под массив подходило...
    int array(int arr[],int n);
    ^----<размер массива
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Код (Text):
    1. template<typename T, std::size_t N>
    2. int size_arr(T(&)[N])
    3. {
    4.     return N;
    5. }
    6.  
    7. int main()
    8. {
    9.     int v[3];
    10.  
    11.     std::cout<<size_arr(v)<<'\n';
    12. }
     
  5. vb_man

    vb_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2009
    Сообщения:
    24
    Честно говоря, не расчитывал на столь быстрый и исчерпывающий ответ!
    Огромное спасибо, cppasm!
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Солидарен с GoldFinch-ем, шаблонъ круче.
    Код (Text):
    1. template <typename T, int _i1, int _i2>
    2. void foo (T (&a)[_i1][_i2])
    3. {
    4.   for (int i2=0; i2<_i2; i2++)
    5.     for (int i1=0; i1<_i1; i1++)
    6.       std::cout<<a[i1][i2]<<std::endl;
    7. }
    8.  
    9. int main (int argc, char* argv[])
    10. {
    11.   int a[5][2];
    12.   foo(a);
    13. }
     
  7. vb_man

    vb_man New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2009
    Сообщения:
    24
    GoldFinch, Booster!
    Я не совсем понял каким образом ваш код можно применить к решению моей задачи.
    Поясните, пожалуйста, на моем конкретном примере применение вашего шаблона. И чемъ круче.
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    vb_man
    А разве не видно чем круче?
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Во-первых смотря какой язык.
    В Си шаблоны идут лесом, хотя автор упоминал плюсы в названии темы.
    Насчёт круче - с одной стороны читаемее.
    С другой - для каждой размерности по сути будет сгенерирована отдельная функция -> увеличение бинарного кода, в данном случае по-моему не оправданное.
    А так каждый выбирает что ему нравится.

    Только не надо говорить что приведение типов это плохо и т.д. :)
    Это из области религии.
    Если ты понимаешь что делаешь и код работает - проблем это никаких за собой не влечёт.
    А если не понимаешь - то это уже отдельный случай, тут и с шаблонами можно наворотить.