Очень простенький вопрос. Имеется такой код. Код (Text): #define LANG_txt ru_array unsigned char lang_text[10][10]; // в lang_text надо будет записать адрес LANG_txt unsigned char ru_array[10][10] = { {E0}, {E1}, {E2}; void set_text( unsigned char lang_text[][10] ) { lang_text = LANG_txt; // нужно чтоб по lang_text можно было обращаться к элементам двумерного массива // если тут вызвать printk("lang_text[1] = %s \n", lang_text[0]); // то выводится строка E1, как и надо } // из главной функции... main или какой другой, вызываем set_text( lang_text ); //По идее эта функция, должна записать в lang_text адрес LANG_txt , так, чтоб в главной функции можно было выводить элементы многомерного массива ru_array // но после отработки функции, значение записанное в lang_text , теряется ((( // собственно вопрос, почему? и как будет выглядеть правильно записанный код
Поторопился отправить сообщение).. маленькое исправление // если тут вызвать printk("lang_text[1] = %s \n", lang_text[1]);
T800 Передать как аргумент двумерный массив. Если не ошибаюсь то компилятор передаст адрес массива lang_text в функцию set_text . Я сам уже чтото запутался. сейчас кажется что unsigned char lang_text[10][10]; нужно объявлять как указатель (ведь мы будем тут адрес хранить на какой то двумерный массив) Как правильно написать код ?
Судя по твоему коду, ты хочешь написать функцию, которая будет копировать один массив строк в другой, вот код: Что касается твоего кода. Твоя главная ошибка: ты запутался в именах. (На будущее: всегда давай переменным разные имена!) Ты присвоил формальному параметру lang_text массив ru_array, он же LANG_text. Формальный параметр существует только внутри функции, а когда она завершает работу то он исчезает. Если есть две переменные с одинаковыми именами: одна глобальная, другая объявленная внутри функции, то обращение идет к ближайшей, то есть локальной переменной. Кроме того, ты передал функции не массив со строками, а тот массив куда они должны быть записаны.
Monogen Спасибо ОГРОМНОЕ за внятный ответ. Но я делаю не копию одного массива в другой, да и в макросах не запутался (у меня в коде их ОООЧЕНЬ много, и у них у всех внятные имена) Тут я выписал просто мелкий участок кода и дал им от балды имена. В кратце код который делаю, это модуль ядра linux (но это не важно) , сейчас пытаюсь нормальный функционал "мультиязычности" сделать . Сейчас нормально код запишу , и поясню чего нужно в конце концов получить. Для краткости не привожу код, вычисления индексов языков.(как выбираю на каком языке будет вывод модуля) Код (Text): /* массив с переводом строк о возникающих ошибках в процессе работы модуля, на английском языке. */ unsigned char errors_en_array[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE] = { {ERROR_TEXT_EN_0}, {ERROR_TEXT_EN_1}, {ERROR_TEXT_EN_2}, {ERROR_TEXT_EN_3}, {ERROR_TEXT_EN_4}, {ERROR_TEXT_EN_5}, {ERROR_TEXT_EN_6}, {ERROR_TEXT_EN_7}, {ERROR_TEXT_EN_8}, {ERROR_TEXT_EN_9}, {ERROR_TEXT_EN_10}, {ERROR_TEXT_EN_11} }; #define LANG_INDEX_0_ERRORS errors_en_array // LANG_INDEX_0_ERRORS - адрес двумерного массива с ошибками errors_en_array unsigned char error_text[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE]; // адрес массива строк содержащих описание ошибок, возникающих при работе модуля (на выбранном языке). void set_language( unsigned char error_text[][ERROR_TEXT_MAX_SIZE] ) // { error_text = LANG_INDEX_0_ERRORS; // присвоили error_text адрес двумерного массива errors_en_array printk("error_text[0] = %s \n", error_text[0]); // Проверка, выведет ли строку ошибки из errors_en_array ..... выводит ))) return; } init()// главная функция модуля { set_language( error_text ); // вызываю функцию, чтоб она записала в error_text адресс двумерного массива errors_en_array // когда доходbм до сюда, то подобный код,( как в функции set_language) printk("error_text[0] = %s \n", error_text[0]); // мне нужно чтоб оно выводило тоже самое что и внутри функции !!!!!!!!! // не работает, так как действие выполненное внутри функции (error_text = LANG_INDEX_0_ERRORS; ) не сохраняется return; } Собственно вопрос, как мне правильно код записать, так чтоб в error_text сохранялся адрес двумерного массива errors_en_array , (чтоб сохранение производилось через функцию set_language ).
Если я правильно понял, тебе нужно в массив error_text, который объявлен выше функции set_language, записать копию строк об ошибках на выбранном языке. Думаю, не выйдет как ты хочешь. Потому что и формальный параметр error_text и массив error_text объявлены не как указатели. Присвоить адрес одного статического массива другому не выйдет думаю. Можно сделать так: функция должна получить массив LANG_INDEX_0_ERRORS и внутри скопировать его содержимое в массив error_text, причем формальный параметр error_text надо переименовать. Иначе ты будешь записывать в него, а не в массив. Код: Код (Text): unsigned char errors_en_array[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE] = { {ERROR_TEXT_EN_0}, {ERROR_TEXT_EN_1}, {ERROR_TEXT_EN_2}, {ERROR_TEXT_EN_3}, {ERROR_TEXT_EN_4}, {ERROR_TEXT_EN_5}, {ERROR_TEXT_EN_6}, {ERROR_TEXT_EN_7}, {ERROR_TEXT_EN_8}, {ERROR_TEXT_EN_9}, {ERROR_TEXT_EN_10}, {ERROR_TEXT_EN_11} }; #define LANG_INDEX_0_ERRORS errors_en_array unsigned char error_text[ERROR_TEXT_COUNT][ERROR_TEXT_MAX_SIZE]; // Переименуем параметр error_text в etext, иначе строки будут записаны в параметр, // а не в массив error_text. void set_language( unsigned char etext[][ERROR_TEXT_MAX_SIZE] ) // { unsigned int i = 0; // И пишем такой код: while (i < ERROR_TEXT_COUNT) { strcpy(error_text[i],etext[i]); ++i; } return; } int init(void) { // Передаем массив со строками ошибок нужного языка. set_language(LANG_INDEX_0_ERRORS); printk("error_text[0] = %s \n", error_text[0]); return 0; }