プロトタイプ宣言を表示するためのデバッグ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fabersid
記事: 42
登録日時: 6年前

プロトタイプ宣言を表示するためのデバッグ

#1

投稿記事 by fabersid » 6年前

更新の目的
ver.1では対応できない複数行の
プロトタイプ宣言に対応するため

目的を達成するにはfgetsを使わない方法が必要
どのようにコードを書き換えるといいと思いますか?

読み込み方としては
  • 前から探す方法
  • 後ろから探し一致する部分があったら戻りなっがら出力
の2種類が考えられます。

ver.1
► スポイラーを表示
ver.2(製作中)
► スポイラーを表示

かずま

Re: プロトタイプ宣言を表示するためのデバッグ

#2

投稿記事 by かずま » 6年前

fabersid さんが書きました:
6年前
更新の目的
ver.1では対応できない複数行の
プロトタイプ宣言に対応するため

目的を達成するにはfgetsを使わない方法が必要
どのようにコードを書き換えるといいと思いますか?
「;」が見つかるまで、fgets を繰り返せばよいのでは?

コード:

void search(char argv1[],char dot_h[],int flag){
	FILE *file = fopen(dot_h, "r");
	char string[4000];                                          //
	if (file == NULL) return;                                   //
	while (fgets(string, sizeof(string), file) != NULL) {       //
		if (strstr(string, argv1)) {
			while (strchr(string, ';') == NULL) {               //
				int n = strlen(string);                         //
				fgets(string + n, sizeof(string) - n, file);    //
			}                                                   //
			strchg(string,"_RTLENTRY","");
			strchg(string,"_EXPFUNC","");
			while(strstr(string,"  "))strchg(string,"  "," ");
			strchg(string,"\n","");
			strchg(dot_h,"C:\\borland\\bcc55\\Include\\","");
			//if(string[0]=="/*")
			printf("%-10s: %s\n", dot_h, string);
			if(flag==0)break;
		}
	}
	fclose(file);
}

fabersid
記事: 42
登録日時: 6年前

Re: プロトタイプ宣言を表示するためのデバッグ

#3

投稿記事 by fabersid » 6年前

実行結果と期待値
► スポイラーを表示
現在のソースコード
► スポイラーを表示

かずま

Re: プロトタイプ宣言を表示するためのデバッグ

#4

投稿記事 by かずま » 6年前

なぜ spoilタグを使うのですか?

現在のソースコードでは、
なぜ "stdio.h" をコメントにしているのですか?
これでは fread は探せないと思います。

"C:\Users\admin\OneDrive\testcase.h" と書いていますが、
\a はアラート(警告ベル) で、\t はタブです。
\O というものは定義されていません。
#define BASE "C:\\borland\\bcc55\\Include\\" のように
\\ にしましょう。

fabersid
記事: 42
登録日時: 6年前

Re: プロトタイプ宣言を表示するためのデバッグ

#5

投稿記事 by fabersid » 6年前

かずま さんが書きました:
6年前
なぜ spoilタグを使うのですか?

現在のソースコードでは、
なぜ "stdio.h" をコメントにしているのですか?
これでは fread は探せないと思います。

"C:\Users\admin\OneDrive\testcase.h" と書いていますが、
\a はアラート(警告ベル) で、\t はタブです。
\O というものは定義されていません。
#define BASE "C:\\borland\\bcc55\\Include\\" のように
\\ にしましょう。
spoilタグは前まで長いコードが表示されていて
見渡しをよくするために使っていました。
現在はなくてもスクロールバーが出るみたいですね。
spoilタグを外します。

stdio.hをコメント化していたのはミスです。
複数のバージョンで保存していたために
投稿するコードを間違えました。
search関数を呼び出すところがtestcase.hだけを
使っているほうは簡略化用です。
正確には次のコードです。
現在のsearch関数はかずまさんが作ったバージョンです。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BASE "C:\\borland\\bcc55\\Include\\"

void search(char [],char [],int);
void strchg(char *, const char *, const char *);

int main(int argc,char *argv[]){
	int flag;
	if(argc==1){
		printf("引数は1つか2つ必要です。\n");
		printf("  例:%s 関数名\n",argv[0]);
		printf("  例:%s 関数名 /all\n",argv[0]);
		return 1;
	}
	if(argc==2)flag=0;
	else if(argc==3&&strcmp(argv[2],"/all")==0)flag=1;
	else{
		printf("引数が不正です。\n");
		return 1;
	}

	//search(argv[1],"C:\\Users\\admin\\OneDrive\\testcase.h",flag);
	search(argv[1],BASE"stdio.h",flag);
	search(argv[1],BASE"stdlib.h",flag);
	search(argv[1],BASE"string.h",flag);
	search(argv[1],BASE"math.h",flag);
	search(argv[1],BASE"windows.h",flag);
	search(argv[1],BASE"iostream.h",flag);
	search(argv[1],BASE"assert.h",flag);
	search(argv[1],BASE"ctype.h",flag);
	return 0;
}

void search(char argv1[],char dot_h[],int flag){
	FILE *file = fopen(dot_h, "r");
	char string[4000];                                          //
	if (file == NULL) return;                                   //
	while (fgets(string, sizeof(string), file) != NULL) {       //
		if (strstr(string, argv1)) {
			while (strchr(string, ';') == NULL) {               //
				int n = strlen(string);                         //
				fgets(string + n, sizeof(string) - n, file);    //
			}                                                   //
			strchg(string,"_RTLENTRY","");
			strchg(string,"_EXPFUNC","");
			while(strstr(string,"  "))strchg(string,"  "," ");
			strchg(string,"\n","");
			strchg(dot_h,"C:\\borland\\bcc55\\Include\\","");
			//if(string[0]=="/*")
			printf("%-10s: %s\n", dot_h, string);
			if(flag==0)break;
		}
	}
	fclose(file);
}

void strchg(char *buf, const char *str1, const char *str2){
    char *p = strstr(buf, str1);
    if (p) {
        int len = strlen(buf) + 1, len1 = strlen(str1), len2 = strlen(str2);
        do {
            len -= p - buf + len1;
            buf = p + len2;
            memmove(buf, p + len1, len);
            memcpy(p, str2, len2);
        } while ((p = strstr(buf, str1)) != NULL);
    }
}
testcase.hはヘッダファイルとして役に立ちません。
ですが、ソースコード中に記述があったので
ここに投稿しておきます。
オフトピック
次のtestcase.hはstdio.hの抜粋で構成されています。
これだけをヘッダファイルとして使うとプロトタイプ宣言の
警告を受けたりEOFが使えない。
わざとコメントは外さずにtestcase.hとして保存しています。

コード:

/*  Part of the "stdio.h"

    Definitions for stream input/output.

*/

/*
 *      C/C++ Run Time Library - Version 10.0
 *
 *      Copyright (c) 1987, 2000 by Inprise Corporation
 *      All Rights Reserved.
 *
 */

/* $Revision:   9.10  $ */
#ifndef __STDIO_H
#define __STDIO_H
#define _INC_STDIO  /* MSC Guard name */
typedef struct
{
        unsigned char  *curp;       /* Current active pointer     */
        unsigned char  *buffer;     /* Data transfer buffer       */
        int             level;      /* fill/empty level of buffer */
        int             bsize;      /* Buffer size                */
        unsigned short  istemp;     /* Temporary file indicator   */
        unsigned short  flags;      /* File status flags          */
        wchar_t         hold;       /* Ungetc char if no buffer   */
        char            fd;         /* File descriptor            */
        unsigned char   token;      /* Used for validity checking */
}       FILE;                       /* This is the FILE object    */
_SIZE_T   _RTLENTRY _EXPFUNC fread(void * __ptr, _SIZE_T __size, _SIZE_T __n,
                                 FILE * __stream);
int       _RTLENTRY _EXPFUNC printf(const char * __format, ...);
     using std::FILE;

fabersid
記事: 42
登録日時: 6年前

追記(pr150224)

#6

投稿記事 by fabersid » 6年前

編集前
投稿時にコピーしきれていない関数がありました。
編集可能時間を超過したため追記

コード:

/*  Part of the "stdio.h"

    Definitions for stream input/output.

*/

/*
 *      C/C++ Run Time Library - Version 10.0
 *
 *      Copyright (c) 1987, 2000 by Inprise Corporation
 *      All Rights Reserved.
 *
 */

/* $Revision:   9.10  $ */
#ifndef __STDIO_H
#define __STDIO_H
#define _INC_STDIO  /* MSC Guard name */
typedef struct
{
        unsigned char  *curp;       /* Current active pointer     */
        unsigned char  *buffer;     /* Data transfer buffer       */
        int             level;      /* fill/empty level of buffer */
        int             bsize;      /* Buffer size                */
        unsigned short  istemp;     /* Temporary file indicator   */
        unsigned short  flags;      /* File status flags          */
        wchar_t         hold;       /* Ungetc char if no buffer   */
        char            fd;         /* File descriptor            */
        unsigned char   token;      /* Used for validity checking */
}       FILE;                       /* This is the FILE object    */
_SIZE_T   _RTLENTRY _EXPFUNC fread(void * __ptr, _SIZE_T __size, _SIZE_T __n,
                                 FILE * __stream);
int       _RTLENTRY _EXPFUNC printf(const char * __format, ...);
     using std::FILE;
int       _RTLENTRY _EXPFUNC fprintf(FILE * __stream, const char * __format, ...);

fabersid
記事: 42
登録日時: 6年前

うまく表示できない原因がわかりました

#7

投稿記事 by fabersid » 6年前

例えば

コード:

programming_lang_helper_C_ver.2 FILE * __stream);
のように指定すると見つかったところからセミコロンまでが表示されるから

説明用testcase.h

コード:

/*  Part of the "stdio.h"

    Definitions for stream input/output.

*/

/*
 *      C/C++ Run Time Library - Version 10.0
 *
 *      Copyright (c) 1987, 2000 by Inprise Corporation
 *      All Rights Reserved.
 *
 */

/* $Revision:   9.10  $ */
#ifndef __STDIO_H
#define __STDIO_H
#define _INC_STDIO  /* MSC Guard name */
typedef struct
{
        unsigned char  *curp;       /* Current active pointer     */
        unsigned char  *buffer;     /* Data transfer buffer       */
        int             level;      /* fill/empty level of buffer */
        int             bsize;      /* Buffer size                */
        unsigned short  istemp;     /* Temporary file indicator   */
        unsigned short  flags;      /* File status flags          */
        wchar_t         hold;       /* Ungetc char if no buffer   */
        char            fd;         /* File descriptor            */
        unsigned char   token;      /* Used for validity checking */
}       FILE;                       /* This is the FILE object    */
_SIZE_T   _RTLENTRY _EXPFUNC fread(void * __ptr, _SIZE_T __size, _SIZE_T __n,
                                 FILE * __stream);
int       _RTLENTRY _EXPFUNC printf(const char * __format, ...);
     using std::FILE;
現在のソースコード

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BASE "C:\\borland\\bcc55\\Include\\"

void search(char [],char [],int);
void strchg(char *, const char *, const char *);

int main(int argc,char *argv[]){
	int flag;
	if(argc==1){
		printf("引数は1つか2つ必要です。\n");
		printf("  例:%s 関数名\n",argv[0]);
		printf("  例:%s 関数名 /all\n",argv[0]);
		return 1;
	}
	if(argc==2)flag=0;
	else if(argc==3&&strcmp(argv[2],"/all")==0)flag=1;
	else{
		printf("引数が不正です。\n");
		return 1;
	}

	search(argv[1],"C:\\Users\\admin\\OneDrive\\testcase.h",flag);
	search(argv[1],BASE"stdio.h",flag);
	search(argv[1],BASE"stdlib.h",flag);
	search(argv[1],BASE"string.h",flag);
	search(argv[1],BASE"math.h",flag);
	search(argv[1],BASE"windows.h",flag);
	search(argv[1],BASE"iostream.h",flag);
	search(argv[1],BASE"assert.h",flag);
	search(argv[1],BASE"ctype.h",flag);

	return 0;
}

void search(char argv1[],char dot_h[],int flag){
	FILE *file = fopen(dot_h, "r");
	char string[4000];                                          //
	if (file == NULL) return;                                   //
	while (fgets(string, sizeof(string), file) != NULL) {       //
		if (strstr(string, argv1)) {
			while (strchr(string, ';') == NULL) {               //
				int n = strlen(string);                         //
				fgets(string + n, sizeof(string) - n, file);    //
			}                                                   //
			strchg(string,"_RTLENTRY","");
			strchg(string,"_EXPFUNC","");
			while(strstr(string,"  "))strchg(string,"  "," ");
			strchg(string,"\n","");
			strchg(dot_h,"C:\\borland\\bcc55\\Include\\","");
			//if(string[0]=="/*")
			printf("%-10s: %s\n", dot_h, string);
			if(flag==0)break;
		}
	}
	fclose(file);
}

void strchg(char *buf, const char *str1, const char *str2){
    char *p = strstr(buf, str1);
    if (p) {
        int len = strlen(buf) + 1, len1 = strlen(str1), len2 = strlen(str2);
        do {
            len -= p - buf + len1;
            buf = p + len2;
            memmove(buf, p + len1, len);
            memcpy(p, str2, len2);
        } while ((p = strstr(buf, str1)) != NULL);
    }
}

かずま

Re: うまく表示できない原因がわかりました

#8

投稿記事 by かずま » 6年前

fabersid さんが書きました:
6年前
例えば

コード:

programming_lang_helper_C_ver.2 FILE * __stream);
のように指定すると見つかったところからセミコロンまでが表示されるから
本当ですか?

Windows のコマンドプロンプトで実行すると、
「引数が不正です。」と表示されます。

argc = 4
argv[0] = "programming_lang_helper_C_ver.2"
argv[1] = "FILE"
argv[2] = "*"
argv[3] = "__stream);"
argv[4] = NULL

Linux のシェル(bash など)で実行すると、
* がカレントディレクトリのファイル名に展開されるので、
argc はもっと大きくなったりしますが、やはり表示は
「引数が不正です。」になります。

かずま

Re: うまく表示できない原因がわかりました

#9

投稿記事 by かずま » 6年前

かずま さんが書きました:
6年前
Linux のシェル(bash など)で実行すると、
* がカレントディレクトリのファイル名に展開されるので、
argc はもっと大きくなったりしますが、やはり表示は
「引数が不正です。」になります。
すみません。bash では、
「bash: 予期しないトークン `)' 周辺に構文エラーがあります」
と表示されて、プログラムは実行されません。

fabersid
記事: 42
登録日時: 6年前

訂正

#10

投稿記事 by fabersid » 6年前

コード:

programming_lang_helper_C_ver.2 "FILE * __stream);"
です。
ダブルクォーテーションを忘れていました。
実行時はつけていたようです。
すみません

返信

“C言語何でも質問掲示板” へ戻る