Как это сделать в C (из Java)

1

В настоящее время я изучаю замечательный Arduino и некоторые C, и я пытаюсь заставить это работать. Как сделать следующее в C!

String val = "";
while(true) {
    thisChar = "2"; // this will be a "char" in C, this is finished in C, it reading from a stream, the "2" is just an example
    if(val.length < 3) {
        val = val + thisChar;
    } else {
        int num = val;
        // i will do something with my new int thing
        val = "";
    }
}

Поэтому я пытаюсь в основном получить char, сгруппировав три из них в строку, скрыв ее в int, а затем что-то с ней делать. числа, отправленные в тройках, составляют от 000 до 100!

Я опубликую то, что я придумал.

char val[];
if (client.available() > 0) { //finns åtmminstone 1 klient?
  char thisChar = client.read(); //läser av nästa byte från servern
  if( thisChar == 'H' ){
    Serial.println("HIGH from client");
    digitalWrite(led, HIGH); // lys LED
  }
  else if( thisChar == 'L' ){
    Serial.println("LOW from client");
    digitalWrite(led, LOW); // släck LED
  }
  else {
    Serial.println(thisChar);
    int len = strlen(val);
    if(len < 3) { // saknas fortfarande tecken tex 0 eller 02
      val = val + 
    }
    else { // värdet är komplett tex 010 eller 100
      val = "";
    }
  }
}

ОТВЕТ: Благодаря @morgano для чата он смог собрать следующий код из всех трех ответов!

  static char val[4] = {0}; //we only care about 3 digit numbers. 
  static int len = 0; 
  //... code blabla
  char thisChar = client.read(); //läser av nästa byte från servern
  //... code blabla
  else { 
    val[len] = thisChar; 
    len++;  
    if(len > 2) { // värdet är komplett tex 010 eller 100 
      int i;
      sscanf(val, "%d", &i);
      Serial.println(i);
      //Serial.println(val);
      len = 0; 
      //val[3] = 0; 
    }
  }
Теги:

3 ответа

1

Преобразование Java-кода непосредственно в C дает мне это. Измените размер массива на то, каким может быть ваш максимальный размер строки.

char *val;
char inputchar[10];
int num;
val= malloc(sizeof(char) *20);
while(1){
  inputchar=readclient();
  if(strlen(val) < 3)
   val = strcat(val, inputchar);
  else { 
   num= atoi(val);
   memcpy(val, '\0', 10 );
   } 
  }
 free(val);

Вам нужно проверить функции atoi и memcpy один раз.

  • 0
    Здравствуйте, я получаю эту ошибку! WiFi.ino: В функции 'void loop ()': WiFi: 53: ошибка: недопустимое преобразование из 'char' в 'const char *' WiFi: 53: ошибка: инициализация аргумента 2 для 'char * strcat (char *, const) char *) 'WiFi: 53: ошибка: несовместимые типы при назначении' char * 'для' char [10] '- я пропускаю "char inputchar [10];" как я получаю еще одну ошибку
  • 0
    Используя strcat, мне пришлось скомпилировать val и освободить его в конце, см. Отредактированный код.
1

Добавление еще одного решения, которое не подразумевает использование функций char [] или "string":

int val = 0;
int len = 0;

while(1) {
    char thisChar = clientread();
    if(len < 3) {
        val = val * 10 + (thisChar - 0x30);
        len++;
    } else {
        do_something_with_val(val);
        val = 0;
        len = 0;
    }
}
  • 0
    Здравствуйте! Я получаю эту ошибку: - WiFi.ino: В функции 'void loop ()': WiFi: 54: ошибка: недопустимые операнды типов 'char [10]' и оператор 'int' для двоичного оператора '*' WiFi: 60: ошибка : несовместимые типы в присваивании int для char [10]
  • 0
    не используйте char[10] просто используйте char , этот код не работает с массивами символов. Я подозреваю, что вам понадобится гораздо больше помощи ... мы можем открыть чат?
Показать ещё 2 комментария
1

То, что у вас хорошо выглядит - вам просто нужно решить, как "добавить" текст в свой массив char.

Я бы сохранил переменную, описывающую текущую "длину" строки. Итак, вы можете попробовать что-то вроде:

char val[4]; //we only care about 3 digit numbers. 
int valLength = 0; //No characters in the string yet.

char thisChar = client.read();

val[3] = '\0';  /* Need to terminate the string, or else... */
if (valLength < 3) {
  val[valLength] = thisChar;
  valLength++;
}
else {
  int myIntVal = strtol(val, 0, 10); //I believe this is the right syntax.  I'm not 100% sure.
  val[0] = 0;
  val[1] = 0;
  val[2] = 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню