-3

記録を停止するlircコマンドを作成したい。私はこれのために3つのファイルを持っています:

ファイル:record.c

...
#include "rec_tech.h"
...
void stop_rec_button_clicked_cb(GtkButton *button, gpointer data)
{
    Recording *recording = data;
    close_status_window();
    recording_stop(recording);
}
... 

ファイル:rec_tech.c

...
void recording_stop(Recording *recording)
{
    g_assert(recording);

    GstState state;
    gst_element_get_state(recording->pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
    if (state != GST_STATE_PLAYING) {
        GST_DEBUG ("pipeline in wrong state: %s", gst_element_state_get_name (state));
    } else {
        gst_element_set_state(recording->pipeline, GST_STATE_NULL);
    }
    gst_object_unref(GST_OBJECT(recording->pipeline));
    g_free(recording->filename);
    g_free(recording->station);
    g_free(recording);
}   
... 

ファイルrec_tech.h

...
#ifndef _REC_TECH_H
#define _REC_TECH_H
#include <gst/gst.h>
....
typedef struct {
    GstElement* pipeline;
    char* filename;
    char* station;
} Recording;

Recording*
recording_start(const char* filename);

void
recording_stop(Recording* recording);
...

ファイル:lirc.c

...
#include <lirc/lirc_client.h>
#include "lirc.h"
#include "rec_tech.h"
#include "record.h"

static void execute_lirc_command (char *cmd)
{
        printf("lirc command: %s\n", cmd);

        if (strcasecmp (cmd, "stop recording") == 0) {
            stop_rec_button_clicked_cb(NULL, data);
        }
...

コンパイルしようとすると、ファイルlirc.cでエラーが発生します

error: 'data' undeclared (first use in this function)

アップデート

lirc.cにある場合は、Recording*data;という行を追加します。

...
#include <lirc/lirc_client.h>
#include "lirc.h"
#include "rec_tech.h"
#include "record.h"

Recording *data;    
static void execute_lirc_command (char *cmd)
{
        printf("lirc command: %s\n", cmd);

        if (strcasecmp (cmd, "stop recording") == 0) {
            stop_rec_button_clicked_cb(NULL, data);
        }
...

この実行時エラーを取得します。

ERROR:rec_tech.c:recording_stop: assertion failed: (recording)

なんで?

4

1 に答える 1

3

g_assert()inはnull ポインターではないことをrecording_stop()確認しrecordingますが、変更された呼び出し inexec_lirc_command()は null ポインターを渡します。したがって、アサーションは失敗します。

道徳 — null ポインターを期待していない関数に null ポインターを渡さないでください。

于 2012-07-27T00:18:49.593 に答える