Отговори на тема  [ 27 мнения ]  Отиди на страница Предишна  1, 2
Cи масив + rs232 стринг 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
добре, пишеш си стейт машина - като получиш символ го мяташ в масив сочен от указател и си инкрементираш указателя всеки път. така докато не видиш избраният разделителен символ (или не стигнеш посочената дължина на едномерният масив - флаг за греша), после докладваш край на стринга в посоченият ти от горе указател, от там ти се дава друг указател и стейт машината ти продължава да пълни в новият указател докато не срещне пак разделителният. качваш си стейт машината на прекъсване като си защитаваш текущият стейт да не се загуби, слагаш си някой флаг за приет стринг, може да буферираш двойно стринга като имаш switch и два пойнтъра. бе врътки много, въпрос на лично решение си е :) като не работи - поправяш.


Съб Фев 13, 2010 3:53 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void check(char* string);

int main(int argc, char *argv[])
{
  check("test1-test2-test3\0");
  system("PAUSE");   
  return 0;
}

void check(char* string)
{
   unsigned int cntr;
   unsigned int cntr2=0;
   char* tmp[3][30];
   for(cntr=0;cntr<strlen(*string);cntr++)
   {
      if(*string!="-")
      {
         *tmp[cntr2][cntr]=*string;
      }
      else
         cntr2++;
   }
      printf("String 1 is %s\n",*tmp[0]);
      printf("String 2 is %s\n",*tmp[1]);
      printf("String 3 is %s\n",*tmp[2]);
}

Вижте какво сътворих на Dev-C++
За жалост не работи и дава два уарнинга :oops:
За пръв път използвам указатели! Не ми се е налагало преди :oops:
Знам ги горе-долу, но хем не мога да зацепя (явно съм малоумен), хем се бъркам :? :?
Четох това: http://home.earthlink.net/~momotuk/pointers.pdf и това: http://mytech.bg/uroci/2/C-Cplusplus/46 ... 8+%D0%B2+C


Нед Фев 14, 2010 1:29 am
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Окт 03, 2007 3:39 pm
Мнения: 311
Мнение 
Цитат:
for(cntr=0;cntr<strlen(*string);cntr++)

Това какво точно прави според теб? специално частта strlen(*string) - търси дължината на символа, към който сочи пойнтера?
strlen(string) ти е правилния вариант.

Цитат:
if(*string!="-")

Това също е леееко безмислено, *стринг винаги ти е първия символ от стринга който търсиш, не го променяш никъде ... да не говорим, че сравняваш символ със zero terminated string, това всеки свестен компилатор ще ти изреве за проблем ;-) (хинт: каква е разликата между "-" и '-' ?)

Цитат:
*tmp[cntr2][cntr]=*string;


За това изобщо не мисля да говоря, погледни горното ;-)

Като гледам адресната аритметика ти е много зле ... наблегни на нея. Ако искаш да се занимаваш със С без пойнтерите няма да минеш, просто езика си е такъв ;-)

П.С.
Цитат:
check("test1-test2-test3\0");

Това го бях пропуснал ... погледни хинта който ти дадох за сравнението ...

_________________
In God we trust. All others must submit an X.509 Certificate


Нед Фев 14, 2010 10:30 am
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void check(char* string);

int main(int argc, char *argv[])
{
  check("test1-test2-test3");
  system("PAUSE");   
  return 0;
}

void check(char* string)
{
   unsigned int cntr;
   unsigned int cntr2=0;
   char* tmp[3][30];
   for(cntr=0;cntr<strlen(string);cntr++)
   {
      if(*string!='-')
      {
         tmp[cntr2][cntr]=*string;
      }
      string++;
      else
         cntr2++;
   }
      printf("String 1 is %s\n",tmp[0]);
      printf("String 2 is %s\n",tmp[1]);
      printf("String 3 is %s\n",tmp[2]);
}

Редактирах го но дава:
Код:
C:\Documents and Settings\Administrator\Desktop\test1\main.c In function `check':
23 C:\Documents and Settings\Administrator\Desktop\test1\main.c [Warning] assignment makes pointer from integer without a cast
26 C:\Documents and Settings\Administrator\Desktop\test1\main.c syntax error before "else"


Нед Фев 14, 2010 1:56 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Авг 18, 2007 11:39 am
Мнения: 137
Местоположение: Русе
Мнение 
Това междинното string++; къде трябва да бъде когато if e 1 или 0 щото така не съм сигурен до колко е коректно по средата между if и else да го лепнеш.
Ако трябва да е при if=1 опитай така"
Код:

       if(*string!='-')
      {
         tmp[cntr2][cntr]=*string;
         string++;
      }
     
      else
      {
         cntr2++;
      }




Нед Фев 14, 2010 2:03 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Малее как се изложих. Хич не съм видял, че съм го сложил там :lol:
Сега промених кода и се компилирва. Но изкача 1 уарнинг и пак се осира :?
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void check(char* string);

int main(int argc, char *argv[])
{
  check("test1-test2-test3");
  system("PAUSE");   
  return 0;
}

void check(char* string)
{
   unsigned int cntr;
   unsigned int cntr2=0;
   char* tmp[3][30];
   for(cntr=0;cntr<strlen(string);cntr++)
   {
      if(*string!='-')
         tmp[(char)cntr2][(char)cntr]=*string;
      else
         cntr2++;
      string++;
   }
      printf("String 1 is %s\n",tmp[0]);
      printf("String 2 is %s\n",tmp[1]);
      printf("String 3 is %s\n",tmp[2]);
}


Прикачени файлове:
error.PNG
error.PNG [ 1.47 KiB | Прегледано 1788 пъти ]
Нед Фев 14, 2010 4:25 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 673
Мнение 
Работа с акумулиране на знаци , приети през ком-порта ... Аз първо бих, прибрал по най бързия начин знаците в стринг, без да претрупвам прекъсването на UART-а. Може да не съм специалист, но обработката и разделянето на приетите символи в самото прекъсване, ми е създавало големи проблеми, най-често пропускане на знаци. Често употребявам това
Код:
void __fastcall TForm1::nrComm1AfterReceive(TObject *Com, Pointer Buffer,
      DWORD Received)
{
        //
        for(int i=0; i < Received; i++)
        {
                if (((char*)Buffer)[i] == EolnChar)
                {
                        //CR detected .... do something
                        ListBox1->AddItem(ReceiveString, NULL);
                        ReceiveString = "";
                }
                //else accumulate string ...
                else ReceiveString = ReceiveString + ((char*)Buffer)[i];
        }
}

Може да си допълниш кода с някой флаг и да си обработваш стринга в отделна процедура ...
Първоначално , си мислех че компютъра е много бърз и мога да си товаря кодове кадето поискам ... но май не е така.
А до кода който си написал ... просто е непоправим. Ползвай правилото че стринговете се терминират с 0x00, с нула.
Някой стандартни функций за обработка на стрингове и масиви си искат нулата накрая. ще ти принтват символи докато не срещнат нулата ...

_________________
Вниманиене съмвишист....ИЙ.


Последна промяна RM на Нед Фев 14, 2010 5:11 pm, променена общо 2 пъти



Нед Фев 14, 2010 4:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 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
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 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
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Окт 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
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Съб Ное 28, 2009 5:50 am
Мнения: 391
Местоположение: Варна
Мнение 
Ами char* tmp[3][30] е масив от указатели, а char tmp[3][30] е само масив, който съдържа 3х30=90байта символи.


Нед Фев 14, 2010 6:30 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Що ти требва на баир лозе :)) малък си за поинтерите .. въпреки ,че рано или късно ще опреш и до тях ... дефинирай си масива и си бачкай с индексите ... така поне ще знаеш кво става с паметта :))


Нед Фев 14, 2010 8:05 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 27 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни