Прошу пояснить по си

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 28 май 2010.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Очень простенький вопрос.
    Имеется такой код.
    Код (Text):
    1. #define LANG_txt   ru_array
    2. unsigned char lang_text[10][10]; // в lang_text надо будет записать адрес  LANG_txt
    3. unsigned char ru_array[10][10] = {  {E0}, {E1}, {E2};
    4.  
    5. void   set_text( unsigned char lang_text[][10] )
    6. {
    7. lang_text = LANG_txt;   // нужно чтоб по  lang_text можно было обращаться к элементам двумерного массива
    8. // если тут вызвать printk("lang_text[1] = %s \n", lang_text[0]);    
    9. // то выводится строка E1, как и надо
    10.  
    11. }
    12.  
    13. // из главной функции... main или какой другой, вызываем
    14.  
    15. set_text( lang_text  );
    16. //По идее эта функция, должна записать в lang_text адрес LANG_txt , так, чтоб в главной функции можно было выводить элементы многомерного массива ru_array
    17. // но после отработки функции, значение записанное в  lang_text , теряется (((
    18. // собственно вопрос, почему? и как будет выглядеть правильно записанный код
     
  2. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Поторопился отправить сообщение).. маленькое исправление
    // если тут вызвать printk("lang_text[1] = %s \n", lang_text[1]);
     
  3. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    featurelles
    А как ты трактуешь вот это объявление?
     
  4. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    T800
    Передать как аргумент двумерный массив.
    Если не ошибаюсь то компилятор передаст адрес массива lang_text в функцию set_text .

    Я сам уже чтото запутался.
    сейчас кажется что
    unsigned char lang_text[10][10]; нужно объявлять как указатель (ведь мы будем тут адрес хранить на какой то двумерный массив)


    Как правильно написать код ?
     
  5. make

    make New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2009
    Сообщения:
    59
    Либо завязывать с программированием, либо начать читать литературу по языкам, платформам и тд.
     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    make
    Пишем пожалуйста не бред.
     
  7. Monogen

    Monogen New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    90
    Судя по твоему коду, ты хочешь написать функцию, которая будет копировать один массив строк в другой, вот код:

    Что касается твоего кода. Твоя главная ошибка: ты запутался в именах. (На будущее: всегда давай переменным разные имена!) Ты присвоил формальному параметру lang_text
    массив ru_array, он же LANG_text. Формальный параметр существует только внутри функции, а когда она завершает работу то он исчезает. Если есть две переменные с одинаковыми именами: одна глобальная, другая объявленная внутри функции, то обращение идет к ближайшей, то есть локальной переменной. Кроме того, ты передал функции не массив со строками, а тот массив куда они должны быть записаны.
     
  8. Monogen

    Monogen New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    90
    Ошибочка

    Надо:
     
  9. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Monogen
    Спасибо ОГРОМНОЕ за внятный ответ.

    Но я делаю не копию одного массива в другой, да и в макросах не запутался (у меня в коде их ОООЧЕНЬ много, и у них у всех внятные имена) Тут я выписал просто мелкий участок кода и дал им от балды имена.
    В кратце код который делаю, это модуль ядра linux (но это не важно) , сейчас пытаюсь нормальный функционал "мультиязычности" сделать .
    Сейчас нормально код запишу , и поясню чего нужно в конце концов получить.

    Для краткости не привожу код, вычисления индексов языков.(как выбираю на каком языке будет вывод модуля)
    Код (Text):
    1. /* массив с переводом строк о возникающих ошибках в процессе работы модуля, на английском языке. */
    2. unsigned char errors_en_array[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE] = {  
    3.   {ERROR_TEXT_EN_0}, {ERROR_TEXT_EN_1}, {ERROR_TEXT_EN_2}, {ERROR_TEXT_EN_3}, {ERROR_TEXT_EN_4},
    4.   {ERROR_TEXT_EN_5}, {ERROR_TEXT_EN_6}, {ERROR_TEXT_EN_7}, {ERROR_TEXT_EN_8}, {ERROR_TEXT_EN_9},
    5.   {ERROR_TEXT_EN_10}, {ERROR_TEXT_EN_11}
    6. };
    7.  
    8. #define LANG_INDEX_0_ERRORS errors_en_array  //  LANG_INDEX_0_ERRORS  - адрес двумерного массива с ошибками errors_en_array
    9.  
    10. unsigned char error_text[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE]; // адрес массива строк содержащих описание ошибок, возникающих при работе модуля (на выбранном языке).
    11.  
    12. void set_language( unsigned char error_text[][ERROR_TEXT_MAX_SIZE] ) //
    13. {
    14.   error_text = LANG_INDEX_0_ERRORS;   // присвоили  error_text адрес двумерного массива errors_en_array
    15.   printk("error_text[0] = %s \n",  error_text[0]); // Проверка, выведет ли строку ошибки из errors_en_array ..... выводит )))
    16.  return;
    17. }
    18.  
    19. init()// главная функция модуля
    20. {
    21.  set_language( error_text ); // вызываю функцию, чтоб она записала в error_text адресс двумерного массива errors_en_array
    22.  // когда доходbм до сюда, то подобный код,( как в функции set_language)
    23. printk("error_text[0] = %s \n",  error_text[0]);  // мне нужно чтоб оно выводило тоже самое что и внутри функции !!!!!!!!!
    24. // не работает, так как действие выполненное внутри функции (error_text = LANG_INDEX_0_ERRORS; ) не сохраняется
    25. return;
    26. }
    Собственно вопрос, как мне правильно код записать, так чтоб в error_text сохранялся адрес двумерного массива errors_en_array , (чтоб сохранение производилось через функцию set_language ).
     
  10. Monogen

    Monogen New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    90
    Если я правильно понял, тебе нужно в массив error_text, который объявлен выше функции set_language, записать копию строк об ошибках на выбранном языке. Думаю, не выйдет как ты хочешь. Потому что и формальный параметр error_text и массив error_text объявлены не как указатели. Присвоить адрес одного статического массива другому не выйдет думаю. Можно сделать так: функция должна получить массив LANG_INDEX_0_ERRORS и внутри скопировать его содержимое в массив error_text, причем формальный параметр error_text надо переименовать. Иначе ты будешь записывать в него, а не в массив.
    Код:
    Код (Text):
    1. unsigned char errors_en_array[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE] = {  
    2.   {ERROR_TEXT_EN_0}, {ERROR_TEXT_EN_1}, {ERROR_TEXT_EN_2}, {ERROR_TEXT_EN_3}, {ERROR_TEXT_EN_4},
    3.   {ERROR_TEXT_EN_5}, {ERROR_TEXT_EN_6}, {ERROR_TEXT_EN_7}, {ERROR_TEXT_EN_8}, {ERROR_TEXT_EN_9},
    4.   {ERROR_TEXT_EN_10}, {ERROR_TEXT_EN_11}
    5. };
    6.  
    7. #define LANG_INDEX_0_ERRORS errors_en_array
    8.  
    9. unsigned char error_text[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE];
    10.  
    11. // Переименуем параметр error_text в etext, иначе строки будут записаны в параметр,
    12. // а не в массив error_text.
    13. void set_language( unsigned char etext[][ERROR_TEXT_MAX_SIZE] ) //
    14. {
    15.   unsigned int i = 0;
    16.   // И пишем такой код:
    17.   while (i < ERROR_TEXT_COUNT) {
    18.    strcpy(error_text[i],etext[i]);
    19.    ++i;
    20.   }
    21.   return;
    22. }
    23.  
    24. int init(void)
    25. {
    26.  // Передаем массив со строками ошибок нужного языка.
    27.  set_language(LANG_INDEX_0_ERRORS);
    28.  printk("error_text[0] = %s \n",  error_text[0]);  
    29.  return 0;
    30. }
     
  11. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Monogen
    Спасибо за ответ.
    Дальше буду сам разбираться)