C++17で、unsigned char * 配列を、文字列リテラルで初期化する方法はありませんか?
例えば、
unsigned char *comList[] = {"read", "write", "erase", 0};
のような初期化はできないでしょうか?
文字列リテラルの型が、const char 配列なので、unsigned char * のリストの初期化は
cannot initialize an array element of type 'unsigned char *' with an lvalue of type 'const char [4]'
とはじかれます。
ではと思っても、unsigned char * と char * は、stati_cast も reinterpret_cast もアウトでした。
実は、外部との通信関数にコマンドを渡したくて、それをリストにしようとしたのですが、通信関数の引数が、
unsigned char * になっていて、困っています。
(古い関数、こちらの修正はしたくないという事情があります)
なにか、
・unsigned char * の配列を、文字列リテラルで初期化する
・const char * 型のデータを、unsigned char * に渡す
方法はないでしょうか?
処理系はC++ Builder 10.3.3 で、コンパイラ自体のバージョンは、
Embarcadero C++ 7.40 for Win32 Copyright (c) 2012-2018 Embarcadero Technologies, Inc.
Embarcadero Technologies Inc. bcc32c version 5.0.2 (36933.9854b07.fc1c373) (based on LLVM 5.0.2)
(Clang 5.0 に相当)
になります。
No.1ベストアンサー
- 回答日時:
const char * から unsigned char * への変換は
・const_cast と static_cast なり reinterpret_cast なりを組み合わせる
・「なんとか_cast」という形ではなく C タイプのキャストを使う
のどちらかでいけるはず.
配列へのキャストができれば「unsigned char * の配列を文字列リテラル (のリスト) で初期化する」こともできる, かもしれない.
どうにもならなかったら
unsigned char read[] = "read";
とかやればいけると思う. おそろしく面倒なのでやりたくないけど.
ありがとうございました。
Cスタイルのキャストで乗り切ることができました。
ただ、ちょっと考えて
const char *comList[] = {"read", "write", "erase", 0};
は、素直に、const char* の配列にして、
外部の関数を呼び指す際に、
send((unsigned char *)comList[i]);
としました。
あと、確かに、
send(reinterpret_cast<unsigned char*>(const_cast<char *>(comList[i])) );
でも、可能でした。
Cスタイルのキャストが紛れ込むのはあまり面白くはないですが、かといって、 C++キャスト2段重ねも、うっとうしい気はします。
もともと、reinterpret_cast は、世界最強のキャストだと思っていたので、 reinterpret_cast が失敗して、CスタイルキャストがOKというのは、意外な気がしました。
(と思ったら、確かに、reinterpret_cast では const は外せないと書いてありました)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# Cの関数の引数のconst *charについて 5 2023/04/25 13:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
char*を初期化したいのですが
C言語・C++・C#
-
unsigned char配列への入力の仕方
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
5
int型の内容をbyteの配列にコピー
Java
-
6
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
7
LPSTR型の初期化について
C言語・C++・C#
-
8
C++ 文字列変数と16進数の比較
C言語・C++・C#
-
9
c++,ある関数のクラスから別のクラスの関数を呼ぶ
C言語・C++・C#
-
10
C++ 構造体の一括初期化 {0}
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
C言語のプログラムについてです
-
C言語で文字列をかえす正しい書...
-
char型にint型の数値を代入する。
-
strcpy関数で文字型変数へのポ...
-
const char* s1とただのchar s1...
-
C言語 strstrの実装
-
警告
-
CStringからchar*への型変換に...
-
fstream型オブジェクトを関数の...
-
文字列の途中から途中までを抽出
-
文字列のswap
-
C++17で、unsigned char * 配列...
-
小数点入りの文字列をfloat型に...
-
Cの関数の引数のconst *charに...
-
strcat関数を自作したいです
-
'\\0'とはなんですか?
-
文字列の演算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報