2014年07月28日 listでのポインタ問題の解決(Visual Studio 2013) 先程の件、偉大な方のお知恵を拝借したことにより、このように解決した。 つまり、 1. pop とか push とかやらない。 2. 表示ループを回すのに、わざわざ i とかlst.size() とかを使わない。 3. 表示ループは、pそのものを++で進行させ、始めと終わりは lst.begin() / lst.end() を使えばいい。 そういうふうに考え方を変えれば、即動く。 多分、青字で書いた、p++をやるところがキモなのかな?という気が、なんとなくする。 タグ :#list#ポインタ
2014年07月28日 listでも、ポインタ関連がうまくいかない件(Visual Studio 2013) ポインタを使うような構文だとダメで、参照を使うとなぜか通る。という現象があったのだが、その原因は不明だった。 で、listを使ったプログラムでこういうのを入れたが、この直後に実行時エラーで落ちる。 う~ん・・・ pがなぜかあさっての値になるのが原因なのか?? このプログラムの場合、参照で逃げようとしてもダメだった・・・(´・ω・`) このステップの直前までpは65'A'という値を持っているわけなのだが・・・ まだまだこのあたりの理解が完全に不足中ということだけはわかった。 これはやはり例によって、listの問題ではなくポインタ関連の問題なのだろう多分。 さてどうしようか???と、今のところ無策。 タグ :#list#ポインタ
2014年05月04日 localtime_s騒動の顛末(Visual Studio 2013) またまた、localtimeを使った例文が本に載っていたのでそれをVS2013に入れてみると、「localtime_sを使え」と怒られたというのが事の発端。前に、これとこれな感じで、tm構造体がらみで敗退したのとほぼ同じ状況。 まずは、本に載っていたコードをlocaltime_sに変えて、かつ、引数の数とか、errno_t....とかに注意して書き直してコンパイルしてみると、 error C4700 「初期化されていないローカル変数が使用されます。」 と、前回敗退したのと同じ状況が再現された。ここで悩むこと3~4日。まあ、五月連休だったので、しっかり悩みまくって試行錯誤したわけだが。(^^ ---- なんとかいろいろいじりまくって、ようやくコンパイラだけは通した血肉の策?がこちら。 つまり、原因はわからないが、なぜか、 ポインタを使うような構文だとダメで、参照を使うとなぜか通る。という。 もうここで、localtime_s問題だけでなく、 ポインタとか参照とかも理解が不完全なことが既に露呈。 --- で、出力を見ると、4/4/114の文字がすご~くイヤだ。w なので、またまた試行錯誤して、もしかしてtime(NULL)というのが怪しいのでは??と邪推して、time(&t)にしてみたのがお次。 ご覧のとおり、結果は、別にNULLで良かったじゃんということに。 --- なのでお次は、この気持ち悪い4/4/114の中身を探るために、ステップ実行でデバッグに入ってみる。このように、time とか t の中身を見てみると、1399181075だ。 この1399181075という数字を電卓で概算してみると実は真っ当な数値だった。 なのでさらに、これが p に行ってどうなるかを見てみることにした。 お!、4 4 114が現れたな。 ということで、ちょっと冷静に、そもそもtm構造体の構造はどうなっているかを調べてみると、これだ。 というわけで~wwww 実はプログラムのほうがマトモで、本に載っていたソースコードのほうが、こういう気持ち悪いのを放置している怠慢?なコードだったみたいな。 ****** ここまでわかれば原因は特定できたので、あとは対策するだけだ。 軽くググって、strftimeを使えばよいことを発見。 で、なんとかここまで辿り着いた。 赤矢印にご注目。このように、いたってマトモに動作していたことが発見された。 何日の何時何分何秒に何をやっていたか、プライバシーばれまくりwだけど~。 とりあえず、ようやく、いろいろな問題の複合&いろいろうやむやでわからないことだらけなのが露呈wしたものの、結論が出たのでヨシとしようか~。 タグ :#localtime_s#tm構造体#ポインタ#参照#time#NULL#strftime
2014年03月05日 tm構造体とポインタ(Visual Studio 2013) localtime_sやgmtime_sを使ってtm構造体を使うという話。 #include "stdafx.h" #include <time.h> int main(void) { /*構造体そのもの*/ struct tm newtime, gmt; __time64_t long_time; errno_t err; _time64(&long_time); err = localtime_s(&newtime, &long_time); printf("JST: %.2d:%.2d:%.2d\n", newtime.tm_hour, newtime.tm_min, newtime.tm_sec); err = gmtime_s(&gmt, &long_time); printf("GMT: %.2d:%.2d:%.2d\n", gmt.tm_hour, gmt.tm_min, gmt.tm_sec); printf("日付: %.2d/%.2d/%.2d\n\n", newtime.tm_year + 1900, newtime.tm_mon + 1, newtime.tm_mday); のように、tm構造体そのものを宣言してやれば、ドット演算子を使ってちゃんと動作するが、 /*構造体ポインタ*/ struct tm *newtime00, *gmt00; __time64_t *long_time00; errno_t err00; _time64(long_time00); err00 = localtime_s(newtime00, long_time00); printf("JST: %.2d:%.2d:%.2d\n", newtime00->tm_hour, newtime00->tm_min, newtime00->tm_sec); err00 = gmtime_s(gmt00, long_time00); printf("GMT: %.2d:%.2d:%.2d\n", gmt00->tm_hour, gmt00->tm_min, gmt00->tm_sec); printf("日付: %.2d/%.2d/%.2d\n\n", newtime00->tm_year + 1900, newtime00->tm_mon + 1, newtime00->tm_mday); return 0; } このように、tm構造体のポインタを宣言すると、アロー演算子を使うところまではいいものの、初期化されてない変数のエラーが出てしまい動作しない。 結局、 tm構造体のポインタを使ってlocaltime_s, gmtime_sを使うという懸案事項は未だ成功せず。 タグ :#ドット演算子#アロー演算子#localtime_s#gmtime_s#tm構造体#ポインタ