質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • C

    4528questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

分割コンパイルでエラーが出て、クリアできません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 654

sanchu52

score 159

ファイルdbg_malloc.h、dbg_malloc_p.h、dbg_malloc_sub.c,
があります。gcc -c dbg_malloc.h  -o -Wall  ,gcc -c dbg_malloc_p.h  -o -Wall
,gcc -c dbg_malloc_sub.c  -o -Wall と実行すると、
gcc -c dbg_malloc_sub.c  -o -Wall で以下のエラーがでます。
何回もコードを見直したのですが、上手くいきません。
教えてください。
実行結果
naka@naka ~/sample
$ gcc -c dbg_malloc_sub.c  -o -Wall
dbg_malloc_sub.c: In function 'dbg_realloc':
dbg_malloc_sub.c:29:10: error: 'dbg_memory_block_hash' undeclared (first use in this function)
hash=&(dbg_memory_block_hash[DBG_HASH_FUNC(ptr)]);
^~~~~
dbg_malloc_sub.c:29:10: note: each undeclared identifier is reported only once for each function it appears in

naka@naka ~/sample
$

コード
メモリ管理用ライブラリ(dbg_malloc.h)

#ifndef _DBG_MALLOC_H_INCLUDED_  
#define _DBG_MALLOC_H_INCLUDED_

#include <stdio.h>
#include <stdlib.h>    //malloc(),free()などのプロトタイプ宣言が行われている
#include <string.h>

//必要な関数のプロトタイプ宣言
void *dbg_malloc(size_t size,const char *file,int line);     

void *dbg_calloc(size_t number,size_t size,const char *file,int line);    

void *dbg_realloc(void *ptr,size_t size,const char *file,int line);        り

char *dbg_strdup(const char *str,const char *file,int line);

void dbg_free(void *ptr,const char *file,int line);        

//メモリ管理情報の出力用の3つの関数を宣言
void *dbg_print_alloc_count(FILE *fp);
void *dbg_print_alloc_block(FILE *fp,const char *file,int line);
void *dbg_print_all_alloc_block(FILE *fp);

#ifndef DBG_MALLOC_NOCHANGE 
#define malloc(s)       dbg_malloc((s),__FILE__,__LINE__)
#define calloc(n,s)       dbg_calloc((n),(s),__FILE__,__LINE__)
#define realloc(p,s)       dbg_realloc((p),(s),__FILE__,__LINE__)
#define strdup(str)       dbg_strdup((str),__FILE__,__LINE__)
#define free(p)           dbg_free((p),__FILE__,__LINE__)
#endif

#endif    


メモリ管理用ライブラリ(dbg_malloc_p.h)

#ifndef _DBG_MALLOC_P_H_INCLUDED_  
#define _DBG_MALLOC_P_H_INCLUDED_

#define DBG_MALLOC_NOCHANGE  

#include <time.h>
//struct memory_block構造体のメンバにtime_t型を利用しているためです

#include "dbg_malloc.h"
//ソース中でdbg_malloc()を利用している場所ごとに作成される構造体
struct memory_count{
    const char *file;        
    int line;                
    int number;                    
    unsigned int alloc_count                     
    unsigned int free_count;                 
    int size;                 
    unsigned int alloc_size; 
    unsigned int free_size;     
    struct memory_block *block_list;
    struct free_count *free_list;    
    struct memory_count *prev;        
    struct memory_count *next;        
};

//メモリ管理用ブロック
struct memory_block{
    int id;            
    int size;        
    time_t t;            
    struct memory_count *mcp;    
    struct memory_block *prev;        
    struct memory_block *next;    
    struct memory_block *hash_prev;    
    struct memory_block *hash_next;    

    void *data;
};

//free()管理用のブロック
struct free_count{
    const char *file;            
    int line;                
    unsigned int count;
    unsigned int size;        
    struct free_count *next;
};    

//malloc()統計情報となる変数の型宣言
extern unsigned int dbg_malloc_count;     //malloc()の呼び出し回数
extern unsigned int dbg_free_count;     //free()の呼び出し回数
extern unsigned int dbg_malloc_number;     //現在のメモリ取得量
extern unsigned int dbg_malloc_size;     //現在のメモリ取得量

extern struct memory_count *dbg_memory_count_head;     //リストの先端
extern struct memory_count *dbg_memory_count_tail;     //リストの終端

#define DBG_HASH_NUM 997    
#define DBG_HASH_FUNC(p)\
    ((\
    (((unsigned long int)(p) >>4) & 0xf)+\
    ((unsigned long int)(p) >>8)\
    ) %DBG_HASH_NUM  )

// ハッシュ用配列
extern struct memory_block *dbg_malloc_block_hash[DBG_HASH_NUM]; 

// 初期化用関数のプロトタイプ宣言
void dbg_init();

#endif        //_DBG_MALLOC_P_H_INCLUDED_ 



ライブラリ本体 dbg_malloc_sub.c

#include "dbg_malloc_p.h"
// "dbg_malloc.h"は"dbg_malloc_p.h"からインクルードされるので
// ここではインクルードしない

void *dbg_calloc(size_t number,size_t size,const char *file,int line)
{
    void *p;

    p=dbg_malloc(number *size,file,line);

    if(p){
        memset(p,0,number *size);
    }
    return (p);
}

void *dbg_realloc(void *ptr,size_t size,const char *file,int line)
{
    void *p;

    struct memory_block *mbp;
    struct memory_block **hash;

    p=dbg_malloc(size,file,line);

    if((p != NULL) && (ptr != NULL)){
        hash=&(dbg_memory_block_hash[DBG_HASH_FUNC(ptr)]);

        for(mbp=*hash;mbp;mbp=mbp->hash_next){
            if(mbp->data==ptr) break;
        }
        if((mbp != NULL) && (size > mbp->size)){
            size = mbp->size;

        }
        memcpy(p,ptr,size);
        dbg_free(ptr,file,line);
    }
    return (p);
}

char *dbg_strdup(const char *str,const char *file,int line)
{
    int len;
    void *p;
    len = strlen(str)+1;
    p=dbg_malloc(len,file,line);

    if(p==NULL) return(NULL);

    memcpy(p,str,len);

    return (p);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asm

    2018/03/24 22:09

    コードブロックにするのはいいのですが、ファイル毎に分割した方が見やすいです

    キャンセル

回答 1

checkベストアンサー

+1

dbg_malloc_p.h: dbg_malloc_block_hash
dbg_malloc_sub.c: dbg_memory_block_hash
どちらかを書き換えて名前を統一すれば動くような気がします

gcc -c dbg_malloc.h  -o -Wall  ,gcc -c dbg_malloc_p.h  -o -Wall

ヘッダファイルは普通コンパイルしませんよ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/24 22:29

    ありがとうございます。
    オブジェクトファイルを作っています。そのあとリンクしようとしています。

    キャンセル

  • 2018/03/24 22:35

    できました。dbg_malloc_block_hashがdbg_memory_block_hashでした。
    何回もここをチェックしたんですけど、見落としていました。
    ありがとうございます。

    キャンセル

  • 2018/03/24 22:45

    ヘッダファイルにコードを書く、.c のファイルをインクルードする、書いた当人はいいこと思いついた、オレって天才ぢゃん、と思ってるんだろうなあ。

    トラブったコードの火消ししにいくとよくぶち当たるパターン。。

    キャンセル

  • 2018/03/24 22:49

    疲れています。リンクしてみたらまたエラーが出ています。
    いつ寝れますかね。

    キャンセル

  • 2018/03/24 22:54

    エラーメッセージを読もう。そしてどういう意味か理解すれば、それを潰すのは簡単ですぜ

    キャンセル

  • 2018/03/24 23:06

    englishが苦手です。何とか読む努力はしてますけど。

    キャンセル

  • 2018/03/24 23:09

    /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/crt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    /tmp/ccYTLGI5.o: In function `dbg_calloc':
    dbg_malloc_sub.c:(.text+0x2e): undefined reference to `dbg_malloc'
    /tmp/ccYTLGI5.o: In function `dbg_realloc':
    dbg_malloc_sub.c:(.text+0x89): undefined reference to `dbg_malloc'
    dbg_malloc_sub.c:(.text+0xeb): undefined reference to `dbg_memory_block_hash'
    dbg_malloc_sub.c:(.text+0x16f): undefined reference to `dbg_free'
    /tmp/ccYTLGI5.o: In function `dbg_strdup':
    dbg_malloc_sub.c:(.text+0x1b1): undefined reference to `dbg_malloc'
    collect2: error: ld returned 1 exit status

    適当に試したらこうなったけど、エラーってコレ?

    キャンセル

  • 2018/03/24 23:13

    短文だし定形だし、せいぜい中学生レベルの文法で、さらに言えばぐぐる翻訳にでもかければ日本語で出てきます。
    せっかくエラーの説明を出してくれてるんだから、それを活用しないともったいないですよ

    #回答者さん、しゃしゃりでてスンマセン

    キャンセル

  • 2018/03/24 23:17

    asmさん、y_waiwaiさんありがとうございます。よろこんでリンクしたらいろんなところでエラー出ました。
    明日やりなおします。

    キャンセル

同じタグがついた質問を見る

  • C

    4528questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。