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

変数の配列を圧縮したいのですが、全く検討もつきません。
どうすればいいでしょうか?
簡単な圧縮の勉強サイトはないのでしょうか?

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

A 回答 (5件)

まあ役に立つかどうかはわかりませんが



Run-Length圧縮の一例(ゆみみみっくす フォーマット解説:圧縮されたデータの展開のしかた)
http://ku-www.ss.titech.ac.jp/~yatsushi/yumimi.h …
Windows DIBのRun-Length圧縮(BMP(DIB)フォーマット解説:圧縮について)
http://hp.vector.co.jp/authors/VA022217/tips/doc …

いわゆる"辞書法"による圧縮(LZ77/LZ78法)
技術評論社 Software Technologyシリーズ
C言語による最新アルゴリズム事典(ISBN4-87408-414-1)
http://www.gihyo.co.jp/books/syoseki.php/4-87408 …

# 最近高速化のためのindexingとかばかりで
# 「データをでっかくする方向」ばかり
# やってたからちょっと新鮮。
    • good
    • 0

もっとも簡単で有益な圧縮方法はハフマン符号化です。


google等で調べてみてください。

また、さらなる上を目指すなら算術符号をおすすめしておきますね。
    • good
    • 0

勉強のために圧縮のアルゴリズムを知りたいというわけではなくて、実際に使われるのですか。



それであれば、既存のライブラリを使用するほうが無難かと思います。

というのも、すぐに思いつくような圧縮アルゴリズムは多くが特許で押えられており、どのアルゴリズムがフリーでどのアルゴリズムが特許かを判別するのは非常に大変だからです。

どうしても自前で実装して実際に使用したければ、フリーのアルゴリズムかどうかも含めて調べたほうがよいですよ。
    • good
    • 0

同じデータを回数で表現するようにするとかですかね。



プログラム中で既に宣言されている配列を圧縮しなければならない理由はなんですか?
それとも、作業用に動的に確保した配列で、作業後圧縮表現に変えた後、削除するとかそういう意味なのでしょうか

この回答への補足

圧縮する理由はネットでその変数を送信するので、帯域の節約といったところですね

補足日時:2005/07/07 20:20
    • good
    • 0

http://www.csdinc.co.jp/archiver/
はどうでしょうか?

左にある アーカイバの話をクリックして、出てきたページの上の中央あたりの圧縮てなにをクリックすると説明が出てきます。
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qハフマン符号のプログラム

 以下の問題に回答できる方,いらっしゃいましたらソースファイルと実行結果を送ってください。
 ファァイル(記号列)を読み込んで,ハフマン符号によりファイルを圧縮するプログラム(C言語)を作成する(プログラムは,圧縮を行うものと,解凍を行うものの2つ作る)。また,いくつか適当なファイルに対して,圧縮を行い圧縮率を測定する。
(1)圧縮プログラムについて
 圧縮のステップ
 (a)入力ファイルを読み込み各記号の出現頻度をカウントする。
 (b)得られた出現頻度を使って各符号のハフマン符号を生成する。
 (c)各符号の出現頻度を出力ファイルに書き出す。
 (d)もう一度入力ファイルを読み込みながら各符号をハフマン符号で置き換え    て出力ファイルに出力する。圧縮ファイルの形式は次のようになる。

  0x00の  0x01の … 0xffの 先頭文字の 2文字目の … 終端文字の
  出現頻度 出現頻度 出現頻度 符号語   符号語    符号語
   (c)で書きこむ部分      (d)で書きこむ部分

(2)解凍プログラムについて
 解凍のステップ
 (a)各符号の出現頻度を圧縮ファイルから読み込む。
 (b)得られた出現頻度を使って各符号のハフマン符号を生成する。
 (c)圧縮ファイルの符号語を読み込みながら各符号のハフマン符号と比較しも    し一致したらその記号を解凍ファイルに出力する。
 (d)(c)をファイルの終わりもしくは出現頻度をすべて足し合わせた記号数分処   理するまで繰り返す。
 関数について
 関数get_bit
 ファイルから1bit読み込んで戻り値として返す。
 (ファイルポインタはグローバル変数で用意する)

 関数put_bit
 引数として0,または1を渡すと1bitずつファイルに書き込む。
 (ファイルポインタはグローバル変数で用意する)

 以下の問題に回答できる方,いらっしゃいましたらソースファイルと実行結果を送ってください。
 ファァイル(記号列)を読み込んで,ハフマン符号によりファイルを圧縮するプログラム(C言語)を作成する(プログラムは,圧縮を行うものと,解凍を行うものの2つ作る)。また,いくつか適当なファイルに対して,圧縮を行い圧縮率を測定する。
(1)圧縮プログラムについて
 圧縮のステップ
 (a)入力ファイルを読み込み各記号の出現頻度をカウントする。
 (b)得られた出現頻度を使って各符号のハフ...続きを読む

Aベストアンサー

コンパイルが通る所迄は修正しましたが、分岐木の生成が正しく出来ていない感じがします。

この辺を、どの様に考えて作ろうとしているのか補足願えますか?
もしかしたら、私が考え方を間違って説明しているかも知れません。
生成されて来た分岐木データが、どうも単純にコードと対になって無い様子なのですが...。

取り合えず、現状のソースを張って置きます。
/* Quenista */
の入ってる行が、いじった所です。

/****************************************************

ハフマン符号

****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include<string.h>/* Quenista*/

#define DEBUG
#define SIZE 256

/* 二分木 */
typedef struct _node {
unsigned int count; /* 頻度 */
int parent; /* 上の要素番号 */
int left; /* 左側を 0 */
int right; /* 右側を 1 */
} CODE;

CODE code[2*SIZE+1];
int mozi_count[SIZE];
int search_code; /* Quenista*/
int Hcode[SIZE][SIZE];
int hcode_count[SIZE]; /* ? */
int bit_count;
FILE *fp1,*fp2;

void put_bit(unsigned int bit);
void /*Quenista*/
main()
{
int i, total = 0;
char input_fname[] = "read.txt";
char output_fname[] = "out2.txt";

int min1, min2, freeNode, root;

#ifdef DEBUG
printf("a");/* Quenista Debug */
#endif
/* データの初期化 */
for( i = 0; i < 2*SIZE+1; i++ ) code[i].count = 0;
for( i = 0; i < SIZE; i++ ) mozi_count[i] = 0;
memset((char *)&hcode_count[0],0,sizeof(hcode_count));/* Quenista */

/* 文字頻度をカウント */
if((fp1 = fopen(input_fname,"r")) == NULL){
fprintf(stderr,"%s: can't opn file\n", input_fname);
exit(1);
}

while((i=fgetc(fp1)) !=EOF){
code[i].count++;
mozi_count[i]++;
total++;
}
fclose(fp1); /* Quenista(ファイルは、使わなくなった時点でクローズする方が良い) */

#ifdef DEBUG
printf("b");/* Quenista Debug */
#endif
/* ハフマン符号を生成する */

/* ハフマン木をつくる */
code[2*SIZE].count = 0x100; /* 番兵 */
for (freeNode = SIZE; ; freeNode++) {
min1 = min2 = 2*SIZE;
for (i = 2*SIZE-1; i >= 0; i--)
if (code[i].count > 0) {
if (code[i].count < code[min1].count) {
min2 = min1;
min1 = i;
} else if (code[i].count < code[min2].count)
min2 = i;
}
if (min2 == 513 - 1) break;
code[freeNode].count = code[min1].count + code[min2].count;
code[freeNode].left = min1;
code[freeNode].right = min2;

code[min1].parent = code[min2].parent = freeNode;
code[min1].count = code[min2].count = 0;
}
root = min1;

#ifdef DEBUG
for(i=0;i<512;i++){printf("[%3d:親%3d]\n",i,code[i].parent);} /* Quenist Debug */
#endif

for(i=0;i<256;i++){ /* コードの回数分のループを行う。 */
search_code=i; /* ←ここで、次に検索するコードを保存して置く */
while(code[search_code].parent<0x100&&code[search_code].parent!=0){ /* ←ここで、戻れなくなるまで探し続ける(親を訪ねて3千里。) *//* Quenista Offset加算 */
if(code[code[search_code].parent].left==search_code){ Hcode[i][hcode_count[i]]=0; } /* ここで、左に分岐しているのか調べ、左なら0 *//* Quenista Offset加算 */
else{ Hcode[i][hcode_count[i]]=1; } /* 右なら1を保存 */
search_code=code[search_code].parent; /* 一つ上に戻る *//* Quenista Offset加算 */
hcode_count[i]++; /* ビット数を、数えて置く */
}
}
/* (c) */
#ifdef DEBUG
printf("c");/* Quenista Debug */
#endif
if((fp2 = fopen(output_fname,"w")) == NULL){
fprintf(stderr,"%s: can't opn file\n", output_fname);
exit(1);
}
#ifdef DEBUG
fprintf(fp2,"Header:\n"); /*Quenista Debug */
#endif
for(i=0;i<SIZE;i++){
fprintf(fp2,"%d ", mozi_count[i]);
}
#ifdef DEBUG
fprintf(fp2,"\n"); /*Quenista Debug */
#endif
if((fp1 = fopen(input_fname,"r")) == NULL){ /* Quenista(再オープンが必要) */
fprintf(stderr,"%s: can't opn file\n", input_fname); /* Quenista */
exit(1); /* Quenista */
} /* Quenista */
#ifdef DEBUG
fprintf(fp2,"Data:\n"); /*Quenista Debug */
#ifdef endif
bit_count=0;
while(!feof(fp1)){/*Quenista*/
search_code=fgetc(fp1);/*Quenista*/
for(i=hcode_count[search_code];i>0;i--){ /*Quenista */
put_bit(Hcode[search_code][i-1]); /* Quenista*/
bit_count++;
}
}
#ifdef DEBUG
printf("d");/* Quenista Debug */
#endif
for(i=0;i<(7-(bit_count&0xF));i++) put_bit(0); /* Quenista */
fclose(fp1);
fclose(fp2);
}

void put_bit(unsigned int bit)
{
static unsigned int mask = 0x80;
static unsigned int byte = 0x00;

if(bit != 0){
byte = byte | mask;
}
mask = mask >> 1;

//8bit貯まったか
if(mask == 0x00){
if(fputc(byte,fp2) == EOF){
printf("Can't write \n");
exit(1);
}
mask = 0x80;
byte = 0x00;
}
}
/* end of file */

コンパイルが通る所迄は修正しましたが、分岐木の生成が正しく出来ていない感じがします。

この辺を、どの様に考えて作ろうとしているのか補足願えますか?
もしかしたら、私が考え方を間違って説明しているかも知れません。
生成されて来た分岐木データが、どうも単純にコードと対になって無い様子なのですが...。

取り合えず、現状のソースを張って置きます。
/* Quenista */
の入ってる行が、いじった所です。

/****************************************************

ハフマン符号

**...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qint型からchar型への変換

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

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

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

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) {
// ここに処理を書く
}
という関数が必要なようです。

Q圧縮(Zip)について

■C/C++とWIN32APIでAPP作成しています。
■圧縮(Zip)プログラムの作成に挑戦しています。
「質問」
■int WINAPI ZIP()の使い方が分かりません
・特に第2引数のコマンドライン文字列の使用方法が分かりません。
・文字列の先頭に[-r]の有る物、無のサンプルソース。
・圧縮前のファイル名(フルパス)と圧縮後のファイル名(フルパス)をlstrcatさせたサンプルアイル

■何種類か有る様ですが、ネット探しますが、説明HPが見つかりません。
■日本語で記載された、関係HPも含めて御教示下さい。

Aベストアンサー

>■「質問-1」
>[-r]は再帰的検索と理解してよろしいですか。

CMD_ZIP.TXTにも記述されていますが、再帰的検索です。
-Dを指定しなければディレクトリ名も含まれます。
# 圧縮対象としてディレクトリを指定し、-rを付けないと…有効なデータのないZIPファイルが生成されました。
# 生成されたZIPファイルはLHMeltで確認。

>■「質問-2」
>両方ともファイル名のみでも出来るのでしょうか?

圧縮対象ファイルがファイルだけなら、-rの有無による違いはなさそうです。
細かいところは…CUIのzipコマンドのコマンドラインスイッチに準拠…なのではないでしょうか?

>■「質問-3」
>・WindowsXPでの標準実装されている「ZIP」の関する処理をAPIから操作する事は出来ないのでしょうか?

方法はある…と思われますが、軽く探した程度では見あたりませんね。
ZIPファイルをD&Dしたときに出る「展開」メニューは、シェルエクステンション辺りで処理されていると思われますが。
# ある程度各自の環境次第ですので、なんとも…。

>・C/C++とWIN32API関数で出来れば、あらたにDLLをダウンロードしなくとも・・・こんな事を思っています。

パスワード月ZIPの配布用プログラムを作っているんですよね?
# http://oshiete1.goo.ne.jp/qa5699451.html より
Zip32j.DLLと、それに必要なDLL(ZIP32.DLL)を配布プログラムのディレクトリと同じところに置けば、そこから読み込んでくれるかも知れません。
# それでダメなら明示的にLoadLibrary()で読み込ませるとか。
zip32j.dllは
>●著作権など
> このZIP32J.DLLはソース、バイナリ共に完全に自由に使ってもらって結構です。
> アプリへのバンドル、改造、商用利用等もかまいません。
> 一方このDLLが使っているInfo-ZIPによるZIP32.DLLはそちらの配布規定に従ってください。おおまかには、無料もしくは安価な手数料ででオリジナルのバイナリ/ソースが入手できることを明示すればいいようです。詳しくはオリジナルを参照してください。

だそうです。(ZIP32.DLLの条件の方が問題ですかねぇ)
自己解凍書庫にしちゃった方が手間がなさそうですけど。

>■「質問-1」
>[-r]は再帰的検索と理解してよろしいですか。

CMD_ZIP.TXTにも記述されていますが、再帰的検索です。
-Dを指定しなければディレクトリ名も含まれます。
# 圧縮対象としてディレクトリを指定し、-rを付けないと…有効なデータのないZIPファイルが生成されました。
# 生成されたZIPファイルはLHMeltで確認。

>■「質問-2」
>両方ともファイル名のみでも出来るのでしょうか?

圧縮対象ファイルがファイルだけなら、-rの有無による違いはなさそうです。
細かいところは…CUIのzipコマ...続きを読む

Qバイナリデータとテキストデータの違いについて

宜しくお願いします。

バイナリデータを用語辞典で調べると
「テキスト形式(文字データ)以外のデータ形式全般のこと。
実行可能形式のコンピュータプログラムや、画像や音声、
動画などのデータなどがバイナリデータにあたる。」
(http://e-words.jp/w/E38390E382A4E3838AE383AA.html)
とあります。

これでは、バイナリデータとテキストデータの違いが分かりません。

テキストデータはコードの集まりで、
さらに細かくすると0と1の集まり(?)だから・・・
と考えるとバイナリデータとテキストデータの
違いが分かりません。

Q1.私は何が分かっていないのでしょうか?
Q2.バイナリデータとテキストデータの違いを教えてください。

宜しくお願い致します。

Aベストアンサー

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRLFと決まっているので、そうでないコンピュータはtelnetプログラムが自分のコンピュータのコード体系と相互変換します。

ftpでテキストデータを転送する時も同じくASCIIとCRLFと決まっています。ただ日本語文字の時にどのコードを使うかは規格では決まっていないので、ftpクライアントで、相手コンピュータの日本語コード種類を指定して、自分と合わなければ転送時に相互変換します。

Cプログラムでもテキストの改行は'\n'と決まっているので、そうでないWindowsの場合はCプログラムとの間でCRLFと'\n'の相互変換が、ライブラリ中で自動的に行われます。

そういった変換を全く行わないのがバイナリデータです。画像ファイルなどはjpegと形式が決まればどのコンピュータでも同じフォーマットなので変換の必要はありません。逆にテキストとみなして変換するとデータが壊れてしまいます。

バイナリデータは01の集まりです。
テキストデータは文字としての意味が与えられて居ます。ただテキストデータの01としての表現方法はプラットフォーム(OSやアプリケーション)によって異なります。例えば英文字コードでもメインフレームで使われるEBCDICもあり、unixやPCで使われるASCIIもあります。また日本語など英語以外の文字をあらわすのには、さらに多くの種類があります。また改行を表す文字もいろいろです。
例えば telnet で他のコンピュータにログオンして通信する時の文字コードはASCIIで、改行はCRL...続きを読む

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...続きを読む

Qprintf による16進表示について

C言語初心者です。

今作っているプログラムで、データを16進形式で表示しようとしています。
大体このような感じです。

/*入力時*/
char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}

/*出力時*/
for (i = 0; i < 5; i++) {
printf("0x%02x\n",buf[i])
}

実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、

0xffffff4e
0x94
0xffffffa0
0x2b
0x78

というように、'ffffff'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

Aベストアンサー

出力は、
0x4e
0xffffff94
0xffffffa0
0x2b
0x78
ではありませんか?
char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。
char x=255;
printf("%d\n",x);
だと255でなく、-1が表示されます。

対応としては、
unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}
;
とするか、
printf("0x%02x\n",buf[i]&0xff);
にするかどちらかですね。

Qファイル圧縮と解凍について

最近よくPCでファイルをよく扱うようになって、ふと疑問に思ったことがあるんです。
それは、ファイルの圧縮解凍の仕組みについて何ですが、いったいどういう仕組みでファイルの容量を減らしたり戻したりしてるんですか?
調べてみたんですけどよくわかりませんでした...
どなたか出来るだけ簡単に教えていただけないでしょうか?
それと、C言語で圧縮解凍ソフトは自作できるんですか?

長くなってスイマセン・・・

Aベストアンサー

★アドバイス
・DLLを使えば楽できます。
 次のリンクを参考にすれば良い。
 http://www.kumei.ne.jp/c_lang/sdk3/sdk_271.htm→『第271章 ファイルの解凍』
 http://www.kumei.ne.jp/c_lang/sdk3/sdk_272.htm→『第272章 LHAによるファイルの圧縮』
 http://www.kumei.ne.jp/c_lang/sdk3/sdk_273.htm→『第273章 LHAによるファイルの解凍』
 http://www.kumei.ne.jp/c_lang/sdk3/sdk_274.htm→『第274章 自己解凍書庫を作る』

Qfatal error LNK1120: 外部参照 1 が未解決です

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
  char tel[20];
  char address[20];
};

void message( void );
void input( FILE *fp, int cnt , struct meibo *a, int *end );

void main( void )
{
  struct meibo a[20];
  FILE *fp;
  int cnt, end;

  if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){
    printf( "Can not open the meibo.dat.\n" );
    exit( 1 );
  }

  message();

  fprintf( fp, "番号, 名前, TEL, 住所\n" );
  fflush( fp );

  cnt = 0;
  end = 0;
  while( end == 0 ){
    input( fp, cnt, &a[cnt], &end );
    cnt++;
    fflush( fp );
    if( cnt == 20 ){
      printf( "人数が一杯です.終了します.\n" );
      end = 1;
    }
  }
  fclose( fp );
}

void message( void )
{
  printf( "名前, TEL, 住所, endを入力してください.\n" );
  printf( "継続の時はend=0," );
  printf( "中止の時は,end=1と入力してください.\n" );
}

void input( FILE *fp, int cnt, struct meibo *a, int *end )
{
  printf( "名前-->" );
  scanf( "%s", a->name );
  printf( "TEL -->" );
  scanf( "%s", a->tel );
  printf( "住所-->" );
  scanf( "%s", a->address );
  printf( "Exit? Continue:0 Exit:1 -->" );
  scanf( "%d", end );
  printf( "\n" );
  fprintf( fp, "%2d, %s, %s, %s\n",
    cnt+1, a->name, a->tel, a->address );
}

またわからないことが・・・
教えて下さい。
以下をVC++2005でコンパイルすると、

MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。
C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。

と警告がでて通りません。
何のことでしょうか。

#include<stdio.h>
#include<process.h>

struct meibo{
  char name[20];
...続きを読む

Aベストアンサー

http://www.a.math.ryukoku.ac.jp/~hig/course/compsci2_2005/man/faq.html
にある現象と同じではないでしょうか、一度お試しください。


人気Q&Aランキング