【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23356

構造体使用時の問題?
投稿者---たかし(2005/09/28 11:34:18)


UNIX上(gccを使用)で、ファイル変換をするプログラムを作成しました。
変換後のデータで、不可思議な現象があり、よくわかりません。
何方か、お教授願います。

ネットで調べて「構造体のバウンダリ?の問題」とは載っていましたが…
(最近、学習しだし、正直理解してません。)

【以下ソース】
<pre>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;memory.h&gt;
#include &lt;stdlib.h&gt;


#define VERSION 1
#define REVISION 0

typedef unsigned char byte;
static buff[251];

FILE *fp1, *fp2;

struct {
unsigned char ck1[11],
name[4],
ck2[236];
} dt;


void usage(void);
void a_b(void);
void write_sec(void);

void main(int argc, char *argv[])
{
int l;

if(argc != 3) {
usage();
}


if(( fp1 = fopen(argv[1], &quot;rb&quot;)) == NULL ){
printf(&quot;Error : %s can\'t open.\n&quot;,argv[1]);
exit(1);
}

if(( fp2 =


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体使用時の問題? 23357 YuO 2005/09/28 12:25:36


No.23357

Re:構造体使用時の問題?
投稿者---YuO(2005/09/28 12:25:36)


>UNIX上(gccを使用)で、ファイル変換をするプログラムを作成しました。
>変換後のデータで、不可思議な現象があり、よくわかりません。
>何方か、お教授願います。

「不可思議な現象」の内容をちゃんと説明してください。
それが説明されない限り,「書かれたとおりにコンピュータは実行しただけ」ということになるだけです。
# 「プログラムは思った通りに動かない。書いた通りに動く」とは言い古された(けれど現役な)格言です。

さらに,二重に変換されたのか,コード滅茶苦茶です。
ついでに,コードの末尾が切れています。
# これらはちゃんと確認画面を見ていればわかるはず。



この投稿にコメントする

削除パスワード

No.23362

Re:構造体使用時の問題?
投稿者---たかし(2005/09/28 13:52:55)


ソースを付けてますが、切れてしまいます(-_-;)
インデントもはずれちゃいます…。(プレビューでは、見れるのに)
すみません。
もう一度、トライします。

■変換後のデータで、(※1)部分に0x00が30バイト、
(※2)で、0x00がバイト15バイト余分に入ってしまいます。


struct  {
        unsigned char   ck1[11],
                name[4],
                ck2[236];
    } dt;

…

/*** ここが問題? ***/
        if(fread(&dt.ck1[0],1,251,fp1) != 251)
            break;
…
    if(dt.ck1[0] == 0x4e && dt.ck1[1] == 0xff){
        memcpy(&buff[m], sx, 10);      m+=10;
/*** ここが問題(※1) ***/
        memcpy(&buff[m], &dt.name[0], 4);   m+=4;
/*** ここが問題(※2)***/
        buff[m++] = 0xff;
        write_sec();
    }else{
…





この投稿にコメントする

削除パスワード

No.23368

Re:構造体使用時の問題?
投稿者---RiSK(2005/09/28 15:02:08)


不完全で,コンパイルも通らず,非常に回答しにくいです。
問題が発生する,最小限(に出来ないなら全て)のソースを
張ってください。
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <stdlib.h>

#define VERSION 1
#define REVISION 0

typedef unsigned char byte;
static buff[251];

FILE *fp1, *fp2;

struct {
    unsigned char ck1[11],
        name[4],
        ck2[236];
} dt;


void usage(void);
void a_b(void);
void write_sec(void);

void main(int argc, char *argv[])
{
    int l;
    
    if(argc != 3) {
        usage();
    }
    
    
    if(( fp1 = fopen(argv[1], "rb")) == NULL ){
        printf("Error : %s can\'t open.\n",argv[1]);
        exit(1);
    }
    
    if(( fp2 =
        
    /*** ここが問題? ***/
    if(fread(&dt.ck1[0],1,251,fp1) != 251)
        break;
    
    if(dt.ck1[0] == 0x4e && dt.ck1[1] == 0xff){
        memcpy(&buff[m], sx, 10);      m+=10;
        /*** ここが問題(※1) ***/
        memcpy(&buff[m], &dt.name[0], 4);   m+=4;
        /*** ここが問題(※2)***/
        buff[m++] = 0xff;
        write_sec();
    }else{



この投稿にコメントする

削除パスワード

No.23369

Re:構造体使用時の問題?
投稿者---たかし(2005/09/28 15:04:34)


何度も試みてますが、皆さんみたいに、
インデントされないですし、うまくはれませんのです。
(HTML変換メールで変換してます。)
再度書き込みます。


この投稿にコメントする

削除パスワード

No.23373

Re:構造体使用時の問題?
投稿者---たかし(2005/09/28 15:15:33)


HTML変換して、貼り付けてますが…
表示がうまくいきません。

再度確認して、書き込みます。

すみません。


この投稿にコメントする

削除パスワード

No.23374

Re:構造体使用時の問題?
投稿者---RiSK(2005/09/28 15:18:59)


>再度確認して、書き込みます。

がんばれ。

・元のソースを全てコピーし直すこと
HTML昆布 to CにおいてConvHTMLボタンは一回だけ押すこと
・変換ソースを全てコピーすること
・レス投稿画面→確認画面で正しい表示か確認すること


この投稿にコメントする

削除パスワード

No.23375

Re:構造体使用時の問題?
投稿者---まきじ(2005/09/28 15:22:16)


>何度も試みてますが、皆さんみたいに、
>インデントされないですし、うまくはれませんのです。

(1) インデントされたソースをコピー
(2)「C言語ソース⇒HTML形式ツール」の テキストフォームに貼り付け
(3) ConvHTML で変換 (二回押したりしない様に)
(4) Preview で確認。(1) でコピーした内容と同じなら OK
違ってる場合、(2) からやり直しましょう
(5) テキストフォームの内容をコピー
(6) 投稿画面のテキストフォームに貼り付け


この投稿にコメントする

削除パスワード

No.23378

Re:構造体使用時の問題?
投稿者---たかし(2005/09/28 17:32:53)


<pre>#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;memory.h&gt;
#include &lt;stdlib.h&gt;

#define VERSION 1
#define REVISION 0

typedef unsigned char byte;
static buff[251];

FILE *fp1, *fp2;

struct {
unsigned char ck1[11],
name[4],
ck2[236];
} dt;

void usage(void);
void a_b(void);
void write_sec(void);

void main(int argc, char *argv[])
{
int l;

if(argc != 3) {
usage();
}

if(( fp1 = fopen(argv[1], <font color="#0000ff">&quot;rb&quot;</font>)) == NULL ){
printf(<font color="#0000ff">&quot;Error : %s can\'t open.\n&quot;</font>,argv[1]);
exit(1);
}

if(( fp2 = fopen(argv[2], <font color="#0000ff">&quot;wb&quot;</font>)) == NULL ){
p


この投稿にコメントする

削除パスワード

No.23379

Re:構造体使用時の問題?
投稿者---たかし(2005/09/28 17:34:21)


ご指摘の通りに貼り付けたのですが…
HTML表示になってくれないのは、なぜでしょう?
質問が、どんどんそれてますが…


この投稿にコメントする

削除パスワード

No.23382

Re:構造体使用時の問題?
投稿者---shu(2005/09/28 20:53:32)


>ご指摘の通りに貼り付けたのですが…
>HTML表示になってくれないのは、なぜでしょう?
>質問が、どんどんそれてますが…

UNIX環境では、文字コードの関係でうまく動かないのかもしれません。
下のプログラムをコンパイルして、コマンドラインから使ってみてください。
結果は標準出力に垂れ流しなので、リダイレクトなどでファイルに保存が必要です。

/*
    HTML昆布 to C(簡易版C言語のソース)
*/

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

#define F_NAME  (argv[1])

void put_line( const char *buf );

int main( int argc, char *argv[] )
{
    FILE *fp = NULL;
    char buf[BUFSIZ] = "";
    
    if (argc != 2 || (fp = fopen( F_NAME, "r" )) == NULL)
        exit( 1 );
        
    puts( "<pre>" );
    while(fgets( buf, sizeof buf, fp ))
        put_line( buf );
    puts( "</pre>" );
    
    fclose( fp );
    
    return 0;
}
void put_line( const char *buf )
{
    int i, len, space, tab = 4;
    
    for (i = 0, len = 0; buf[i]; i++, len++)
        switch (buf[i]) {
        case '\t':
            space = tab - len % tab;
            printf( "%*s", space, "" );
            len += space - 1;
            break;
        case '<': printf( "%s", "&lt;" ); break;
        case '>': printf( "%s", "&gt;" ); break;
        case '\"': printf( "%s", "&quot;" ); break;
        case '&': printf( "%s", "&amp;" ); break;
        
        default: putchar( buf[i] ); break;
        }
}




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧