C言語の話です。
A,B 二つのファイルにテキストのデータを書き込みます。

レコードを何件も書き込んでいくのですが、レコードとレコードは連続して書き込んでいきます。

各ファイルのレコードの構成を表す構造体が次のように定義されています。
A_RECのほうはAファイルで、B_RECのほうはBファイルです。

typedef struct{
charrec_kbn[1];
charnum[16];
charfiller[3];
}COM, *COMp;

typedef struct{
COMcom;
chara1[8];
chara2[2];
chara3[9];
charfiller[11];
}A_REC,*A_RECp;

typedef struct{
COMcom;
charb1[3];
charb2[15];
charfiller[22];
}B_REC,*B_RECp;

AとBのレコード構成は違いますが、
fillerというメンバは必ず空白(スペース)で埋めなくてはいけません。

fillerというメンバに対して何もしなかったら、そこには何が入っているのでしょうか。
ヌル文字('\0')で埋まっているのでしょうか。それとも、特定できないごみでしょうか。

空白で埋まっていないなら、空白で埋めることになるのですが、
fillerを空白で埋めるという操作をまとめて一つの関数にできないでしょうか。
どんな構造体(あるいは構造体のポインタ)を受け取っても、fillerというメンバは空白で埋めるという関数は作れますか。
やはり、fillerの位置やサイズは引数として受け取らなければ、そのような関数は作れませんか。

typedef struct{
charrec_kbn[1];
charnum[16];
charfiller[3]="  "; /* ダブルクォーテーションの間はスペース3つ */
}COM, *COMp;

このようにすることはできますか。できるならば、ちゃんと意図したとおり、空白で埋められているのでしょうか。

なお、*COMpや*A_RECpや*B_RECpですが、それは使わなくてもきまりごととして書くことになっています。

よろしくお願いいたします。

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

A 回答 (9件)

こんにちは。

itohhといいます。

補足の内容からすると、
1.レコードの内容が設定されたものが、どこからか渡ってくる。
2.レコードの種類も渡ってくる。(A_REC?B_REC?)
3.渡ってきた段階では、Fillerには、何が入っているか保証されない。
4.2種類を超えるレコードの種類数がある。

一番いい方法は、レコードを設定する側でスペースクリアするのが常道だと思うのですが...

2種類ぐらいだと、マクロも良いかもしれませんが、何種類もあるとすると、汎用的にはなかなかいきませんよね。
(だから、ここに質問しているのだと思いますが...)

こういう案は、如何ですか?
1.レコード毎にFillerの位置とサイズをテーブルにする。
2.関数には、レコードの設定されているエリアのアドレスと、レコード種類を渡す。
3.テーブルを参照してスペースを詰める。

ちょっと、力業っぽいところが、ありますが...
こういう方法なら、net0505さんはわかってらっしゃるとは思うのですが、念のため。

typedef struct {
  int mCD;
  int mOffset;
  int mLen;
} strFiller;

// レコード種類毎のテーブル
static strFiller FilRec[] = {
  { 1, 17, 3},    // A_REC(COM)
  { 1, 39, 11},   // A_REC
  { 2, 17, 3},    // B_REC(COM)
  { 2, 38, 22},   // B_REC
  {-1, -1, -1}   // EOF
};

void FillerInt(char* pRec, int pRecCD )
{
  int i=0;
  
  For( i=0; FilRec[i].mCD != -1; i++ ) {
    if( pRecCD == FilRec[i].mCD ) {
      memset( pRec+FilRec[i].mOffset, ' ', FilRec[i].mLen );
    }
  }
}

void main()
{
  A_REC *a=NULL;
  B_REC *b=NULL;

  Set_aRec(a); // どっからか、設定されてくる。
  
  FillerInt((char*)a, 1);

  Set_aRec(b); // どっからか、設定されてくる。
  
  FillerInt((char*)b, 2);
}
    • good
    • 0
この回答へのお礼

みなさまがたへ。

みなさんありがとうございます。

読み返してみると、なんだか、私の知りたいことが私の質問にうまくあらわされていないようなので、
このまま、質問や補足を続けていても、答える側の方も混乱してくるかと思いますので、
まことにかってながら、この辺で締め切らせていただきます。

どの方のお答えも私の質問に対しては、正しいのだと思います。
ですから、ご回答されたみなさんに点を差し上げたいのですが、
そういうことにはいかないので、
できるだけ、わたしの知りたいこと(または それに近い方)に点を差し上げることにしました。

次に質問するときは、ちゃんと適切な質問を心がけます。
すっきりしない結末ですみません。

お礼日時:2001/07/17 12:49

> 「文字配列の初期値つき定義において


> char str[3]="ABC";
> のように、配列の大きさと文字列の長さが等しい場合、
> '\0'が付加されることなく初期化される。」
すみません、すっかり記憶から抜け落ちていました。
確かに上の記述で、間違いなくchar型3つ分のみの初期化が行われます。
だいたい初期化子が多いと、コンパイルエラーになっちゃいますもんね。

 ところで No.6 の補足より
> レコードを作成するもとになるデータを取得する。
と書かれていますが、この部分は出来ているのですか?(また、どこから取得してくるのでしょう?)
 もし出来ているのなら、データの識別はどのように行っているのでしょうか?
 データのサイズが異なるとなると、取得する部分自体が、それを踏まえてデータを読まないといけない気がするのですが。(A_RECとB_RECって、サイズ違いますよね?<間違い?)
    • good
    • 0
この回答へのお礼

おっしゃるとおりですね。

お礼日時:2001/07/17 12:35

naturalと申します。


質問を読ませていただいたところ、fillerというメンバーの役割は単純にサイズをそろえる為に各構造体の末尾に加えられているように見えたのですが、如何でしょう?
もしそうであれば(つまり使用されないメンバーであれば)、各構造体変数を定義した直後に構造体変数全体をスペースで初期化しておけば良い様に思われます。
そうすれば使用されないメンバーfillerはスペースで埋まったままファイルに書き込まれますし、読み出したときも同じ型の構造体変数に取り込めばスペースで埋まるでしょうし・・・。
想定されている使い方とは違いますか?
尚、fillerは末尾に加えられている、と書きましたが、初期化後書き換えられる可能性が無いメンバーでしたらどこに入っていてもOKですよね。
    • good
    • 0

こんにちは。

itohhといいます。

いっそのこと、初期化としてAとBのレコードをスペースクリアするっていうのは、NGですか?

例.
A_REC a;
memset( &a, ' ', sizeof(A_REC) ); // スペースでクリアする


これならば、どこにfillerがあっても、OKだと思うんですけど。
はずしていたら、ごめんなさい。

この回答への補足

ご回答は、fillerまたはそれと同じようなメンバがどこにいくつあっても対応できる点がいいと思います。

ご回答はNo.2(#2)の方と近いですが、
私の質問の仕方ではまさしく、おっしゃるとおりの答えになると思います。

しかし、私が考えていることは、少し違います。
大きい目で見ると、


int piyopiyo(......)
{
.......
while(....)
{
レコードを作成するもとになるデータを取得する。
レコードのfillerメンバを空白で埋める。
レコードをファイルに書き込む。(エラーなら処理を中止し、-1をreturn)
}
書き込んだレコード件数をreturnする。
}

このような関数piyopiyoを作りたいのです。この関数piyopiyoは、A、Bどちらにでも使えるようにしたいのです。(実をいうと、本当は、A,B以外にもっと、ファイルがたくさんあるのです。)

それで、質問で求めている関数は、
piyopiyoの中の「レコードのfillerメンバを空白で埋める。」
の部分の働きをするものです。

だから、
memset( &a, ' ', sizeof(A_REC) );
というように、aやA_RECというふうには、書きたくないのです。

質問の仕方が悪くて本当にすみません。m(__)m

補足日時:2001/07/14 23:51
    • good
    • 0

> fillerというメンバは必ず空白(スペース)で埋めなくてはいけません。


とありますが、これはA_RECやB_RECに含まれる、COM構造体のfillerも含まれますか?だとすると、toysmithさんのマクロは、さらに手を加えなければなりませんが・・・

 まぁそれとは別に、もう少し安全な方法を。
 構造体のサイズが違う点を利用して、関数で処理するようにしてみます。

 まず、
    void init_filler(void *pv, size_t size);
というプロトタイプの、共用fillerメンバ初期化関数を作ります。
 引数には、構造体変数のアドレスと、サイズを渡します。

 これだけでは呼び出すのが面倒なので、呼び出しをマクロ化します。
    #define INIT_FILLER(x) init_filler((x), sizeof(*(x)))
 xには、構造体変数のアドレスを指定します。

 こうすると、間違って構造体変数そのものを渡してしまっても、構文エラーになります。

 肝心の関数の実装は、次のような感じです。
    void init_filler(void *pv, size_t size)
    {
      A_RECp pa;
      B_RECp pb;

      switch (size) {
      case sizeof(A_REC):
        pa = (A_RECp)pv;
        memset(pa->filler, ' ', sizeof(pa->filler));
        break;
      case sizeof(B_REC):
        pb = (B_RECp)pv;
        memset(pb->filler, ' ', sizeof(pb->filler));
        break;
      }
    }

 一応、
    init_filler(NULL, sizeof(A_REC));
などという意地悪な呼び出し方をしない限り、それなりに安全に動作します。
 また先に言ったように com.filler もスペースで埋めなければならない場合は、それぞれ1行ずつ memset の行を加えてください。

 それから
> typedef struct {
>   char rec_kbn[1];
>   char num[16];
>   char filler[3]="  ";  ←ここ!
> } COM, *COMp;
という記述はできません。
 これはあくまで型の「宣言」であって、変数の「定義」ではないからです。

 メンバの初期化は、構造体変数の宣言時に、初期化構文に従って行ってください。
 ただし、"  "(スペース3つ)では初期化できません。"  "には、見えない '\0' が付いていることを忘れちゃだめですよ。

この回答への補足

>> fillerというメンバは必ず空白(スペース)で埋めなくてはいけません。
>とありますが、これはA_RECやB_RECに含まれる、COM構造体のfillerも含まれますか?
含まれます。

私がなるほどなあ、と思ったのは、
void init_filler(void *pv, size_t size)
と仮引数pvがvoid * で宣言されていて、
pa = (A_RECp)pv;
pb = (B_RECp)pv;
とキャストしているところです。
ありがとうございました。

> それから
>> typedef struct {
>>   char rec_kbn[1];
>>   char num[16];
>>   char filler[3]="  ";  ←ここ!
>> } COM, *COMp;
>という記述はできません。
> これはあくまで型の「宣言」であって、変数の「定義」ではないからです。

 わかりました。

/************************************************
ところで、文字配列の初期化に関することですけど。
本質問の場合は違うのかもしれませんが、
『新版 秘伝C言語問答ポインタ編』(柴田望洋 著)(ソフトバンク)
という本(p64)に気になる記述が書いてあります。

「文字配列の初期値つき定義において
char str[3]="ABC";
のように、配列の大きさと文字列の長さが等しい場合、
'\0'が付加されることなく初期化される。」
*************************************************/

補足日時:2001/07/14 21:41
    • good
    • 0
この回答へのお礼

あと、なるべくなら、この関数の中に、
A_RECp,B_RECp
のような特定の構造体に対応する記述は、本当はないほうがいいのですが...

(C_RECとかD_RECとか、どんなレコードにでも対応するようにしたい。)

それはできないんですよね.... (^^;

お礼日時:2001/07/14 22:04

> 型に依存しない処理をかけそうだな


Cは本来「型に依存する言語」ですから型に依存しない処理はあまり書かないほうが…

この手のマクロは逃げ道です。
逃げ道を用意しなければならない状況とは
「開発メンバーがC言語を良く理解できておらず、OJTしているひまも与えられない」
っていう異常な場合が多いでしょう。
それ以外の状況では「ちゃんと型を意識したプログラミング」を指導するのが王道かと思います。

で、#1の私の書いたマクロ、めちゃくちゃ間違ってました。
#define Fill(xx) \
((sizeof(xx) == sizeof(void *) ?\
(memset((xx)->filler, sizeof((xx)->filler), ' ')) :
(memset((xx).filler, sizeof((xx).filler), ' '))
これでは動きませんね。
#define Fill(xx) \
((sizeof(xx) == sizeof(void *) ?\
(memset((void *)&(xx)->filler, ' ',sizeof((xx)->filler))) :
(memset((void *)&(xx).filler, ' 'sizeof((xx).filler)))
条件を満たせば動くと思いますがかなり危ないマクロです。

2回も訂正してすみません。
見なおし不足でした。

この回答への補足

もしも誤解があるといけないので。
質問中の

>どんな構造体(あるいは構造体のポインタ)を受け取っても、

というのは、
「構造体でも構造体のポインタでも、どっちにも対応できなくてはいけない」
という意味ではなく、
「どちらかに対応できていればいい」
という意味です。
質問が下手なのかもしれません。すみません。^^);

補足日時:2001/07/14 22:27
    • good
    • 0

memsetの引数を間違えてました。


第2引数と第3引数が逆です。
ごめんなさい。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2001/07/14 17:13

C言語の仕様では変数はstaticで宣言されてる場合を除き、特定の値で初期化されることはありません(参考URLの1.30を参照)



で、この場合の初期化の方法としてはmemset関数あたりが有効ですね。

COM c;
memset(&c, ' ', sizeof(COM)); /*構造体を空白で初期化*/

とか。

参考URL:http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

この回答への補足

fillerの初期化がどのようにされているかの話は、
typedef struct {
  ......
}A_REC, *A_RECp;
っていうのが問題というより、
A_REC a_rec;
という宣言がどこでされているか、staticがついているか、
によるという話ですね。
(参照URL1.30では、明示的に構造体の話は書いてないけれど。)

ありがとうございました。

補足日時:2001/07/14 17:09
    • good
    • 0

マクロを連動使ってみては?



sizeof(struct ...)!=sizeof(void *)であることを条件とすれば…。

#define Fill(xx) \
((sizeof(xx) == sizeof(void *) ?\
(memset((xx)->filler, sizeof((xx)->filler), ' ')) :
(memset((xx).filler, sizeof((xx).filler), ' '))

C99ならtypeofを使ってもっとスマートに出来ると思いますが現行ANSI-Cだとマクロを使わないと難しいと思います。

C++だとコンストラクタでfillerを空白埋めできますね。class化しないといけないから多少ややこしいかも。

それよりも…
memset()を呼ぶだけだから素直に
memset(&p->filler, sizeof(p->filler), ' ') ;
とか
memset(&p.filler, sizeof(p.filler), ' ') ;
って書いちゃいけないんですか?

あと、構造体変数の初期値は確保方法と記憶クラス、初期化指定に依存します。
初期化指定無し:
静的に実体を確保確保した場合='\0'。
自動変数として実体を確保した場合=不定

初期化指定あり:
初期化指定に従う

動的確保した場合(標準関数を想定):
malloc()の場合=不定
calloc()の場合='\0'

この回答への補足

早速ありがとうございます。
さすがなるほどなあと思ったのは、マクロを使えば、型に依存しない処理をかけそうだな、ということです。

Aに関する処理と、Bに関する処理をまとめて一つの関数にしたいのです。
よく考えさせていただきます。ありがとうございました。

補足日時:2001/07/14 16:46
    • good
    • 0

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

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

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

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

QデリカスペースギヤへCDオートチェンジャー取り付け

デリカスペースギヤ型式6G72へ手持ちのCDオートチェンジャーの取り付け、配線をする。この時の正面ハウジングの外し方、電源以外のCD側の配線が分解前に知りたい。

Aベストアンサー

これで合ってると思いますが
http://www.alpine-fit.jp/alpine/result2.cgi?YEARS=944&SEND=%81@%82n%82j%81@

Qstruct tanka_kosuu kosuu[10];の[10]て何

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上ですが、
 struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
以上と
struct tanka_kosuu kosuu[10];は
 以下
int tanka;
int kosuu[10];
int kingaku;
 と同じ意味ですか?
 それとも
  int tanka[10];
int kosuu[10];
int kingaku[10]; 
 と同じ意味ですか?
int tanka[10];と
 int kingaku[10];の
 合計に[10]は必要ないですよね
以上すべて私の考え方が間違っていたならごめんなさい。
 以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上です...続きを読む

Aベストアンサー

#1です。

>struct tanka_ data { ・・・・(1)
>  int tanka;
>  int kosuu;
>  int kingaku;
>};
・・・途中省略
>} これでいいでしょうか

(1)のところは、変えてはいけません。
struct tanka_kosuu { 
のままにして下さい。
他は、問題ありません。

QスペースシャワーTVでのCD音源

スペースシャワーTVに登録しました。

そこで編集して車で曲(動画ではなく曲だけ)を聴きたいと思ってるんですが、
できればPV音源ではなくCD音源がいいです。

CD音源の番組ってありますか?
ご存知の方よろしくお願いします。

Aベストアンサー

残念ながらCD音源(リニアPCM44.1メガヘルツ16ビットステレオ)であっても伝送路の問題で圧縮されてしまいます。

PVのマスター音源はCD以上の音質で録画されていますので残念です。

Qint kosuu; とstruct tanka_kosuu kosuu[10]; の関係は

同プログラムの内容で現在3個の質問をしておりますが!
 その質問を解決する上で4つ目の質問をさせていただきます。
 悪しからず・・・
 さて
以下のサイトのプログラムで 些細な疑問がございます。
https://oshiete.goo.ne.jp/qa/9062058.html
 で
 struct tanka_kosuu {
int tanka; 
int kosuu; 
int kingaku; /
以上の中にあるkosuuと
 struct tanka_kosuu kosuu[10];のkosuu[10]とは直接関係がありますか?
 馬鹿な質問ばかりで申し訳ございませんがよろしくお願いいたします。

Aベストアンサー

#No.1です。

>kosuu[10];をakb[10];変えたところ 以下の errorでてコンパイルできません!?
> example10.c(15) : error C2065: 'kosuu' : 定義されていない識別子です。


宣言している変数名を変更したら、その変数を利用している場所(エラーメッセージで15行目と書かれています)の変数名も変更する必要があると思いませんか?

下の例で、1行目も変数をaからbに変えたら、2行目,3行目のaも、bに変える必要があのはご理解いただけますよね?
01: int a;
02: a = 10;
03: printf("a=%d\n", a);

QマイスペースCDについて

マイスペースCDで自作曲を販売できるそうですが、今からでも登録することは可能なのでしょうか。

Aベストアンサー

※販売登録の新規受付は2010年6月30日をもちまして終了させて
いただきました。

となっています。

参考URLの一番下です。

参考URL:http://www.myspace.com/myspacecdjp

Qtypedef struct OBJECT NODE; の意味を教えてください。

C言語において、

typedef struct OBJECT NODE;

に、コメント文を付けるとしたらどのようになりますか??
よろしくお願いします。

Aベストアンサー

意味は「これから NODE って出てきたら struct OBJECT と同じことだからね」ということです。

コメントに関してですが、言語に親しんだ人であれば難なく理解できる個所にはコメントを書かないのが良いマナーであると思います。
過剰なコメントは可読性を損ねますから。

この場合はコメントをつけないのが正解だと思いますよ。

QCD-ROMからDVD-RAMドライブに交換したい(省スペースPC)

IBM6826-43J(省スペース)を使っています。
何もわからずにDVD-RAMドライブ(IO DATA DVR-ABH8BK内臓型)を買ってしまいました。
CD-ROMからDVD-RAMドライブに交換したいのですが、やり方がわからず困っています。壊したくないので業者の人に頼もうかなとも考えています。
交換できる方法を知っている方がいらっしゃったら、自分でやろうかと思っています。
もしくは安全にドライブ交換をやってくれるところを教えていただければと思います。ちなみに私は溝の口(川崎市)に住んでいるので持っていくならなるべく近くがいいです。

Aベストアンサー

省スペース型ですがサイズ的には問題ないようです。
http://ss.iodata.co.jp/Matching?scene=Category&makercd=003&typecd=102&pccode=60120&catecd=181

ドライブの交換は“それほど”難しいものではないと思います。ただあなたのスキルが全くわかりませんので、難しさの度合いも人それぞれと思います。
自分でPCを開けてしまえば保証は効かなくなることを念頭に置いて下さい。あとは勢いです。時間をかけて、広々としたスペースを作って、ケースはドライバーで簡単に開くと思います。ネジを外したら箱を上に持ち上げて外すのか、スライドさせるのかは見てみないとわかりません。
開けて見ると、省スペース型ですからスッキリと収まっていると思います。ドライブは脇でネジ止めされていると思います。今までのを外したら、新しいドライブのマスター・スレーブ設定をそれに合わせて組み込みます。

それだけです。

あとは添付ソフト(B's Recorder GOLD BASIC Ver.7が入っていますね)をインストール。これがなきゃ焼けませんので。

一度PCを開けるとクセになると思います。
メモリも128MBでは心許ないので増設された方がいいと思います。
http://kakaku.com/prdsearch/detail.asp?PrdKey=05206010480

参考URL:http://www.iodata.jp/sp/setup/page/naibu_c.html

省スペース型ですがサイズ的には問題ないようです。
http://ss.iodata.co.jp/Matching?scene=Category&makercd=003&typecd=102&pccode=60120&catecd=181

ドライブの交換は“それほど”難しいものではないと思います。ただあなたのスキルが全くわかりませんので、難しさの度合いも人それぞれと思います。
自分でPCを開けてしまえば保証は効かなくなることを念頭に置いて下さい。あとは勢いです。時間をかけて、広々としたスペースを作って、ケースはドライバーで簡単に開くと思います。ネジを外したら箱を上に...続きを読む

Qchar *(*)[3];について

#include <iostream.h>
main(){
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}

これを実行して
4 pp6660000, ++pp???????
のように表示されたときに、???????の部分が何になるか考えました。
ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから
4 pp6660000, ++pp6660004
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

Aベストアンサー

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ
ppc3=&pc3;
printf("%p\n",ppc3);
ppc3++;
printf("%p\n",ppc3);//+4(ポインタサイズ分)される

return 0;
}

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//p...続きを読む

Q省スペース機にCD-RからDVDに入れ替え。

書き込み型DVD機を現在のCD-R(W)機と入れ替えを考えています。
マシンはWIN2000でCPUはPENIII800mhzの省スペース機です。
ベースは富士通のFMVですが、HDD、OS,メモリー等入れ替えてますのでもう保証はありません。

さて入れ替えようのDVDデッキですが、店頭で見たところ、動作環境等ほとんど書いてなくて、対応OSくらいの表示しかない商品がほとんどでした。
本題ですが、私のパソコンスペックでも十分使い物になるのでしょうか?
DVDの使い方は、昔の8mmビデオをDVD保存用に変換することを主な目的としています。

しかしながら、現状ではそのための知識も殆ど無くてデッキを入れ替えてから一から勉強です。
互換とかのことも教えていただけると幸いです。

Aベストアンサー

皆さんお答えの通りDVDドライブへの交換は簡単に出来るでしょう。

エンコード(動画[圧縮を含む]変換)やオーサリング(パソコンで見れる動画[aviやmpg等]を家庭用DVDで見れるVIDEO_TS形式に変換する事)に非常に時間がかかります。
自分の経験では、デジタルビデオカメラの編集作業がAthlonXP2000+のCPUでなんとか、2時間のものが倍の4時間で終わったと憶えてます。Pentium3の1Gで作業した時は寝て起きても自動編集してたような記憶が有ります。
今ならばCPUは3G以上のスペックをお勧めしますネ。

Qstruct tanka_kosuu kosuu[10];に付いているアンダーバー"_"の意味

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10];
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
int i;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
for ( i = 0; i < nyuuryoku_kosuu-1; i++ ){
kosuu[i].kingaku = kosuu[i].tanka * kosuu[i].kosuu;
printf("%d\t%d\t%d\n", kosuu[i].tanka,
kosuu[i].kosuu, kosuu[i].kingaku);
}
printf("goukei=%d\n",goukei_kingaku(kosuu, nyuuryoku_kosuu-1));
return 0;
}
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu)
{
int i;
int goukei = 0;
for ( i = 0; i < nyuuryoku_kosuu; i++ ){
goukei += kosuu[i].kingaku;
}
return goukei;
}

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10...続きを読む

Aベストアンサー

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線で区切る "アッパーケース"

C言語の構造体の場合ですが、
慣習として スネークケース または キャメルケース あたりが一般的な様です。

というわけで質問の回答としては、
そのプログラムを作った人の命名規則が、構造体名はスネークケースだった。

ちなみに、
言語仕様的に使えないチェインケースを除いて、どの命名規則でもコンパイルエラーになることはありません。
ただし、コンパイラーとは別に静的コード解析をしている場合は、変な命名だと警告されるかもしれません。


以下参考です。

慣習の由来はたぶんこれ
http://www.amazon.co.jp/dp/4320026926

命名規則が パスカルケース または アッパーケース の例
https://msdn.microsoft.com/ja-jp/library/kbt00480.aspx

言語によっては、この手の命名規則についての公式ガイドラインがあります
http://www.oracle.com/technetwork/java/codeconventions-135099.html
https://msdn.microsoft.com/ja-jp/library/ms229043.aspx

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線...続きを読む


人気Q&Aランキング

おすすめ情報