Parametreyi nasıl uzun süre geçirip karşılığında char char dizisini alabilirim?

Ben C ++ 'a yeniyim, bu yüzden böyle bir dökümün nasıl yapıldığından emin değilim.

Örnek:

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

BTW Arduino IDE ile çalışıyorum.

0

5 cevap

C'deki birçok şeyde olduğu gibi, bu belirli kedinin derinin birçok yolu vardır.

Hepsi ilk önce sonucu saklamak için bir karakter dizisi oluşturduğuna güveniyor - diziyi bir işlevden "döndüremezsin".

En basit, standart olmamakla birlikte, :

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

Bu durumda, 10 , yaptığımız 10 karakter dizisini geçersiz kılmaktan kaçınmak için maksimum dize uzunluğu olur.

Bunu yapmanın saf bir Arduino yolu, korkunç String sınıf:

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

Yine bu örnekte, 10 kopyaladığımız tamponun uzunluğudur.

Ve dahası var. Örneğin, bölme ve modül operatörlerini kullanarak karakter karakter el ile yapabilirsiniz.

2
katma

Peki böyle durumlar için bir çözüm buldum.

Float veya Long veya int'yi karakter dizisi biçimine dönüştürmek için dtostrf() öğesini kullanabiliriz. Sözdizimi:

dtostrf(Source_var, StringLength, numVarsAfterDecimal,destinaton_var)

Source_var = Dönüştürmek istediğiniz değişken (float/int/long)

StringLength = Dizenin uzunluğu (sizin durumunuz için sadece 1 olarak saklayın)

numVarsAfterDecimal = ondalık noktadan sonra gereken değer sayısı

destination_var = değerin saklanması gereken char değişkeni (köşeli parantez kullanmayın).

Uzun diziye dönüştürmek için aşağıdaki kodu izleyin

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

Eğer her şey iyi giderse

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

Bu işlevi çok faydalı buldum ve benim için çok iyi çalışıyordu. Umarım sizin için aynı şeyi yapar.

For more info on dtostrf() : Link

1
katma
dtostrf() öğesini kullanarak, sayıyı açıkça float 'a dönüştürüyorsunuz. Bu pahalıdır, gereksizdir ve sayı 2 ^ 24'ten büyükse, hassasiyeti kaybeder.
katma yazar Sprogz, kaynak

Ben C ++ 'ta yeniyim, bu yüzden böyle bir oyuncu kadrosunu nasıl yapacağımdan emin değilim.

tekrar yapmak için, sadece bir char pointer yapın ve değişkene işaretleyin. Oldukça basit.

ti ascii'yi dönüştürmek istiyorsanız, her birinin kendi lehte ve aleyhte olduğu birçok yol vardır.

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

işaretsiz uzun 8 ascii dönüştürmek için tasarlanmış, ancak 5 basamak dönüştürmek için kolayca yeniden yazılabilir.

0
katma

Bu işaretçiler için bir iştir.

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

Şimdi işaretçiler ve diziler aynı şekilde çalışır. Böylece şimdi ilk bayta başvurmak için myCharArray [0] ve ikinci vb.

0
katma
Sanırım ham baytlardan değil, sayının ASCII temsilini istediği anlamına geliyor.
katma yazar Majenko, kaynak
Telefonum kodu uygun şekilde düzeltmeme izin vermiyor. Birisi bunu benim için düzenlemeyi düşünmezse, çok takdir ediyorum.
katma yazar Delta_G, kaynak
Peki, soruda "oyuncu seçimi" anlamına geliyordu, ben de ona oyuncu seçimi yapmasını söyledim. Sadece ASCIi istiyorsanız atol kullanın.
katma yazar Delta_G, kaynak
Gerçekten ltoa demek istedim.
katma yazar Delta_G, kaynak
Haklısın. ASCII gösterimi.
katma yazar user35512, kaynak

Uzun bir sayının metinsel gösterimini döndüren bir işlev arıyor olabilirsiniz. Bu durumda aslında bir AVR standart kütüphane işlevi vardır (

ltoa standart değildir. Avr-libc için oldukça benzersiz.
katma yazar Majenko, kaynak
Bunu senin için düzelteyim :)
katma yazar Mikael Patel, kaynak