реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Объясните новечку., Как передать строку в функцию?
Дим
сообщение Nov 4 2005, 16:31
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Я пишу программу в Keil на языке С. Мне надо передать в функцию строку, а потом определить количество символов в строке.
Я делаю это так:

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

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

Disp ("Hello");

В режиме отладки переменная Simv равна только коду первого символа, а переменная Dlina = 3. Вопрос как правильно передать строку в функцию?
Go to the top of the page
 
+Quote Post
Lagman
сообщение Nov 4 2005, 17:26
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



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


Если там есть библиотеки то можно для символьных строк использовать соответствующую библиотеку <string.h>
Go to the top of the page
 
+Quote Post
Old1
сообщение Nov 4 2005, 19:03
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(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
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 4 2005, 19:55
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(Дим @ 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
Если хочешь, могу от себя пару файлов книг докинуть, по которым сам учился.
Go to the top of the page
 
+Quote Post
Дим
сообщение Nov 5 2005, 08:50
Сообщение #5





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Большое спасибо всем за помошь! smile.gif Сейчас буду пробовать.
starter48, если не трудно кинь плиз dimon_g@e1.ru
Go to the top of the page
 
+Quote Post
starter48
сообщение Nov 5 2005, 13:04
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(Дим @ Nov 5 2005, 15:50)
Большое спасибо всем за помошь! smile.gif Сейчас буду пробовать.
starter48, если не трудно кинь плиз dimon_g@e1.ru
*

Книги выслал.
Я вчера сообщение своё отредактировал (дописал), но почему-то сегодня уже не вижу того, что дописывал.
Ты случаем не с Паскаля на Си переходишь? Если да, то основная проблема, с которой сталкиваются люди при этом, - отсутствие в чистом Си аналога паскалевского string[]. Вместо этого в Си используют указатель на Char:
Код
в Си: char*
в Паскале: PChar = ^Char
Go to the top of the page
 
+Quote Post
Дим
сообщение Nov 5 2005, 18:01
Сообщение #7





Группа: Новичок
Сообщений: 12
Регистрация: 20-10-05
Пользователь №: 9 894



Спасибо, файлы получил smile.gif
Я вообще ни с чего не перехожу, я только начинаю. Владею навыками basic. Там совсем все по-другому... Как-то проще.
Кстати, все получилось, все работает!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! cheers.gif
Go to the top of the page
 
+Quote Post
Krom
сообщение Nov 21 2005, 13:52
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 107
Регистрация: 27-06-05
Из: Россия
Пользователь №: 6 324



Ну вообще-то вряд ли sizeof вернет корректно длину строки. Не для того она предназначена. В данном случае корректнее применить strlen.
Далее, если уж решили программировать на С, разберитесь с указателями. Как правило, оперируя со строками на С, вы оперируете с указателями на эти строки. В вашем случае в функцию передается указатель на строку. В дебагере, как и положено, вы видите первый ее символ. Ну и sizeof от указателя на строку возмращает размер указателя в байтах - 3 байта, так оно и есть. Во всяком случае для 51х контроллеров указатель GENERIC как раз три байта.

Сообщение отредактировал Krom - Nov 21 2005, 13:54
Go to the top of the page
 
+Quote Post
Seishel
сообщение Feb 9 2006, 15:28
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 38
Регистрация: 9-02-06
Пользователь №: 14 149



Нужно наверное просто указатель на эту строку передавать, то есть её адрес...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 20:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016