出産前後の痔にはご注意!

プログラム上での画像作成というのはできるのでしょうか?
例えば、関数を使って、tukutu(100,100); ※(xsize,ysize)
100*100サイズの画像を作るといったことはできるのでしょうか?
しかし、作ったものをpicture1などに貼り付けられるものでないといけません。

もしくは、画像のリサイズを考えています。
例えば、rsize("a.bmp",100,100);  ※("元画像",xsize,ysize)
といった感じで、もともとある画像を100*100のサイズに変える方法でもいいのですが。
画像の縮小拡大など難しいことは使わないで、もし指定のサイズより元画像が小さかったらあまりの部分に白領域を足して、大きかったら削ってしまうといった具合です。

とにかくプログラム上で指定したサイズでの画像を作成したいです。
ソフトはビジュアルスタディオを使っています。
分かる方がいましたらよろしくお願いします。

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

A 回答 (3件)

 画像を送付したのですが、表示されない様です(駄目だこりゃ)。


 と言う事で、もう一度。
「プログラム上で画像作成」の回答画像3
    • good
    • 0

 こんばんは。

補足頂きました。

 う~む、チョッと不明瞭ですな。

>>CLIというのが何なのかよくわかりませんでしたが、おそらくエラーばかりでてしまうので違うものなのではないかと思います。
 ビジュアルスタジオの「C++」である事は間違いなさそうでしょうか?
 でしたら、
 (1)を右クリック
 (2)に「共通言語ランタイムサポート(/clr)」を選択すれば其のまま使える筈。

 此れで無理であるならば、別の言語の可能性があります。
「プログラム上で画像作成」の回答画像2
    • good
    • 0

 こんばんは。



 picture1と書いてありますが、C++CLIの方でしょうか?
 LoadImage()APIを使用すれば、画像の読み込みと同時にリサイズ(
ストレッチ)も出来ます。

#ifndef __BITMAP_H__
#define __BITMAP_H__

#include<windows.h>
#pragma comment(lib, "gdi32.lib")

//C++用
inline HBITMAP WINAPI LoadMyImage(LPCWSTR lpwstrFileName, int iWidth, int iHeight)
{
HBITMAP hBmp = static_cast<HBITMAP>(::LoadImage(NULL, lpwstrFileName, IMAGE_BITMAP, iWidth, iHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION));
return hBmp;
}

//C++/CLI用
inline System::Drawing::Bitmap^ LoadMyImage(System::String^ sFileName, int iWidth, int iHeight)
{
using namespace System::Runtime::InteropServices;
//String^からLPCWSTRへ文字列変換
System::IntPtr iPtrUni = Marshal::StringToHGlobalUni(sFileName);
//ビットマップを読み込む
HBITMAP hBmp = ::LoadMyImage(static_cast<LPCWSTR>(iPtrUni.ToPointer()), iWidth, iHeight);
//変換に割り当てたメモリを消す
Marshal::FreeHGlobal(iPtrUni);
//HBITMAPを元にBitmapクラスを作成
System::Drawing::Bitmap^ bmp = System::Drawing::Bitmap::FromHbitmap(System::IntPtr(hBmp));
//HBITMAPを消去
::DeleteObject(hBmp);
return bmp;
}

#endif

 使用する時(例えば、ダイアログからファイルを選択してロードする時)

private: System::Void 開くStripMenuItem1_Click(System::Object^ sender, System::EventArgs^ e)
{
//ファイルダイアログの準備
OpenFileDialog^ myDLG = gcnew OpenFileDialog();
myDLG->AddExtension = true;
myDLG->DefaultExt = "bmp";
myDLG->FileName = "*.bmp";
myDLG->ShowReadOnly = false;
myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg";
//決定された
if(myDLG->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
this->Text = myDLG->FileName;
//ビットマップの読み込み
pictureBox1->Image = ::LoadMyImage(this->Text, 200/*任意の横幅*/, 200/*任意の縦幅*/);
//ピクチャボックスを更新する
Invalidate();
}
}
    • good
    • 0
この回答へのお礼

こんばんわ^^
回答ありがとうございます。

CLIというのが何なのかよくわかりませんでしたが、おそらくエラーばかりでてしまうので違うものなのではないかと思います。

私が使っているのは、ビジュアルスタディオのCRL→フォームアプリケーションというものなのですが、このプログラムのどこかだけを使えばできるんでしょうか??

お礼日時:2008/12/17 18:10

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

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

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

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

QC言語でBMP画像(ファイル)は作れますか?(Unix使用)

こんにちは。私は30代男性です。
先日はBMPを読み込んでUnix上でイメージ表示するプログラムを作ろうとしていましたが、ようやく完成しました。ご協力いただいた方々にお礼申し上げます。

次にチャレンジしようとしていることは、「BMPファイルに画像を書き出す。」というものです。画像は横4ピクセル・高さ256ピクセルのサイズで、とりあえず1行ずつRBG値を増やして「色の作成」の時に出てくるような長方形型の色指定用のグラデーション表示をしてみようかなと思っています。

→つまり、色の変化はRBG(0,0,0,)からRBG(255,255,255)にずらしていくという感じです(黒→灰色→白とでもいいましょうか)。
これはパレットに設定する値をfor分でループさせればいいかなと思いましたが、プログラムでBMP画像を作り出すことは無理なんでしょうか?ファイルがない状態からファイル名を指定して作るとしたら、offset値をどのように設定したらいいのかなど、わからないことだらけです。
アドバイスを頂けたらありがたいです。どうぞ宜しくお願い致します。

こんにちは。私は30代男性です。
先日はBMPを読み込んでUnix上でイメージ表示するプログラムを作ろうとしていましたが、ようやく完成しました。ご協力いただいた方々にお礼申し上げます。

次にチャレンジしようとしていることは、「BMPファイルに画像を書き出す。」というものです。画像は横4ピクセル・高さ256ピクセルのサイズで、とりあえず1行ずつRBG値を増やして「色の作成」の時に出てくるような長方形型の色指定用のグラデーション表示をしてみようかなと思っています。

→つまり、色の変化はRBG(0,0...続きを読む

Aベストアンサー

★表示するプログラムが完成したようですね。
・『黒→灰色→白』という色のグラデーションを『グレイスケール』と呼びます。
・プログラムでも BMP 画像ファイルを作り出すことは出来ます。
 今回はパレットを使いますし、256 段の変化ですので 256 色のビットマップになります。
 ヘッダ情報を順番に fwrite で出力して、パレットデータ(RGBQUAD×256個の配列)を出力します。
 この後に画像データの下位ラインから順に横 4 ピクセル× 256 ラインを出力します。
・なお、今回は 1 ピクセルは 1 バイトですので 4 ピクセル× 256 ライン=1024バイトが画像データの
 サイズになりますね。→ヘッダ情報にもこの情報をセットします。
・以上。おわり。→前回(下)の『参考URL』もどうぞ。

参考URL:http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/BmpFileFormat.html

Qビットマップファイル生成(C言語)

64個の整数(ピクセルの色データ)をファイルin.txtから読み込み、8×8のサイズのビットマップファイルout.bmpを生成するプログラムを作っていますが、なんだか良くわかりません。
64個の整数をすべて256にすれば青になると言われたのですが、黒になってしまいます。
一応ビルドと実行はできました。
自分で作ったソースは↓です
http://www.geocities.jp/c_prog2011/file_2.txt
一応問題文は↓です
http://www.geocities.jp/c_prog2011/bitmap_1.txt

よろしくおねがいします。

Aベストアンサー

質問者のソースをいじって、ファイルからではなく直接値を入力して
8×8のデータを作ってみました。
後はファイルから読み込むのは自分でやってください。
簡単ですから・・・

ちなみに質問が青にしたかったみたいなので青一色です。
それとヘッダで指定ビットを32に変更しました。
課題が4バイトと指定があったので。

#include <stdio.h>
#include <stdlib.h>

#define HEIGHT 8
#define WIDTH 8

#define COLOR_R (0x00FF0000) //赤
#define COLOR_G (0x0000FF00) //緑
#define COLOR_B (0x000000FF) //青

int main(void)
{
FILE *bmp;

int i;
unsigned int bitmap[64];
unsigned char bmpHeader[54] = {
'B', 'M', /* [ 0] ファイルタイプ */
246, 0, 0, 0, /* [ 2] ファイルサイズ */
0, 0, 0, 0, /* [ 6] 予約 */
54, 0, 0, 0, /* [10] ビットマップデータのシーク位置 */
40, 0, 0, 0, /* [14] ここから始まるヘッダの高さ */
8, 0, 0, 0, /* [18] ビットマップの幅 */
8, 0, 0, 0, /* [22] ビットマップの高さ */
0x01, 1, /* [26] プレーン数 */
32, 0, /* [28] 1ピクセルあたりのビット数 (課題が4バイト指定されていたので32bitに変更) */
0, 0, 0, 0, /* [30] 圧縮タイプ */
192, 0, 0, 0, /* [34] ビットマップデータの長さ */
0x20, 0x2e, 0, 0, /* [38] 水平解像度(px/m) */
0x20, 0x2e, 0, 0, /* [42] 垂直解像度(px/m) */
0, 0, 0, 0, /* [46] カラーインデックス数 */
0, 0, 0, 0, /* [50] 重要なカラーインデックス数 */
};

bmp = fopen("out.bmp", "wb");

if(bmp == NULL) {
printf("入力ファイルがオープンできません\n");
exit(1);
}

//直接色の値入力
for(i=0; i<64; i++)
bitmap[i]=COLOR_B;
//一応お約束
fseek(bmp, 0L, SEEK_SET);
fwrite(bmpHeader, 1, 54, bmp);
fwrite(bitmap, 4, 64, bmp);

//ファイル閉じましょうね!
fclose(bmp);

return 0;
}


必要なところ以外はいじっていませんが、
あとはご自分でどうぞ!

質問者のソースをいじって、ファイルからではなく直接値を入力して
8×8のデータを作ってみました。
後はファイルから読み込むのは自分でやってください。
簡単ですから・・・

ちなみに質問が青にしたかったみたいなので青一色です。
それとヘッダで指定ビットを32に変更しました。
課題が4バイトと指定があったので。

#include <stdio.h>
#include <stdlib.h>

#define HEIGHT 8
#define WIDTH 8

#define COLOR_R (0x00FF0000) //赤
#define COLOR_G (0x0000FF00) //緑
#define COLOR_B (0x00...続きを読む

Q画像を表示するには

C言語をおぼえたてなんですが
文字はprintfで表示するやり方がわかるんですが
画像はどのように表示するのでしょうか?

Aベストアンサー

★アドバイス
・コンソール・アプリケーションでは画像を出せません。
 C言語でも命令(関数)が存在しません。
 画像を表示するには GUI アプリケーションで作る必要があります。
>C言語をおぼえたてなんですが
 ↑
 画像を出す(描画)するにはまだまだ時間が掛かりそうですね。
 でもミニゲームとしてなら次のリンクをどうぞ。
 (1)http://www.nhk.or.tv/kow/program/index.php→『テトリスの作り方』
 コンソール・アプリケーションでも文字を利用してテトリスが作れるようです。
・あと画像を使った場合は GUI アプリケーションになりますが、こちらは次のサイトを
 参考にして下さい。サンプル・ソースをダウンロードできます。
 (2)http://codezine.jp/a/article/aid/207.aspx→『落ち物ゲームの作り方 第1回:「TETRA」編』
 (3)http://codezine.jp/a/article/aid/228.aspx→『落ち物ゲームの作り方 第2回:「聖夜の落とし物」編』
 ダウンロードしてソースファイルを見て下さい。
 C言語ですが知らないような関数名がたくさん使われています。
 これは Win32 API の関数群です。C言語の標準関数とは別の種類です。
 Windows OS では内部はすべて Win32 API を使って処理されています。
 公開されている関数以外にも非公開関数もあります。まぁ、当然かな。
・今後のために GUI アプリケーションのサイトと本を紹介します。
 お決まりですが下のサイトを参考にして下さい。
 http://www.kumei.ne.jp/c_lang/→『猫でもわかるプログラミング』SDK編を読むこと。
 http://wisdom.sakura.ne.jp/system/winapi/→『Win32 API入門』本もお勧め。
 http://www.geocities.jp/ky_webid/win32c/index.html→『Win32API(C言語)編』お勉強サイトです。
・以上。

参考URL:http://www.amazon.co.jp/dp/4797333332/

★アドバイス
・コンソール・アプリケーションでは画像を出せません。
 C言語でも命令(関数)が存在しません。
 画像を表示するには GUI アプリケーションで作る必要があります。
>C言語をおぼえたてなんですが
 ↑
 画像を出す(描画)するにはまだまだ時間が掛かりそうですね。
 でもミニゲームとしてなら次のリンクをどうぞ。
 (1)http://www.nhk.or.tv/kow/program/index.php→『テトリスの作り方』
 コンソール・アプリケーションでも文字を利用してテトリスが作れるようです。
・あと画像を使...続きを読む

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC++でscanfは使えない?

お盆休みを利用してC言語の勉強をしようと思っています。
さわり程度にはわかるのですが、ポインタなどを本気で理解してみようと思っています。

PCにvisual studio2013が入っているので、2013のC++のプロジェクトを使って勉強していこうと思っているのですが、下記のように入力すると、scanfでエラーが出てしまいます。

#include "stdafx.h"
#include <stdio.h>

void main()
{
int n;
scanf("%d",&n);
}

C++ではC言語の文法は全て使えると聞いていたのですが、ある程度例外もあるということなのでしょうか?それともなにか原因があるのでしょうか?

Aベストアンサー

scanfはC言語の「文法」ではありません。
「標準ライブラリ」と呼ばれる、ライブラリに含まれる関数の一つでしかありません。


あと、具体的にどんなエラーメッセージが出たのですか?
メッセージの内容を読んで理解することも、プログラミング技術向上に大事なことです。

http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95
にあるように、scanfは使い方を間違えるととても「危険」な関数です。
そこで
http://msdn.microsoft.com/ja-jp/library/9y6s16x1%28v=vs.100%29.aspx
> セキュリティに関するメモ
とあるように、Microsoftとしてはセキュリティ強化版を使うことを推奨しています。
# 根本対策にはなってないという説もありますが。

そのため、設定次第では、scanfを使っただけで警告、またはエラーになります。

scanfはC言語の「文法」ではありません。
「標準ライブラリ」と呼ばれる、ライブラリに含まれる関数の一つでしかありません。


あと、具体的にどんなエラーメッセージが出たのですか?
メッセージの内容を読んで理解することも、プログラミング技術向上に大事なことです。

http://ja.wikipedia.org/wiki/Scanf#scanf.E3.81.AE.E5.95.8F.E9.A1.8C.E7.82.B9.E3.81.A8.E5.9B.9E.E9.81.BF.E6.96.B9.E6.B3.95
にあるように、scanfは使い方を間違えるととても「危険」な関数です。
そこで
http://msdn.microsoft.com/ja...続きを読む

QCString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。
例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです

CString str = _T("ABC");
int siz = str.GetLength()+1;
LPCTSTR pszFName = new TCHAR[siz];
_tcscpy_s( pszFName, siz, str );

で変換するのですが
LPCTSTRからwchar_t*へ変換できませんとエラーがでます
_tcscpy_s()は使用できないのでしょうか

Aベストアンサー

>APIはCStdioFile の Open()でファイル名を与えるところ

APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566.aspx
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む

Q文字列がNULLか空文字列かの判定

Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0)
文字列の扱いについて、質問します。

関数 int func(char *str) があると仮定します。
パラメータとして、strは以下のような状態あるとします。
(strは関数が呼ばれる前にcalloc()で領域確保済み)
 シンボル名 値
 str      0x00000001 ""
上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。
どうしたらよいのでしょうか。アドバイスをお願いします。

Aベストアンサー

No1の方の回答にあるように、calloc()で取れた領域のアドレスを正しく渡せてないように思えますが...

#defineERROR(-1)

int func(char *str)
{
  if( (!str) || (!strlen(str)) ) return ERROR;
  return strlen(str);
}

void main()
{
  char *p=(char*)calloc(10,10);
  printf("%d\n",func(p));
}

Qchar型にint型の数値を代入する。

たとえば、
int num;
char box; 

numに何らかの整数値が入っているときに、そのnumの中に入っている値をchar型に文字列として代入したいときはどのようにすればいいのでしょうか?

Aベストアンサー

sprintf()っていう関数がありますよ。書式は

sprintf(char型の配列の先頭ポインタ,フォーマット,変数...)

二番目の引数以降はprintf()の引数と同じです。たとえば

int num;
char box[256];
num=100;
sprintf(box,"%d",num);
printf("%s",box);

→100と出力される


人気Q&Aランキング