1+2 дают 540... не пойму почему

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

переводу массив char в числа, разбирая на части

tmpchar[2]={1,2}

Serial.println(tmpchar[0]);Serial.println(tmpchar[1]);
//в мониторе 1 и 2
 
нокогда вот так собираю
 
       int hour=tmpchar[0]*10+tmpchar[1]; 
 
Serial.print(hour);
дает 540
 
почему он не хочет адекватно переводить символ в число
 
делаю принудительно 
hour=int(tmpchar[0])*10+int(tmpchar[1]); 
результат 540
 
делаю фенкцией стандартной hour=atoi(tmpchar);
 
и тоже 540....
ну как так то?! :(
 
ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

я понимаю, что он берет ASCII номер символа, но почему он даже принудитель не хочет конвертировать символ в число?!

kalapanga
Offline
Зарегистрирован: 23.10.2016

49 * 10 + 50 = 540 А как Вы предлагаете конвертировать символ в целое, кроме как взять код этого символа?

Вычтите по 48 да и всё.

sadman41
Offline
Зарегистрирован: 19.10.2016

А что надо-то в итоге?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

char массив с датой и временем разложить на час/минуда и тд...

спасибо, наверное таки буду, только у меня чтото то само переводит то не переводит... глючит этот чар по полной

 

судя по всему atoi криво реализован.... хотя его задача какраз и переводить символ в число при этом даже набор символов в сичло

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

очередной квест начался....

все там работает

sadman41
Offline
Зарегистрирован: 19.10.2016

Да уж, опять во всём ардуина виновата.

Serial.begin(9600);
char tmpchar[3]={'1','2',0};
int hour=atoi(tmpchar);
Serial.println(tmpchar);
Serial.println(hour);

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

если голый код - то работает, у меня же в программе оно не работает

данные берутся с ЖПС и разбираются посимвольно

и вот числовые символы оно не переводит никак....

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Всё оно переводит. Надо C-строку скармливать atoi(), а не черте знает что.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

вам в сотый раз сказать - выкладываете то что не работает !

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

вот часть кода

char tmpdt[2],tmpchar[12],data[12];   //заданы как глобальные до лупа
 if(fix == 1)
        {               Serial.print(": ");Serial.println(data);
          if(csv == 2)      { strcpy(tmpchar, data); 
          tmpdt[0]=tmpchar[0];tmpdt[1]=tmpchar[1]; hour=int(atoi(tmpdt)); 
          tmpdt[0]=tmpchar[2];tmpdt[1]=tmpchar[3]; minute=atoi(tmpdt); 
          tmpdt[0]=tmpchar[4];tmpdt[1]=tmpchar[5]; second=atoi(tmpdt);         
          
          Serial.print("hour"); Serial.print(hour); Serial.print(" minute"); Serial.print(minute); Serial.print(" second"); Serial.println(second);

и вот что в мониторе

: 124833.001
hour673 minute21409 second29153
 
может быть strcpy виновата во всём?
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ага и она теперь, не я пас...

sadman41
Offline
Зарегистрирован: 19.10.2016

Не виновата.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

вот и я думаю - идет чар - переносится чар -до  atoi  приходит чар - после него вместо числа остается его номер по таблице ascii

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

может быть при копировании из переменной в переменную чтото не так идет?

sadman41
Offline
Зарегистрирован: 19.10.2016

Вы описание функции atoi() читали?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

преобразование строки (символа) в число инт, смотрит посимвольно, если первый символ = числу то конвертирует в число и продолжает до конца строки или не числового символа

у меня символ один и числовой - что её не нравится?

 

при этом всем дальше по коду у меня atof и atol работают без нареканий вообще....

sadman41
Offline
Зарегистрирован: 19.10.2016

ELITE пишет:

и продолжает до конца строки 

у меня символ один и числовой - что её не нравится?

Что такое конец строки и есть ли он в вашей строке?

b707
Offline
Зарегистрирован: 26.05.2017

ELITE - неделя прошла и вы снова? - опять у вас циклы не работают,  функции глючат? :)

Что там танцору то мешает, помните? :)

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

sadman41 пишет:

ELITE пишет:

и продолжает до конца строки 

у меня символ один и числовой - что её не нравится?

Что такое конец строки и есть ли он в вашей строке?

массив задан из 2 символа

элемент 1 = 1

элемент2 =2

строка из 2 чар символов, оба числовые.

sadman41
Offline
Зарегистрирован: 19.10.2016

Еще раз повторю вопрос: что такое "конец строки" ?

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

 

массив задан из 2 символа

элемент 1 = 1

элемент2 =2

строка из 2 чар символов, оба числовые.

ELITE - вы в принципе не понимаете, как устроена строка. Начать с того, что если у в строке 2 символа - массив нужен НА ТРИ ЭЛЕМЕНТА! - еще скажите, что вы этого нигде не читали...

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

конец строки или любой не числовой символ (или 2торая точка, допускается знак "-" как первый символ)является ограничителем числа

и да, я читал - откуда в массиве чар 3й символ?, это же не стрин массив...

и почему atof atol работают при этом правильно? и atoi выдает бред

sadman41
Offline
Зарегистрирован: 19.10.2016

На колу мочало, начинай сначала.

https://yandex.ru/search/?text=C-style%20string

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

то время и скорость с которой строчится куча постов можно потратить "на подумать".

b707
Offline
Зарегистрирован: 26.05.2017

ELITE пишет:

и да, я читал - откуда в массиве чар 3й символ?, это же не стрин массив...

Пля... А с чем, по Вашему, работает atoi(). если не со стринг-массивом?!

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

то время и скорость с которой строчится куча постов можно потратить "на подумать".

Так нашему "танцору" все время кто-то гадит - то циклы for. то функция atoi...

Забавно, что между своими "запоями" он временами выглядит нормальным человеком :)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

почему он не хочет адекватно переводить символ в число

Потому что Вы не хотите адекватно это написать!

Неужели ни в одном из 20-ти языков, которые Вы знаете на уровне выше университетского, нет символьных типов? Вы, знаете, я даже грешным делом, начинаю сомневаться в этих Ваших Ваших словах. Не могли бы Вы озвучить названия этих самых 20-ти языков? Это сильно упростило бы процесс помощи Вам. Было бы понятно с чем сравнивать и какие примеры Вам писать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

почему он даже принудитель не хочет конвертировать символ в число?!

Плохо принуждали. Небось только языком, а там иголки под ногти, яйца в тиски, водой на лысину - это не. Кто ж так принуждает?

ELITE пишет:

... судя по всему atoi криво реализован.... 

... может быть strcpy виновата ...

... может быть при копировании из переменной в переменную чтото не так идет ...

Раньше у Вас цилы не работали, теперь уже и atoi, и strcpy и оператор присваивания ... ну всё не работает.

Никогда не задумывались, может у Вас мозги криво реализованы? И потому всё идёт не так?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

аналогичные операции, функции, конструкции отлично работают в php, js, jass( хотя он сильно урезаная версия java) paskal 

но вот в "С" они странным образом глючат на ровном месте.

и как оказывается, "С" выпендрилась и сделала строку из 2 символов равной трем символам....

хуже С логика работы только у циски мне встречалась, и то циска денег стоит и на ней зарабатывают, вот всё в ней и не как у других...а "С" каждый день выкрутасы новые подкидывает...

sadman41
Offline
Зарегистрирован: 19.10.2016

Пошла жара...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Горячий-горячий, совсем белый!  :))))

https://www.youtube.com/watch?v=obaBAMdvG8c

b707
Offline
Зарегистрирован: 26.05.2017

О!!!!! неужели затих? :) купировали приступ...

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

я вот так из смс выделяю числа

uint32_t parsesmsvalue(String msg, uint8_t startpos) {
  String tmp = "";
  uint32_t value = 0;
  tmp = msg.substring(startpos, msg.length());
  value = tmp.toInt();
  return value;
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Я долго размышлял и наконец-то понял: топикстартеру попался экземпляр Arduino IDE с так называемым "нечестным Си". Если раньше о нём только ходили слухи, то теперь, как мы видим, появились и реальные пострадавшие. То есть существование этого феномена мы отрицать теперь не в праве. Неплохо было бы произвести соскоб с этого экземпляра и направить в ведущие научные организации, чтобы они наконец-то разобрались с паразитом, выяснили точное место его происхождения в подмосковье и создали вакцину.

А пока человека придется спасать дедовскими методами - постепенно переводить на ASM.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valera19701 пишет:

я вот так из смс выделяю числа

uint32_t parsesmsvalue(String msg, uint8_t startpos) {
  String tmp = "";
  uint32_t value = 0;
  tmp = msg.substring(startpos, msg.length());
  value = tmp.toInt();
  return value;
}

Валера, ну, блин, ну хоть ссылку-то поставьте! ну за что ж Вы так память-то не любите? Не нужна она Вам, что ли?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

А пока человека придется спасать дедовскими методами - постепенно переводить на ASM.

а до этого изолировать в тщательно охраняемом стационаре :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

аналогичные операции, функции, конструкции отлично работают в php, js, jass( хотя он сильно урезаная версия java) paskal 

Жесть1, я фигею. Значит в перечисленных языках, если сложить два символа '1' и '3' - получишь число 4? Ахренеть, а мужики-то и не знали! Вот, что значит "уровень выше университетского"!

И, кстати, что за я зык такой paskal? А то я как прочитал и понял, что не знаю такого, так аж plakal!

-------

1 Жесть - холоднокатаная отожжённая листовая сталь толщиной 0,10—0,36 мм (по ГОСТ Р 52204-2004) с нанесёнными защитными покрытиями из олова или специальными покрытиями.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Валера, ну, блин, ну хоть ссылку-то поставьте! ну за что ж Вы так память-то не любите? Не нужна она Вам, что ли?

если б только это. Там в строке 4, как мне кажется - круче.  Извлекаем из строки подстроку той же длины, что и вся исходная строка...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

jass - сильно урезаная версия java

За это отдельное спасибо. И, это, не поделитесь телефоном дилера? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

 Извлекаем из строки подстроку той же длины, что и вся исходная строка...

Мда, я до туда не добрался, и, как видно, напрасно :)

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

это было 3 года назад, когда купил первую дуню :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

постепенно переводить на ASM.

Может на paskal? Заодно узнаем, что это такое.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Жесть1, я фигею. Значит в перечисленных языках, если сложить два символа '1' и '3' - получишь число 4? Ахренеть, а мужики-то и не знали!

Евгений, а вот зря вы иронизируете.

Вот вам код на языке Perl - весьма популярный скриптовый язык в среде Unix

#!/usr/bin/perl -w

$a = '1';
$b = '3';
$c = 5;

$d = $a + $b;

print "A = $a\n";
print "B = $b\n";
print "C = $c\n";
$d = $a + $b;
print "'1'+'3' = $d\n";
$e = $a + $c;
print "'1'+5 = $e\n";

А вот результат запуска:

A = 1
B = 3
C = 5
'1'+'3' = 4
'1'+5 = 6

В Перле таки "1" и 1 - это одно и тоже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ELITE пишет:

хуже С логика работы только у циски мне встречалась, и то циска денег стоит и на ней зарабатывают, вот всё в ней и не как у других...а "С" каждый день выкрутасы новые подкидывает...


Насчёт цисок вы погорячились, там всё очень стройненько, озвучьте пожалуйста вы из какого государства?

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

ELITE пишет:

jass - сильно урезаная версия java

За это отдельное спасибо. И, это, не поделитесь телефоном дилера? :)

Думаю, что это Java ASSembler. По приметам из ориентировки подходит.

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

В Перле таки "1" и 1 - это одно и тоже.

Не совсем так. Если применять к переменным оператор арифметического сложения (+), то perl попытается привести операнды к числовому виду. Если же применять оператор конкатенации (.), то операнды будут преобразованы в строки. Это очень удобно, когда, например, с конфига строку считал, +0 ей сделал и у тебя уже число в переменной. Но потом очень сложно с этой иглы соскакивать и приучаться самостоятельно делать приведение типов.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Жжёте, мужики! Я-то, грешным делом, уже забил этому ауту что-то писать, ибо - ну буратино оно, и в африке буратино. Но вы не сдаётесь, гляжу :) Так держать, кто последний сдулся под натиском вечного сияния чистого разума - тот лошандра :) :)

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Не совсем так. Если применять к переменным оператор арифметического сложения (+), то perl попытается привести операнды к числовому виду. Если же применять оператор конкатенации (.), то операнды будут преобразованы в строки. Это очень удобно, когда, например, с конфига строку считал, +0 ей сделал и у тебя уже число в переменной. Но потом очень сложно с этой иглы соскакивать и приучаться самостоятельно делать приведение типов.

Делать "+0" необязательно, для того чтобы из строки конфига получить числов Перле вообще ничего не нужно,  все числовые строки и так считаются числами и наоборот. И можно не только складывать строки "1" + "3" = 4, но конкатеировать числа: 3.4 = 34

Насчет удобно - не то слово. Любая работа с текстом и строками на Перле получается раз 5-10 короче, чем на Си. А парсеры на Перле писать - одно удовольствие :) Например, вся задача ТС по извлечению времени из строки на Перле записывается одним оператором.

А переход с Перла на Си - это "ломка". Пока не привыкнешь - трудно отделаться от мысли, что Си написан в третьем рейхе, чтоб над заключенными измываться :) Но потом привыкаешь...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

В Перле таки "1" и 1 - это одно и тоже.

Мне казалось, там список языков приведён. Неужто во всех так? Так что не зря иронизирую. 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Мне казалось, там список языков приведён. Неужто во всех так? Так что не зря иронизирую. 

ИМХО, коренное отличие Си от всех перечисленных языков в том, что только в Си нет базового типа для строк. И в этом смысле сравнение Си и Перла вполне в тему и отражает антагонизм между ними :)