質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

integer

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3329閲覧

char文字列をunsigned int型のクラスメンバに渡して実行

yamayamak

総合スコア131

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

integer

integerは、一般的に整数を表します。プラスやマイナス、ゼロもなりうる全ての数です。(例 : -2, -1, 0, 1, 2...)

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/01/31 15:24

編集2017/02/01 02:03

###前提・実現したいこと
C++のプログラムを記載しています。

あるchar型のdata1にクラスメンバの「unsigned int buf[]」に渡して実行したいです。

class testObj
{
public:
void sendData(unsigned int buf[], int len);
}

こんな感じで書いたりしているのですが、よくわからないです。

char data1[20] = "0x123,0x456,0x789"; testObj test(); int objSize = sizeof(data2) / sizeof(unsigned int); test.sendData((unsigned int)data1[], objSize );

ちなみに、char型ではなく

unsigned int data1[] = {0x123,0x456,0x789};

で定義した場合は

test.sendData( data1, objSize );

で問題なく動いております。
現状はArduinoのEEPROMにあるデータが文字列で保存されておりchar型で読み出して利用したいということになります。

すみませんがHelpしてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2017/01/31 17:28 編集

実現されたいことがはっきり判りません。ソースから推測すると、char型の配列を単にキャストしたいのではなく、unsigned int型の変数のメモリイメージとして使いたいようですが、その理解で合っていますか?
yamayamak

2017/02/01 01:23

連絡ありがとうございます。すみません、質問の意図がはっきりせず言葉と理解ができておりません。解決したいのは、オブジェクトメンバがunsigned int型なので、そちらをchar[20]で保持している値で(文字列を変更して)利用したいということですが、回答になっているでしょうか?すみませんが、よろしくお願いします。
yamayamak

2017/02/01 01:32

ご指摘の通り、質問の意図が非常にわかりにくいので、修正させて頂きました。「char文字列をunsigned int型のクラスメンバに渡して実行」に特化した質問とさせて頂いているつもりです。Helpをお願いします。
ozwk

2017/02/01 02:28

そもそもなんでEEPROMに文字列なんかで保持しているんですか?
yamayamak

2017/02/01 03:07

センサーのライブラリが文字列(0x123,0x456)で出力しています。確かにライブラリの修正もありえますが、さっぱりでしたし保証もされないので、unsigned int型へ変更するのが良いと考えている次第です。
ozwk

2017/02/01 03:12

本筋とは離れますが、可能であればそのライブラリを教えてもらえますか?
guest

回答2

0

こんにちは。

カンマ区切りの0以上の10進数をunsigned intの並びへ変換して、sendData()を呼び出すのであれば、下記で出来ます。

C++

1#include <iostream> 2#include <iomanip> 3#include <sstream> 4#include <vector> 5 6void sendData(unsigned int buf[], int len, int hz) 7{ 8 for (std::size_t i=0; i < len; ++i) 9 { 10 if (i) std::cout << ", "; 11 std::cout << "0x" << std::hex << std::setfill('0') << std::setw(8) 12 << buf[i]; 13 } 14} 15 16int main() 17{ 18 std::stringstream ss("123,456,789"); 19 std::vector<unsigned int> buffer; 20 21 while(ss.good()) 22 { 23 unsigned int data; 24 ss >> data; 25 if (ss.fail()) 26 break; 27 buffer.push_back(data); 28 29 char delim=0; 30 ss >> delim; 31 if (delim != ',') 32 break; 33 } 34 35 sendData(&buffer[0], buffer.size(), 38); 36 37 return 0; 38}

数値定数は、0xを付けると16進数表現ができますが、文字列に"0x"を付けてもコンピュータにとっては文字列のままです。数値に変わるわけではありません。文字列を数値へ変換処理する必要が有ります。

変換方法には実に様々な方法がありますが、お手軽なstring streamを使ってみました。
std::cinから読み込む時と同じ処理で出来ます。

バッファの組み立てはstd::vectorを使ってみました。効率は悪いですが、お手軽です。

sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。マニュピュレータを使ってます。


【追加】
コメントにも書きましたが、数値表現についてはWikipedia等の記事を参考にされて下さい。
文字列からの変換サンプル・ソースはググってみたけど標準ライブラリを使わないケースを見つけることができませんでした。アルゴリズムを提示しているサイトは、数学的(文字列と数値を区別しない)に書いているところばかりでしたので、更に混乱しそうです。

簡単ですの書いてみました。エラー処理をほとんどしていませんので、想定外の文字列がdata1に入っているとエラーにならずに誤動作します。

C++

1void sendData(unsigned int buf[], int len, int hz); 2 3int main() 4{ 5 char data1[20] = "123,456,789"; 6 unsigned int buf[100]; 7 8 int index=0; 9 buf[index]=0; 10 for (char* p=data1; *p != 0; ++p) 11 { 12 if (*p == ',') 13 { 14 ++index; 15 buf[index]=0; 16 continue; 17 } 18 else if ((*p < '0') || ('9' < *p)) 19 continue; 20 21 buf[index] *= 10; 22 buf[index] += *p-'0'; 23 } 24 25 sendData(buf, index+1, 38); 26 27 return 0; 28} 29 30#include <iostream> 31#include <iomanip> 32 33void sendData(unsigned int buf[], int len, int hz) 34{ 35 for (std::size_t i=0; i < len; ++i) 36 { 37 if (i) std::cout << ", "; 38 std::cout << "0x" << std::hex << std::setfill('0') << std::setw(4) 39 << buf[i]; 40 } 41}

EEPROMへ書き込むフォーマットに"0x"が追加されてますね。面倒なのでそれには対応していません。ご自身で改造されてみて下さい。

しかし、EEPROMへ書き込むフォーマットを選択できるのでしたら、最初からunsigned int buf[SIZE];形式で書いておけば楽と思います。

投稿2017/01/31 17:29

編集2017/02/01 03:00
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2017/02/01 01:35

すみません、質問が複雑になっておりましたのでシンプルに質問させて頂きました。 Arduinoを用いた開発ですので、メモリがなくIncludeがほとんどできない状況です。 すみませんが、初心者向けに回答頂けますと非常に幸いです。
yamayamak

2017/02/01 01:46

回答、大変ありがとうございます。ただ、データはEEPROMに入っており、char data1[20]型に読み出したいと思っております。そちらから、「unsigned int buf[]」へは可能でしょうか? すみませんが、よろしくお願いします。
Chironian

2017/02/01 02:23

私はArduinoを把握していないので具体的なことは分かりませんが、Wikipediaをみると「C++風のArduino言語」と書かれてました。 https://ja.wikipedia.org/wiki/Arduino#Arduino_IDE C++標準ライブラリを使えない場合はかなり厳しいです。 コンピュータの数値表現方法はご存知でしょうか? もし、知らないようでしたその辺りから学習されないとちょっと無理です。 https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE > char data1[20]型に読み出したいと思っております。そちらから、「unsigned int buf[]」へは可能でしょうか? NULLで終端する形式(C言語形式)でdata1[20]へ読み込んでしまえば、回答で示した考え方で処理できます。 標準ライブラリを一切使えない場合は、自力で文字列を数値へ変換するプログラムを書くことになります。難しいものではありませんが、数値表現や文字列についてきちんと理解していないと厳しいです。
yamayamak

2017/02/01 02:38

回答大変ありがとうございます。 私の理解では、unsigned int?2バイトの領域なので負の値がない最大65535が入る領域というレベルの理解です。16bitを0/1で表現できるので、メモリ位置などにも利用できる?ということくらいしか理解できておりません。 ご指摘の通り、自力で文字列を数値へ変換するプログラムを書くしかないということでしたら、そのようにしたいと考えますが、参考になるURLなどありましたら、アドバイス頂きたいです。 ROMには文字列で保存されておりますので、「unsigned int buf[]」は16bit単位で0/1に置きなおすということでしょうか? 0x123,0x456・・・というのはbit列で置き換えると。。。ということを考える必要があるということですね。確かにハードルが高そうですが何としても超えないといけない壁ですので、すみませんがアドバイスお願いします。
Chironian

2017/02/01 02:51

回答に追記します
yamayamak

2017/02/01 03:13

回答大変ありがとうございます。参考にさせて頂きます。 いろいろ助かりました。まずはやってみます!
yamayamak

2017/02/01 04:33

非常にありがとうございます・ただ、Arduinoでの実装が難しかったので、個別に数値に変更して代入する方法で解決できました。いろいろ本当にありがとうございました。おかげさまで無事に解決できましたので、ありがとうございました。
guest

0

ベストアンサー

Arduinoに詳しくないので手順のみ示します。

各関数の使い方は、ArduinoやC言語の入門サイトなどを参考にしてください。

以下はstrtokでカンマ毎に文字列を切り出す例です。

C

1#include <stdio.h> 2#include <stdlib.h> 3int main(void) { 4 char str[] = "123,012"; 5 char *tok = strtok( str, "," ); 6 while( tok){ 7 printf( "%d\n", strtol( tok , NULL, 16)); 8 tok = strtok( NULL, "," ); 9 } 10 return 0; 11}

投稿2017/02/01 02:36

編集2017/02/01 04:48
can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2017/02/01 02:48

回答大変ありがとうございます。参考になります! char data1[20] = "0x123,0x456,0x789" 上記をカンマで分けれたとして、unsigned int型に置き換える?というのが理解できておりません。 例えば上記の123というが、16進数だとして、10進数になると291です。 unsigned int data2[]; に置き換えたい場合は、 data2[0] = 291; // 0x123 data2[1] = 1110; // 0x456 ・・・ というような処理を記載すればよいでしょうか?それとも、Bit列か何かで置き換える様なことが必要でしょうか?また、そもそも考え方が違いますでしょうか? よろしくお願いします。
can110

2017/02/01 02:59

strtol関数は「0x123」のような文字列を「291」という数値に変換します。 つまりdata2[0] = stortol( "0x123",0,16);のようにすればよいです。
yamayamak

2017/02/01 03:15

ありがとうございます。そういうことですか! それなら、こちらでもプログラムを書けそうな気がしてきました。 まずは実装してみますので、また、うまくいけば回答させて頂きます。
yamayamak

2017/02/01 04:31

非常にありがとうございます。以下で解決できました! tmpIrsig[4]はtmpIrsig[6]として"0x"も付与してもどちらでも結果は同じでした。 ----------------------------------- char irsig[30] = "123,456,789,012"; unsigned int irData[10] = {}; char tmpIrsig[4]; long temNum; uint8_t datanum = 0; for (int i = 0; i <= sizeof(irsig); i=i+4 ) { if ( i == 0 || irsig[i-1] == ',' ) { Serial.print("DEBUG:"); Serial.print(i); Serial.print(":"); tmpIrsig[0] = irsig[i]; tmpIrsig[1] = irsig[i+1]; tmpIrsig[2] = irsig[i+2]; tmpIrsig[3] = '\0'; temNum = strtol(tmpIrsig, NULL, 16); irData[datanum] = temNum; datanum++; Serial.print(tmpIrsig); Serial.print(":"); Serial.print(datanum); Serial.print(":"); Serial.println(temNum); } } --------------------------------------
can110

2017/02/01 04:49

解決してよかったです。 例を追記しました。strtokを使えばさらに簡潔に記述できます。 機会があれば挑戦してみてください。
yamayamak

2017/02/01 04:52

なるほど、なるほど、勉強になります。 そちらに書き換えます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問