-4

[編集:] 多くのコードを削除しました。そして、私はそれをより単純な質問に減らしました。

この変数を渡してもよろしいですか...

char Record_Info[file_length + 1];

次のように、別の関数に変換します。

listdir(tempdesc, 0, sockid, Record_Info);

このヘッダーを使用します:

int listdir(char *dirname, int lvl, int sockid, char Record_Info[])

そして、listdir() は自分自身を何度も呼び出すことができますか?

.

* 元の質問 *

別の目がこれを見ることができるかどうか疑問に思っていました。それは機能していましたが、さらにコードを追加しました (おそらくsprintf、下部の近くにもっとありSegmentation faultます)。

このプログラムは Web ページを正しく作成/送信しますが、関数からsend_recordings_list()関数に戻るとクラッシュしparsing_request()ます。ファイルからデータをフォーマットする方法を理解する必要はないと思いますが、とにかくそのビットを含めました。

ほとんどの場合、私は静的変数を使用しており、free()何かしようとすると、別のセグ フォールトまたは gcc lib フォールトが発生します。また、 functions() 間で変数を渡すことが問題を引き起こしている可能性があるかどうかもわかりませんか?

また、別の関数 (ここには示されていません) が約 4MB の Web ページを送信します。これを何度も呼び出すことができ、クラッシュしません。// ******興味のある行にいくつか配置しましたか?

そうそう、私はまだ標準的なエラー処理をあまり行っていません... (後で行います)。

.

だからそれはで始まりますparsing_request()

に行くsend_recordings_list()

に行きlistdir()ます。(これは自分自身を何度も呼び出します)

戻るsend_recordings_list()

. (ここでセグフォルト)

戻るparsing_request()

.

「ああ、あなたが何をしたかわかりましたfool……」と言う人もいると思います

組み込み Linux 2.6.27、GCC 4.2.4、32MB RAM

void parsing_request(int sockid, char *buff)
{
  char *res_line=malloc(MAXLINE), path[MAXLINE], *line;
  // Cut code
  if (strcmp(line, "/recordings_body.htm") == 0)
  {
    send_recordings_list (sockid);      // ****** IT GOES HERE 1st ******
    return;
  }
  free (res_line);
  return;
}




int send_recordings_list(int sockid)
{
    int  hnd;
    int  hnd2;
    char tempdesc[MAX_PATH_LENGTH];


    // Copy all of the data <1 MiB   (Slow reading)
    int file_length = lseek (hnd2, 0, SEEK_END);
    char Record_Info[file_length + 1];      // ******
    lseek (hnd2, 0, SEEK_SET);
    read (hnd2, Record_Info, file_length);
    close (hnd2);

    // Cut out code

    del_file_cnt = 0;
    sprintf (tempdesc, "%s/Recordings", TOPPY_DIR);
    listdir(tempdesc, 0, sockid, Record_Info);        // ***** Major 2nd call here
    return 0;
}





int listdir(char *dirname, int lvl, int sockid, char Record_Info[])
{

    int i;
    DIR* d_fh;
    struct dirent* entry;
    char longest_name[4096];
    char tempdesc[4096], morespace[128];
    int  row_col;
    char chan_name[128], alt_name[128], desc[500], category[128], rec_time[14], start_time[14], end_time[14];
    char trim_file_name[128], trim_file_name2[128], trim_alt_name[128], file_links[1535];
    char logo[128];
    int  length, u_score, dot;
    char *looky_pos1, *looky_pos2;
    int  is_match;

    struct tm tm_rec, tm_start, tm_end;
    time_t tim_rec, tim_start, tim_end;

    // Cut out code

  return 0;
}
4

3 に答える 3

4

申し訳ありませんが、これは絶望的な混乱です。valgrind や gdb などの Linux ツールの使用方法を学びます。要求したメモリが最終的に一度解放され、使用が終了した後に解放されることを注意深く確認してください。関数からローカル変数へのポインタを渡していないことを確認してください。文字列が期待されるデータに対応するのに十分な長さであることを確認してください (または、現在存在しないエラー処理の一部として確認してください)。

驚くほど効果的なデバッグ戦略の 1 つは、テディ ベア コンサルタントです。テディ ベアを入手し、問題を段階的に説明します。それが役に立たない場合にのみ、本物の人間が保証されます. [それを説明するために自分の理解を整理すると、本当によく考え抜く必要があるため、うまくいきます。]

于 2013-01-30T11:23:36.730 に答える
1

コードをざっと見てみると、次の 2 つのオプションがあります。

  1. エラーの処理方法、リソースの管理方法、グローバル変数の回避方法を学ぶ
  2. あなたのためにそれを行うプログラミング言語を使用してください

どちらも時間がかかりますが、2 番目のアプローチを使用すると、生産性が大幅に向上します。

感覚をつかむために、上記を Python で実装してみることをお勧めします。

于 2013-01-30T11:25:44.740 に答える
0

最近の投稿に答えて、関数に文字値を渡すことができるかどうかを尋ねます...あなたが何をしようとしているのかわかりません。関数プロトタイプでは、char variable_name []として最終パラメーターがありますが、配列を渡そうとしていますか?もしそうなら、なぜポインタを使用しないのですか?

したがって、プロトタイプは次のようになります。

int listdir(char *dirname, int lvl, int sockid, char* Record_Info);

参照による受け渡しは、必要かどうかに関係なく、常にもう少し制御できる傾向があります。配列の特定の要素を渡そうとしていますか?

于 2013-01-30T15:43:49.063 に答える