Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Объясните новечку.
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Дим
Я пишу программу в Keil на языке С. Мне надо передать в функцию строку, а потом определить количество символов в строке.
Я делаю это так:

int Disp (unsigned char Simv[]) {
unsigned char Dlina;
unsigned char Kol_Sim;
Dlina = sizeof (Simv);
......
}

Вызываю функцию так:

Disp ("Hello");

В режиме отладки переменная Simv равна только коду первого символа, а переменная Dlina = 3. Вопрос как правильно передать строку в функцию?
Lagman
Так как это "С", то я бы написал функцию так:
Код
int Disp (const char * Simv) /* const если строка не должна меняться */
{
   unsigned char Dlina=0;
   unsigned char Kol_Sim;
   while (*Simv !='\0')
       Dlina++;
......
}


Если там есть библиотеки то можно для символьных строк использовать соответствующую библиотеку <string.h>
Old1
Цитата(Lagman @ Nov 4 2005, 20:26)
Так как это "С", то я бы написал функцию так:
Код
int Disp (const char * Simv) /* const если строка не должна меняться */
{
   unsigned char Dlina=0;
   unsigned char Kol_Sim;
   while (*Simv !='\0')
       Dlina++;
......
}

*


Пожалуй правилнее так:
Код
while (*(Simv+Dlina) !='\0')
Dlina++;

rolleyes.gif
starter48
Цитата(Дим @ Nov 4 2005, 23:31)
Я пишу программу в Keil на языке С. Мне надо передать в функцию строку, а потом определить количество символов в строке.
Я делаю это так:

int Disp   (unsigned char Simv[]) {
unsigned char Dlina;
unsigned char Kol_Sim;
Dlina = sizeof (Simv);
......
}

Вызываю функцию так:

Disp ("Hello");

В режиме отладки переменная Simv равна только коду первого символа, а переменная Dlina = 3. Вопрос как правильно передать строку в функцию?
*

Для определения длины строки в С используется ф-я strlen(), а не sizeof()
А строки передают как указатель на char (тебе уже показали как).
Попробуй так:
Код
#include<string.h>

static int Disp (const unsigned char *Simv) {
unsigned char Dlina;
unsigned char Kol_Sim;
Dlina = strlen(Simv);
......
}

Если ф-ю используешь в других модулях, то static убери. Здесь он нужен для того, чтобы компилятор знал, что это локальная ф-я, и лучше смог её оптимизировать.
Вот тебе ссылочка, где можно книги по С (не по keil, а просто по С) взять:
http://allofhack.narod.ru/c_plus.htm
Если хочешь, могу от себя пару файлов книг докинуть, по которым сам учился.
Дим
Большое спасибо всем за помошь! smile.gif Сейчас буду пробовать.
starter48, если не трудно кинь плиз dimon_g@e1.ru
starter48
Цитата(Дим @ Nov 5 2005, 15:50)
Большое спасибо всем за помошь! smile.gif Сейчас буду пробовать.
starter48, если не трудно кинь плиз dimon_g@e1.ru
*

Книги выслал.
Я вчера сообщение своё отредактировал (дописал), но почему-то сегодня уже не вижу того, что дописывал.
Ты случаем не с Паскаля на Си переходишь? Если да, то основная проблема, с которой сталкиваются люди при этом, - отсутствие в чистом Си аналога паскалевского string[]. Вместо этого в Си используют указатель на Char:
Код
в Си: char*
в Паскале: PChar = ^Char
Дим
Спасибо, файлы получил smile.gif
Я вообще ни с чего не перехожу, я только начинаю. Владею навыками basic. Там совсем все по-другому... Как-то проще.
Кстати, все получилось, все работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! cheers.gif
Krom
Ну вообще-то вряд ли sizeof вернет корректно длину строки. Не для того она предназначена. В данном случае корректнее применить strlen.
Далее, если уж решили программировать на С, разберитесь с указателями. Как правило, оперируя со строками на С, вы оперируете с указателями на эти строки. В вашем случае в функцию передается указатель на строку. В дебагере, как и положено, вы видите первый ее символ. Ну и sizeof от указателя на строку возмращает размер указателя в байтах - 3 байта, так оно и есть. Во всяком случае для 51х контроллеров указатель GENERIC как раз три байта.
Seishel
Нужно наверное просто указатель на эту строку передавать, то есть её адрес...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.