|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 4:46 am
| Автор |
Съобщение |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
добре, пишеш си стейт машина - като получиш символ го мяташ в масив сочен от указател и си инкрементираш указателя всеки път. така докато не видиш избраният разделителен символ (или не стигнеш посочената дължина на едномерният масив - флаг за греша), после докладваш край на стринга в посоченият ти от горе указател, от там ти се дава друг указател и стейт машината ти продължава да пълни в новият указател докато не срещне пак разделителният. качваш си стейт машината на прекъсване като си защитаваш текущият стейт да не се загуби, слагаш си някой флаг за приет стринг, може да буферираш двойно стринга като имаш switch и два пойнтъра. бе врътки много, въпрос на лично решение си е  като не работи - поправяш.
|
| Съб Фев 13, 2010 3:53 pm |
|
 |
|
darkshy
Ранг: Популярен
Регистриран на: Съб Ное 28, 2009 5:50 am Мнения: 391 Местоположение: Варна
|
Вижте какво сътворих на Dev-C++
За жалост не работи и дава два уарнинга
За пръв път използвам указатели! Не ми се е налагало преди
Знам ги горе-долу, но хем не мога да зацепя (явно съм малоумен), хем се бъркам
Четох това: http://home.earthlink.net/~momotuk/pointers.pdf и това: http://mytech.bg/uroci/2/C-Cplusplus/46 ... 8+%D0%B2+C
|
| Нед Фев 14, 2010 1:29 am |
|
 |
|
goose
Ранг: Популярен
Регистриран на: Сря Окт 03, 2007 3:39 pm Мнения: 311
|
Това какво точно прави според теб? специално частта strlen(*string) - търси дължината на символа, към който сочи пойнтера? strlen(string) ти е правилния вариант. Това също е леееко безмислено, *стринг винаги ти е първия символ от стринга който търсиш, не го променяш никъде ... да не говорим, че сравняваш символ със zero terminated string, това всеки свестен компилатор ще ти изреве за проблем  (хинт: каква е разликата между "-" и '-' ?) За това изобщо не мисля да говоря, погледни горното  Като гледам адресната аритметика ти е много зле ... наблегни на нея. Ако искаш да се занимаваш със С без пойнтерите няма да минеш, просто езика си е такъв  П.С.
Това го бях пропуснал ... погледни хинта който ти дадох за сравнението ...
_________________ In God we trust. All others must submit an X.509 Certificate
|
| Нед Фев 14, 2010 10:30 am |
|
 |
|
darkshy
Ранг: Популярен
Регистриран на: Съб Ное 28, 2009 5:50 am Мнения: 391 Местоположение: Варна
|
|
| Нед Фев 14, 2010 1:56 pm |
|
 |
|
the_bull
Ранг: Новодошъл
Регистриран на: Съб Авг 18, 2007 11:39 am Мнения: 137 Местоположение: Русе
|
Това междинното string++; къде трябва да бъде когато if e 1 или 0 щото така не съм сигурен до колко е коректно по средата между if и else да го лепнеш.
Ако трябва да е при if=1 опитай така"
|
| Нед Фев 14, 2010 2:03 pm |
|
 |
|
darkshy
Ранг: Популярен
Регистриран на: Съб Ное 28, 2009 5:50 am Мнения: 391 Местоположение: Варна
|
Малее как се изложих. Хич не съм видял, че съм го сложил там
Сега промених кода и се компилирва. Но изкача 1 уарнинг и пак се осира
|
| Нед Фев 14, 2010 4:25 pm |
|
 |
|
RM
Ранг: Почетен член
Регистриран на: Нед Окт 19, 2008 7:26 pm Мнения: 673
|
Работа с акумулиране на знаци , приети през ком-порта ... Аз първо бих, прибрал по най бързия начин знаците в стринг, без да претрупвам прекъсването на UART-а. Може да не съм специалист, но обработката и разделянето на приетите символи в самото прекъсване, ми е създавало големи проблеми, най-често пропускане на знаци. Често употребявам това
Може да си допълниш кода с някой флаг и да си обработваш стринга в отделна процедура ...
Първоначално , си мислех че компютъра е много бърз и мога да си товаря кодове кадето поискам ... но май не е така.
А до кода който си написал ... просто е непоправим. Ползвай правилото че стринговете се терминират с 0x00, с нула.
Някой стандартни функций за обработка на стрингове и масиви си искат нулата накрая. ще ти принтват символи докато не срещнат нулата ...
_________________ Вниманиене съмвишист....ИЙ.
Последна промяна RM на Нед Фев 14, 2010 5:11 pm, променена общо 2 пъти
|
| Нед Фев 14, 2010 4:35 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2277
|
Колегата goose ти е написал примерче. Вземи го изследвай да видиш какво и кога се случва. Не скачай в през дълбоките води, ако не можеш да прецапаш малкото ручейче  .
Указателите, както говори името им сочат някаква памет - int *ptr = 0x0010 - в този случай ptr ще сочи клетката от паметта 0x0010. Ако искаш да получиш съдържанието и използваш int value = *ptr. Най-лесно може да схванеш за какво става дума като си направиш няколко фукции за работа със списъци.
Ако имаме следната структура:
typedef struct __node
{
int data;
struct __node *next;
}NODE;
Най-обикновен списък (list) би изглеждал така: list->data="данни", list->next = "адреса на следващия елемент от списъка", "адреса на следващия елемент от списъка"->data="данни", "адреса на следващия елемент от списъка"->next="адреса на следващия елемент от списъка"...
като за последният елемент "адреса на следващия елемент от списъка"=NULL.
За да обходим списъка:
NODE *head, *list; /* head - да запазим началото на списъка, list - указател към първия елемент */
head = list;
while(head)
{
printf("data: %d\n", head->data);
head = head->next;
}
Това при положение, че си попълнил предварително списъка с някакви елементи. Пускаш цялото нещо през дебъгера и стъпка по стъпка следиш какво става head и next. Предполагам, че доста бързо ще ти се изясни.
|
| Нед Фев 14, 2010 4:38 pm |
|
 |
|
Cino
Ранг: Новодошъл
Регистриран на: Чет Окт 02, 2008 10:24 pm Мнения: 105
|
@darkshy
защо е този масив от указатели ? char* tmp[3][30];
и как може да се дава на printf указател към масив от указатели.
char* tmp[3][30];
това на контролер ще задели 180 байта примерно , които не можеш да ги ползваш за друго.
после , къде масивите завършват с '\0'. за да станат стрингове.
и в първия пост си писал че последния стринг не завършва с делимитера , ами с '\0'.
в този цикъл как ще намериш последния '\0' , като търсиш делимитер.
|
| Нед Фев 14, 2010 5:02 pm |
|
 |
|
goose
Ранг: Популярен
Регистриран на: Сря Окт 03, 2007 3:39 pm Мнения: 311
|
За сега не мислим за паметта, това ще дойде на следващ етап
darkshy, още една задачка: помиси каква е разликата между char* tmp[3][30]; и char tmp[3][30];
Не, че не мога да ти го дам работещо, но със сигурност тогава няма да научиш нищо 
_________________ In God we trust. All others must submit an X.509 Certificate
|
| Нед Фев 14, 2010 5:16 pm |
|
 |
|
darkshy
Ранг: Популярен
Регистриран на: Съб Ное 28, 2009 5:50 am Мнения: 391 Местоположение: Варна
|
Ами char* tmp[3][30] е масив от указатели, а char tmp[3][30] е само масив, който съдържа 3х30=90байта символи.
|
| Нед Фев 14, 2010 6:30 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Що ти требва на баир лозе  ) малък си за поинтерите .. въпреки ,че рано или късно ще опреш и до тях ... дефинирай си масива и си бачкай с индексите ... така поне ще знаеш кво става с паметта  )
|
| Нед Фев 14, 2010 8:05 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|