Як я магу перадаць доўгі ў якасці параметру і атрымаць масіў сімвалаў будзе адказваць?

Я накшталт пачатковец у C ++, так што я не ведаю, як выканаць такую ​​адліўку.

прыклад:

long myLong = 12345L;
convertToCharArray(myLong); //returns an array with the digits of myLong

Дарэчы, я працую з Arduino IDE.

0

5 адказы

Як і многія рэчы ў C Ёсць шмат спосабаў ачысткі паверхні гэтай канкрэтнай кошкі.

Усе яны належаць на вас, зрабіўшы першы масіў сімвалаў для захоўвання выніку ў - вы не можаце «вярнуць» масіў з функцыі.

Самы просты, хоць і нестандартнасці, спосаб складаецца ў выкарыстанні ltoa() , які з'яўляецца Арн-Libc канкрэтная функцыя (не з'яўляецца часткай стандартных функцый LIBC):

long myLong = 12345L;
char myCharArray[10];//Enough room for the answer + 1 NULL char

ltoa(myLong, myCharArray, 10);

<�Код> 10 ў тым, што выклік функцыі вызначае базу для прадстаўлення чысла ў - падстава 10 у гэтым выпадку: дзесятковы.

Іншы спосаб, які больш кампактны, каб фарматаваць радок, выкарыстоўваючы snprintf() :

snprintf(myCharArray, 10, "%dl", myLong);

У гэтым выпадку 10 максімальная даўжыня радка, каб прадухіліць яго накат масіва 10 знакаў мы зрабілі.

Чысты Arduino спосаб зрабіць гэта было б выкарыстоўваць страшыўся Радок </а> клас:

String myString = String(myLong);
myString.toCharArray(myString, 10);

Зноў жа ў гэтым прыкладзе 10 даўжыня буфера мы капіяваны на сайце.

І ёсць больш. Вы можаце зрабіць гэта ўручную, посимвольно з дапамогай дзялення і модуля пругкасці аператараў, напрыклад.

2
дададзена

Ну для такіх сітуацый, я знайшоў рашэнне.

Для пераўтварэння Float або Long або INT ў фармат масіва сімвалаў, мы маглі б выкарыстоўваць dtostrf() . сінтаксіс:

dtostrf(Source_var, StringLength, numVarsAfterDecimal,destinaton_var)

Source_var = зменную, якую патрабуецца пераўтварыць (паплавок/INT/доўгі)

StringLength = даўжыня радка (для вашага выпадку проста трымаць яго 1)

numVarsAfterDecimal = патрабаванае лік значэнняў пасля дзесятковай коскі (трымаць яго нулявы на дадзены момант)

destination_var = пераменная сімвал, дзе значэнне павінна быць захавана (не выкарыстоўваць квадратныя дужкі).

Для пераўтварэння Доўга масіва ідуць ніжэй код

long myLong=12345L;
char var[5];
dtostrf(myLong,1,0,var);

Калі ўсё ідзе добра

Result will be like var[]={'1','2','3','4','5'}

Я знайшоў гэтую функцыю вельмі карыснай і яна працуе выдатна падыходзіць для мяне. Спадзяюся, што гэта робіць тое ж самае для вас.

For more info on dtostrf() : Link

1
дададзена
Выкарыстоўваючы dtostrf() , вы няяўна пераўтварэнне лікі ў флоат . Гэта дорага, непатрэбнае, і губляе дакладнасць, калі лік больш, чым 2 ^ 24.
дададзена аўтар Sprogz, крыніца
<�Р> Я накшталт пачатковец у C ++, так што я не ведаю, як выканаць такую ​​адліўку.

перарабіць, проста зрабіць паказальнік асмаленага і паказальнік яго зменнай. Даволі проста.

калі вы хочаце, каб пераўтварыць ці ASCII, існуе мноства спосабаў, кожны з якіх мае свае плюсы і мінусы.

I wrote a set of conversion routines here: https://dannyelectronics.wordpress.com/2017/07/04/a-very-fast-numeric-to-ascii-conversion-routine/

яны прызначаны для пераўтварэння 8 лічбаў без знака доўга ASCII, але можа быць лёгка перапісаць, каб пераўтварыць 5 лічбаў.

0
дададзена

Гэта праца для паказальнікаў.

long myLong = 12345;
char* myCharArray = (char*)&myLong;

Цяпер паказальнікі і масівы працуюць аднолькава. Такім чынам, зараз вы можаце выкарыстоўваць myCharArray [0] для абазначэння першага байта і myCharArray [1] для другога і г.д.

0
дададзена
Я думаю, што ён азначае, што ён хоча ASCII ўяўленне колькасці, а не зыходныя байты.
дададзена аўтар Majenko, крыніца
Мой тэлефон не дазволіць мне змяніць, што выправіць код правільнага. Калі хто-то быў бы не супраць рэдагавання, што для мяне, я б вельмі ўдзячны.
дададзена аўтар Delta_G, крыніца
Ну ён назваў «кастынг» ў гэтым пытанні, так што я сказаў яму, як кінуць яго. Калі вы проста хочаце выкарыстоўваць ASCII ATOL.
дададзена аўтар Delta_G, крыніца
Я на самой справе меў на ўвазе ltoa.
дададзена аўтар Delta_G, крыніца
Ты маеш рацыю. ASCII ўяўленне.
дададзена аўтар user35512, крыніца

Вы маглі б шукаць для функцыі, якая вяртае тэкставае ўяўленне доўгага колькасці. У гэтым выпадку ёсць фактычна стандартная бібліятэчная функцыя AVR ( avr- Libc: stdlib.h ltoa ):

const size_t BUF_MAX = 32;
char buf[BUF_MAX];
const int RADIX = 10;

long myLong = 12345L;
ltoa(myLong, buf, RADIX);

Буфера, ЬиЕ , будзе ўтрымліваць тэкставае ўяўленне колькасці, myLong , у дадзеным RADIX .

Ура!

0
дададзена
<�Код> ltoa не з'яўляецца стандартным. Гэта даволі унікальны для Avr-LIBC.
дададзена аўтар Majenko, крыніца
Дазвольце мне выправіць гэта для :)
дададзена аўтар Mikael Patel, крыніца