- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
PSoC Creator初心者です。
C言語でプログラミング中ですが、sizeofを使って配列の要素数を取得したいのですが出来ません?
sizeofは使えないのでしょうか?
ちなみに、配列は多次元配列で定義しています。
解決済! 解決策の投稿を見る。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
fuki様、
こんにちは。
以下の手順をお試しいただけるでしょうか?
(1) デバッガを起動します。
(2) size と num_items に代入されて、その値が参照される行、例えば 以下の例では 52行目に
ブレークポイントを設定します。エディタウィンドウの左側の帯のその行の位置をクリックして
赤い丸が付くことを確認してください。
(3) その後、デバッガのメニューアイコンから緑の矢印の継続(Resume) を押します。
(4) プログラムの実行が開始されて、ブレークポイントの位置で停止します。
(5) この状態で、カーソルを変数の上に持ってくると、その変数の値が表示されます。
size の値は 0x00000004 と表示されています。
num_items の値は 0x00000001 と表示されています。
(6) 同様にして、次の snprintf の行、58行目にブレークポイントを設定して、再度緑の矢印を押すと
size の値は 0x00000014 になっています。
num_items の値は 0x00000005 になっています。
(7) 別のアプローチとして、ワークベンチの中央、下、左側の枠にある Local というタブを選択すると
その関数のローカル変数一覧が表示されます。
一つ目のブレークポイントで停止時には
size 0x00000004
num_items 0x00000001
と表示されているのが確認できると思います。
二つ目のブレークポイントで停止時には
size 0x00000014
num_items 0x00000005
となっています。
といった感じで、変数に目的の値が(その時点では)保存されていることをご理解いただけたでしょうか?
2-Apr-2020
moto
P.S. 今、デバッグを試していて、4つ目の snprintf で i_array2d とするところが p_i_array になっていたことに気が付いてしまいました。
本質には影響ないとは思いますが、修正した版を添付します。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんにちは、
CY8CKIT-044 を使用して下記のようなプログラムを書いてテストしてみました。
main.c より抜粋
======================
int i_data = 0 ;
int i_array1d[] = { 25, 26, 27, 28, 29 } ;
int *p_i_array = 0 ;
int i_array2d[][5] = {
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
} ;
int main(void)
{
uint32_t size = 0 ;
init_hardware() ;
size = sizeof(i_data) ;
snprintf(str, STR_LEN, "size of idata = %d\n\r", size) ;
print(str) ;
size = sizeof(i_array1d) ;
snprintf(str, STR_LEN, "size of iarray1d = %d\n\r", size) ;
print(str) ;
p_i_array = i_array1d ;
size = sizeof(p_i_array) ;
snprintf(str, STR_LEN, "size of p_i_array = %d\n\r", size) ;
print(str) ;
size = sizeof(i_array2d) ;
snprintf(str, STR_LEN, "size of i_array2d = %d\n\r", size) ;
print(str) ;
for(;;)
{
/* Place your application code here. */
}
}
======================
結果は下記のようになり、sizeof 関数は機能していると思います。
i_data は int の単体
i_array1d は int x 5個の配列
p_i_array は int のポインタ
i_array2d は int の要素 3 x 5 の2次元配列
※ i_arry1d の表示文で i_array1d が iarray1d になってしまっていました。orz
schematic
pins
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんにちは、
ご質問は要素数の取得でしたね、読み落としていました。
main.c (抜粋) を下記の様に変更してみました。
=====================
int i_data = 0 ;
int i_array1d[] = { 25, 26, 27, 28, 29 } ;
int *p_i_array = 0 ;
int i_array2d[][5] = {
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10},
{11, 12, 13, 14, 15}
} ;
int main(void)
{
uint32_t size = 0 ;
uint32_t num_items = 0 ;
init_hardware() ;
size = sizeof(i_data) ;
num_items = size / sizeof(int) ;
snprintf(str, STR_LEN, "size of idata = %d item count = %d\n\r", size, num_items) ;
print(str) ;
size = sizeof(i_array1d) ;
num_items = size / sizeof(int) ;
snprintf(str, STR_LEN, "size of i_array1d = %d item count = %d\n\r", size, num_items) ;
print(str) ;
p_i_array = i_array1d ;
size = sizeof(p_i_array) ;
num_items = size / sizeof(int) ;
snprintf(str, STR_LEN, "size of p_i_array = %d item count = %d\n\r", size, num_items) ;
print(str) ;
size = sizeof(i_array2d) ;
num_items = size / sizeof(int) ;
snprintf(str, STR_LEN, "size of p_i_array = %d item count = %d\n\r", size, num_items) ;
print(str) ;
for(;;)
{
/* Place your application code here. */
}
}
=====================
Tera Term log
ポインタではその大きさしか取れていませんが、他の配列については
構成要素のサイズが固定であれば構成要素の sizeof で割ることによって 要素数が取得できると思います。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
MoToo Tanakaさま
質問への返信ありがとうございます。
お送りいただいたprojectでは、printfにて取得した結果を表示されています。
最終的には、取得した結果を変数に保存したいのですが、保存されているのか確認できません?
例えば
size = sizeof(i_data) ;
num_items = size / sizeof(int) ;
sizeやnum_itemsの内容をPSoC Creatorのデバッグで変数を選択しても内容を表示しない。
これらの変数はデバッグで確認できませんでしょうか?
ご教示頂ければ幸いです。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
fuki様、
こんにちは。
以下の手順をお試しいただけるでしょうか?
(1) デバッガを起動します。
(2) size と num_items に代入されて、その値が参照される行、例えば 以下の例では 52行目に
ブレークポイントを設定します。エディタウィンドウの左側の帯のその行の位置をクリックして
赤い丸が付くことを確認してください。
(3) その後、デバッガのメニューアイコンから緑の矢印の継続(Resume) を押します。
(4) プログラムの実行が開始されて、ブレークポイントの位置で停止します。
(5) この状態で、カーソルを変数の上に持ってくると、その変数の値が表示されます。
size の値は 0x00000004 と表示されています。
num_items の値は 0x00000001 と表示されています。
(6) 同様にして、次の snprintf の行、58行目にブレークポイントを設定して、再度緑の矢印を押すと
size の値は 0x00000014 になっています。
num_items の値は 0x00000005 になっています。
(7) 別のアプローチとして、ワークベンチの中央、下、左側の枠にある Local というタブを選択すると
その関数のローカル変数一覧が表示されます。
一つ目のブレークポイントで停止時には
size 0x00000004
num_items 0x00000001
と表示されているのが確認できると思います。
二つ目のブレークポイントで停止時には
size 0x00000014
num_items 0x00000005
となっています。
といった感じで、変数に目的の値が(その時点では)保存されていることをご理解いただけたでしょうか?
2-Apr-2020
moto
P.S. 今、デバッグを試していて、4つ目の snprintf で i_array2d とするところが p_i_array になっていたことに気が付いてしまいました。
本質には影響ないとは思いますが、修正した版を添付します。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Motaさま
お返事ありがとうございます。
ご教示頂いた方法で変数の内容を確認できました。
PSoC Creatorの使い方に慣れてなくお手数をお掛けしました。
もう一点ご質問があります。
Warninngsで、「prj.M0121:unused variable 'num_items'[-Wunused-variable]が出ます。
このWarninngは、問題ありませんでしょうか?
宜しくお願い致します。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
Fuki様、
> Warninngsで、「prj.M0121:unused variable 'num_items'[-Wunused-variable]が出ます。
> このWarninngは、問題ありませんでしょうか?
Warning は基本的にない方が良いものですが、
内容が理解できて、意図しているプログラムの動作に影響のない場合には無視しても良いと思います。
今回のWarning では "num_items という変数が使用されていません。" という内容ですので、
main() の先頭の方にある
uint32_t num_items = 0 ;
という行を、下記のいずれかでコメントアウトするか、
行を削除してしまえば、この Warning は無くなると思います。
// uint32_t num_items = 0 ;
あるいは
/* uint32_t num_items = 0 ; */
2-Apr-2020
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
MoTaさま
プログラム中で
num_items = size / sizeof(int) ;
を記載していますが、Warningが出るので気になっていました。
ありがとうございます。