PSoC Creatorでsizeofによる配列要素数は取得できない?

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
fuki_949671
Level 3
Level 3
10 replies posted 5 replies posted 10 questions asked

PSoC Creator初心者です。

C言語でプログラミング中ですが、sizeofを使って配列の要素数を取得したいのですが出来ません?

sizeofは使えないのでしょうか?

ちなみに、配列は多次元配列で定義しています。

0 件の賞賛
1 解決策
lock attach
Attachments are accessible only for community members.
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

fuki様、

こんにちは。

以下の手順をお試しいただけるでしょうか?

(1) デバッガを起動します。

020-Debugger_started.JPG

(2) size と num_items に代入されて、その値が参照される行、例えば 以下の例では 52行目に

 ブレークポイントを設定します。エディタウィンドウの左側の帯のその行の位置をクリックして

 赤い丸が付くことを確認してください。

021-Set-break-point.JPG

(3) その後、デバッガのメニューアイコンから緑の矢印の継続(Resume) を押します。

022-Resume.JPG

(4) プログラムの実行が開始されて、ブレークポイントの位置で停止します。

023-stopped-at-break-point.JPG

(5) この状態で、カーソルを変数の上に持ってくると、その変数の値が表示されます。

 

 size の値は 0x00000004 と表示されています。

024-size-4.JPG

 num_items の値は 0x00000001 と表示されています。

025-num-1.JPG

(6) 同様にして、次の snprintf の行、58行目にブレークポイントを設定して、再度緑の矢印を押すと

 size の値は 0x00000014 になっています。

026-size.JPG

 num_items の値は 0x00000005 になっています。

027-num.JPG

(7) 別のアプローチとして、ワークベンチの中央、下、左側の枠にある Local というタブを選択すると

 その関数のローカル変数一覧が表示されます。

 一つ目のブレークポイントで停止時には

 size                0x00000004

    num_items    0x00000001

   と表示されているのが確認できると思います。 

029-local-1.JPG

 二つ目のブレークポイントで停止時には

 size            0x00000014

 num_items 0x00000005

 となっています。

030-local-2.JPG

といった感じで、変数に目的の値が(その時点では)保存されていることをご理解いただけたでしょうか?

2-Apr-2020

moto

P.S. 今、デバッグを試していて、4つ目の snprintf で i_array2d とするところが p_i_array になっていたことに気が付いてしまいました。

本質には影響ないとは思いますが、修正した版を添付します。

031-teraterm-log.JPG

元の投稿で解決策を見る

0 件の賞賛
7 返答(返信)
lock attach
Attachments are accessible only for community members.
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

こんにちは、

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次元配列

000-TeraTerm-log.JPG

※ i_arry1d の表示文で i_array1d が iarray1d になってしまっていました。orz

schematic

001-schematic.JPG

pins

002-pins.JPG

moto

lock attach
Attachments are accessible only for community members.
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

こんにちは、

ご質問は要素数の取得でしたね、読み落としていました。

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 で割ることによって 要素数が取得できると思います。

010-TeraTerm.JPG

0 件の賞賛

MoToo Tanakaさま

質問への返信ありがとうございます。

お送りいただいたprojectでは、printfにて取得した結果を表示されています。

最終的には、取得した結果を変数に保存したいのですが、保存されているのか確認できません?

例えば

    size = sizeof(i_data) ;

    num_items = size / sizeof(int) ;

 sizeやnum_itemsの内容をPSoC Creatorのデバッグで変数を選択しても内容を表示しない。

これらの変数はデバッグで確認できませんでしょうか?

ご教示頂ければ幸いです。

0 件の賞賛
lock attach
Attachments are accessible only for community members.
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

fuki様、

こんにちは。

以下の手順をお試しいただけるでしょうか?

(1) デバッガを起動します。

020-Debugger_started.JPG

(2) size と num_items に代入されて、その値が参照される行、例えば 以下の例では 52行目に

 ブレークポイントを設定します。エディタウィンドウの左側の帯のその行の位置をクリックして

 赤い丸が付くことを確認してください。

021-Set-break-point.JPG

(3) その後、デバッガのメニューアイコンから緑の矢印の継続(Resume) を押します。

022-Resume.JPG

(4) プログラムの実行が開始されて、ブレークポイントの位置で停止します。

023-stopped-at-break-point.JPG

(5) この状態で、カーソルを変数の上に持ってくると、その変数の値が表示されます。

 

 size の値は 0x00000004 と表示されています。

024-size-4.JPG

 num_items の値は 0x00000001 と表示されています。

025-num-1.JPG

(6) 同様にして、次の snprintf の行、58行目にブレークポイントを設定して、再度緑の矢印を押すと

 size の値は 0x00000014 になっています。

026-size.JPG

 num_items の値は 0x00000005 になっています。

027-num.JPG

(7) 別のアプローチとして、ワークベンチの中央、下、左側の枠にある Local というタブを選択すると

 その関数のローカル変数一覧が表示されます。

 一つ目のブレークポイントで停止時には

 size                0x00000004

    num_items    0x00000001

   と表示されているのが確認できると思います。 

029-local-1.JPG

 二つ目のブレークポイントで停止時には

 size            0x00000014

 num_items 0x00000005

 となっています。

030-local-2.JPG

といった感じで、変数に目的の値が(その時点では)保存されていることをご理解いただけたでしょうか?

2-Apr-2020

moto

P.S. 今、デバッグを試していて、4つ目の snprintf で i_array2d とするところが p_i_array になっていたことに気が付いてしまいました。

本質には影響ないとは思いますが、修正した版を添付します。

031-teraterm-log.JPG

0 件の賞賛

Motaさま

お返事ありがとうございます。

ご教示頂いた方法で変数の内容を確認できました。

PSoC Creatorの使い方に慣れてなくお手数をお掛けしました。

もう一点ご質問があります。

Warninngsで、「prj.M0121:unused variable 'num_items'[-Wunused-variable]が出ます。

このWarninngは、問題ありませんでしょうか?

宜しくお願い致します。

0 件の賞賛
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

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

0 件の賞賛

MoTaさま

プログラム中で

num_items = size / sizeof(int) ;

を記載していますが、Warningが出るので気になっていました。

ありがとうございます。