- ベストアンサー
C言語でintをchar*に代入
- C言語を用いてマイコンにシリアル通信経由で値を書き込む方法を教えてください。
- マイコンにASCIIコードでデータを送信し、受信した値をint型の配列に格納し、char型の変数に書き込む方法を教えてください。
- int型の値をchar*に変換するための関数を作成しましたが、うまく動作しません。どのように改良すればいいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
C言語久しぶりなので、分かりにくいかもしれませんが、まず解説から kWifiPass = ssid; は正しくはkWifiSsidだと思いますが、細かい事はさておきkWifiSsidがグローバル変数であると想定しますが、上記の通りの代入ではkWifiSsidにssidの先頭のアドレスを設定しているだけです。なので、実際に値が設定されているわけではない事をご理解ください。setSSID()の関数が終了すると同時にssidは消滅しますが、これによりkWifiSsidには不定値が設定されます。(gccではそうでした。) kWifiSsidに値を設定してあげるためには上記の代入式では設定出来ないので、memcpyやstrcpyなどを使用して値を設定してあげる必要がありますが、setSSID()の呼び出し元等でkWifiSsidのメモリを確保してあげる必要があります。 解説だと分かりづらいかと思いますので、以下サンプルを・・・ ※細かい仕様は気にしないで作ってます。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SSID_LENGTH 30 char *kWifiSsid; void setSSID(int *k) { char ssid[30]; memset(ssid, 0x00, sizeof(ssid)); for(int i = 0; i < SSID_LENGTH; i++) { if(*k == 10) { break; } if(i > 1) { ssid[i - 2] = *k; } k++; } // ssidに終端文字(\0)が含まれている事を想定 strcpy(kWifiSsid, ssid); } int main(void) { // テスト用変数 int k[30] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 70, 73, 75, 77, 79 }; // SSID分のメモリを確保しておく。 kWifiSsid = (char *)malloc(SSID_LENGTH); setSSID(k); // 値が設定されているか確認 printf("%s\n", kWifiSsid); // メモリを解放 free(kWifiSsid); }
その他の回答 (2)
- yelser
- ベストアンサー率72% (8/11)
kWifiPassがグローバル変数だという前提ですが、現在の仕様ではssid(=kWifiPass)の中身は関数の終了とともに未定義となります。 memcpyなどで渡すかssidが消滅しないようにすればよいかと
お礼
ご回答ありがとうございます. ポインタに対する理解が浅いですので,おかしなコードを書いているようでした.ご指摘の内容を参考に勉強致します. 現状は取り合えずssidをグローバルな変数として定義すれば問題なく動作致しました.
- wormhole
- ベストアンサー率28% (1626/5665)
ポインタをちゃんと理解されていますか? >kWifiPass = ssid; はssidのアドレスをkWifiPassに設定するだけですよ?
お礼
ご回答ありがとうございます. ポインタに対する理解が浅いですので,おかしなコードを書いているようでした.ご指摘の内容を参考に勉強致します.
お礼
ご回答ありがとうございます. >>setSSID()の関数が終了すると同時にssidは消滅します 正に上記の現象で悩んでおりました. ポインタについての理解が乏しいですが,いただいたコードを参考にしてプログラム作成を行っていきます. ありがとうございました.