見守り電球またはGPS端末が特価中!

Keil社のMDK-ARMというソフトウェアを使用してコーディングを行っているのですが、ログ出力で現在日付時刻を出力しようとした際、ミリ秒まで出せなくて困っています。

VCで同様のコーディングを行った際はGetLocaltimeが使えたので問題なかったのですが、こちらではWindows APIが使えないためGetlocaltimeが使えず今に至ります。
一応マニュアルやweb検索で何かないか探しているのですが今のところ使えそうな関数は見つかっていません。

知っている方、良ければ教えてくださいお願いします。

ちなみに開発環境のOSはWindows XPですが、動作OSは NORTi professional(μITRON4.0)を想定しています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

サービスコールのget_timを使えば、ある程度精度の高い時刻を取得できると思います。


ただし、SISTIME型がどんな単位の値になるかは、isig_timeを呼び出す周期にかかわっているので、環境に依存します。

なお、get_timで得られるシステム時刻は暦時間ではありませんので、年月日時分秒を取得したいのであれば、RTCから得た暦時間と合わせて使用する必要があるかと思います。
    • good
    • 0
この回答へのお礼

返事が遅れました、回答ありがとうございます。
どうやら1つ古い方のマニュアルを見ていたようです、この関数でなんとか出来そうですね。
他に使えそうな関数は特にありませんね、まずはこれ実装してみます。
上手くいかない場合は作戦の練り直しします・・・。

お礼日時:2013/02/12 16:39

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 ミリ秒を日付に変換には

初心者です orz
ただいまC言語勉強中です。(仕事で必要になりそう・・・)

やりたいことは、タイトルの通り
「C言語 ミリ秒を日付に変換」です。
1298616934703→yyyyMMddhhmmddssSSS
↑こういう感じのことがしたいです!

ログにミリ秒で吐き出された時間から日付を求めたいのですが、
やり方が、いまいちわかりません(泣)

どなたか参考サイトや変換方法をご教授願えると助かります。

Aベストアンサー

その「ミリ秒で吐き出された時間」という数値が、
単純にエポック秒を1000倍したものだったら、
1000で割った商と余りでに「秒単位の数値(エポック秒)」と「ミリ秒部分」に分けてから、
エポック秒を年月日時分秒に変換するだけでしょう。

---ここから---
#include <stdio.h>
#include <time.h>

void conv_time(char *dst, long long t)
{
time_t clock = t / 1000LL;
int millisec = t % 1000LL;
struct tm *local = localtime(&clock);
sprintf(dst, "%04d%02d%02d%02d%02d%02d%03d",
local->tm_year + 1900,
local->tm_mon+1,
local->tm_mday,
local->tm_hour,
local->tm_min,
local->tm_sec,
millisec);
}


int main(int argc, char *argv[])
{
long long t = 1298616934703LL;
char s[18];
conv_time(s, t);
printf("%lld -> %s\n", t, s);
}
---ここまで---

その「ミリ秒で吐き出された時間」という数値が、
単純にエポック秒を1000倍したものだったら、
1000で割った商と余りでに「秒単位の数値(エポック秒)」と「ミリ秒部分」に分けてから、
エポック秒を年月日時分秒に変換するだけでしょう。

---ここから---
#include <stdio.h>
#include <time.h>

void conv_time(char *dst, long long t)
{
time_t clock = t / 1000LL;
int millisec = t % 1000LL;
struct tm *local = localtime(&clock);
sprintf(dst, "%04d%02d%02d%02d%02d%02d%03d",
local->tm_year + 1900,
...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qセマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

Qsys/types.hの必要性について

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int main (int argc,char *argv[])
{
struct stat buf[2],*p;
    if(argc!=3)
{
fprintf(stderr,"Usage:newer file1 file2\n");
exit(EXIT_FAILURE);
}
p=buf;
if(stat(argv[1],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
p++;
if(stat(argv[2],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
if(buf[0].st_mtime>buf[1].st_mtime)
{
printf("%s\n",argv[1]);
}
else
{
printf("%s\n",argv[2]);
}
return EXIT_SUCCESS;
}
上記のプログラムでは<sys/types.h>を使っていますが、
どこの部分で必要になるのでしょうか?
プログラム貼り付けて非常に見づらくてすいません

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int main (int argc,char *argv[])
{
struct stat buf[2],*p;
    if(argc!=3)
{
fprintf(stderr,"Usage:newer file1 file2\n");
exit(EXIT_FAILURE);
}
p=buf;
if(stat(argv[1],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
p++;
if(stat(argv[2],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
if(buf[0].st_mtime>buf[1].st_mtime)
{
printf("%s\n",argv[1]);
}
el...続きを読む

Aベストアンサー

statに必要です。
仮に、<sys/types.h>をインクルードせずにコンパイルでき、動作に問題がないとしても移植性に問題が出ます。
仕様で<sys/types.h>のインクルードが要求されているのであれば、「たまたま」コンパイル・実行できることに期待せず、要求に従いましょう。

Qdefine で 配列

#defineで配列を定義したいのですがこのようなことは可能でしょうか?

ヘッダファイル(test.h)で
#define MAX (2)
int A[MAX]={20,30};

ソースファイルで
#include <stdio.h>
#include "test.h"
int main(){
int i;
for(i=0;i<MAX;i++){
printf("A[%d]=%d\n",i,A[i]);
}
return 0;
}

とやれば出来るのですが、このヘッダファイルを複数のソースで参照すると
多重定義であるとおこられてしまいます。

#defineで
#define A[MAX] {20,30}
のように配列を定義する方法は存在するのでしょうか?

どなたか良い方法を御存じの方、ご教授お願いします。

Aベストアンサー

#define でではなく、共通して使う配列(なり変数)をただひとつのヘッダファイルで定義する方法でしょうか。

既に回答がありますが、同じ実体を持つ変数を複数の箇所(同じヘッダファイルを include する複数の箇所である場合も)で宣言する場合、
・実体を宣言する部分には単純な宣言が
・それ以外の部分には(実体が他にあるということを明示するために) extern が必要です。

これを解決するテクニックのひとつに以下のようなものがあります。

test.h 内で

#if defined(_GLOBAL_HERE)
#defien GLOBAL
#define DEF(x) = x
#else
#defien GLOBAL extern
#define DEF(x)
#endif

#define MAX 2
GLOBAL int A[MAX] DEF({2, 3});

メインのソースファイル内で
ソースファイルで
#include <stdio.h>
#define _GLOBAL_HERE
#include "test.h"
int main(){
int i;
for(i=0;i<MAX;i++){
printf("A[%d]=%d\n",i,A[i]);
}
return 0;
}

それ以外のソースファイル内で
(メインのソースファイル内以外の場所では、_GLOBAL_HERE を定義しない)
#include <stdio.h>
#include "test.h"
int foo(){
....

こんな感じです。

#define でではなく、共通して使う配列(なり変数)をただひとつのヘッダファイルで定義する方法でしょうか。

既に回答がありますが、同じ実体を持つ変数を複数の箇所(同じヘッダファイルを include する複数の箇所である場合も)で宣言する場合、
・実体を宣言する部分には単純な宣言が
・それ以外の部分には(実体が他にあるということを明示するために) extern が必要です。

これを解決するテクニックのひとつに以下のようなものがあります。

test.h 内で

#if defined(_GLOBAL_HERE)
#defien ...続きを読む

QC言語で、数値の桁数を求めるには??

C言語で数値の桁数を求めるプログラムをもとめたいのですが
どうすればいいのでしょうか
int c;
int a;
c=12345;
a=printf("%d",c);

とするとaに桁数は入るのですが
cがPRINTF関数により表示されてしまいます

どうすればいいでしょうか?
わかる方はおしえてください、おねがいします。

Aベストアンサー

 sprintf 関数というのがあります。
 printf 関数とまったく同じですが、結果を変数に出力する点が違います。

 char dummy[10];
 int c, a;
 c=12345;
 a=printf(dummy, "%d",c);

 この dummy 変数には文字列 "12345" が入りますが、使わなければどうということはないです。

 C言語を使い始めてそろそろ10年になりますが、sprintf をこんなふうに使おうとは思いもしませんでした(^_^;
 なんか反則っぽいですけど、合理的ですね(笑)

 ちなみに、答えが0になるまで10で割っていって、割ることができた回数を数えるのが普通のやりかたです。

Qスレッドの終了はどうやるんですか?

VCでスレッドの終了をしたいと考えてます。
自分自身のスレッドを終了するときは、AfxEndThread関数を使うようですが、動作中のスレッドを外から命令して終了させるときはどうすれば良いのか分からないです。教えていただけないでしょうか?

Aベストアンサー

こんにちは。itohhといいます。

スレッドを終了させる方法は結構難しいですよ。

TerminateThread 関数を使用すれば、とりあえず強制終了させることは出来ます。
ただし、MSDNライブラリーにも記載されていますが、危険な方法です。
この関数で終了させられたスレッドは、終了処理が出来ません、ということは、
メモリリークを起こす可能性が大です。

一番まともな方法は、WM_CLOSEを対象スレッドにPostMessageすることです。
この場合は、メッセージループを内蔵するユーザーインターフェイススレッド
にする必要があります。
またこの場合でも、デッドロックしているスレッドでは、終了できないと思います。

わたしが、良く行う方法は、
ワーカースレッドの場合:
  ・シグナルを使用して、適時チェックする。(それなりに遅くなるのが難点)
  ・自然に終わるのを待つ。
ユーザーインターフェイススレッドの場合:
  ・WM_CLOSEを対象スレッドにPostMessageする。(デッドロックしないようなロジックにする)

こんにちは。itohhといいます。

スレッドを終了させる方法は結構難しいですよ。

TerminateThread 関数を使用すれば、とりあえず強制終了させることは出来ます。
ただし、MSDNライブラリーにも記載されていますが、危険な方法です。
この関数で終了させられたスレッドは、終了処理が出来ません、ということは、
メモリリークを起こす可能性が大です。

一番まともな方法は、WM_CLOSEを対象スレッドにPostMessageすることです。
この場合は、メッセージループを内蔵するユーザーインターフェイススレッ...続きを読む

QC言語での引数の省略方法

お世話になります。
C言語での関数の引数の省略方法についてお聞きしたいです。
たとえば、CalA(x,y,z)という関数があるとします。
このzの部分を使用しないときは省略という風にしたいのです。
CalA("あ","い","う");
CalA("あ","い");
↑このようにどちらにも対応したい。

VBではそのようにできたと思うのですが、Cでは可能なやり方があるのでしょうか?
よろしくお願いします。

Aベストアンサー

#1です

> char型の場合は
> void CalA(int x,int y,char *z='')

それでOKです。

ただ、#4の方のおっしゃるように、コンパイルエラーが出ないため、設計がかなりしっかりしていないと危険ではあります。
危険ですが、実際にシステム開発のときに用いられる手法ですので、問題はないと思います。
ただ、ここでの不具合が報告されないため、実装後、該当関数関連の試験は重点的に行ったほうがよいですね。

QDWORDって

DWORDって元はどんなものなのでしょうか?
調べてもサイズとか入れる値がわかりません
宜しくお願いいたします

Aベストアンサー

「DWORD」って、 Double WORD ですよね。
WORD=16ビットの2倍(=32ビット=4バイト)です。

>調べてもサイズとか入れる値がわかりません
どういうことかわかりません。
事情を詳しく説明してください。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。


人気Q&Aランキング