デバッグの方法

みなさんは、日ごろプログラミングにおいてデバッグはどのようにされているだろうか。Eclipse などの開発環境を使っている場合は、それを利用すればいいと思う。
みなさんは、日ごろプログラミングにおいてデバッグはどのようにされているだろうか。Eclipse などの開発環境を使っている場合は、それを利用すればいいと思う。

C で、error: label at end of compound statement

人の作った C プログラムを gcc でコンパイルしていたら、 XXXXX.c:999: error: label at end of compound statement とのエラー。
人の作った C プログラムを gcc でコンパイルしていたら、 XXXXX.c:999: error: label at end of compound statement とのエラー。

C で、バイト列を画面に文字列で表示する方法

ここでは、作成したバイト列(バイナリ)のハッシュ値を表示する方法を考えてみよう。
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main(int argc, char** argv) {

    unsigned char hash[SHA_DIGEST_LENGTH];
    unsigned char* b;
    unsigned char* s = "string string string";
    int i, dlen;

    dlen = strlen(s);

    if ((b = (unsigned char *)malloc(dlen)) == NULL) {
        return (-1);
    }

    memcpy(b, s, dlen);
    SHA1(b, dlen, hash);
printf("hash: ");
    <strong>for(i = 0; i < SHA_DIGEST_LENGTH; i++) {
printf("%02X", *(hash + i));
    }</strong>
printf("\n");
    free(b);
}
上の内容を hashtest.c とかいう名前で保存して、 gcc -lssl hashtest.c とコンパイルすればよい。コンパイルすると a.out というファイルができるから ./a.out [Enter キー] で実行してみよう。
ここでは、作成したバイト列(バイナリ)のハッシュ値を表示する方法を考えてみよう。
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main(int argc, char** argv) {

    unsigned char hash[SHA_DIGEST_LENGTH];
    unsigned char* b;
    unsigned char* s = "string string string";
    int i, dlen;

    dlen = strlen(s);

    if ((b = (unsigned char *)malloc(dlen)) == NULL) {
        return (-1);
    }

    memcpy(b, s, dlen);
    SHA1(b, dlen, hash);
printf("hash: ");
    <strong>for(i = 0; i < SHA_DIGEST_LENGTH; i++) {
printf("%02X", *(hash + i));
    }</strong>
printf("\n");
    free(b);
}
上の内容を hashtest.c とかいう名前で保存して、 gcc -lssl hashtest.c とコンパイルすればよい。コンパイルすると a.out というファイルができるから ./a.out [Enter キー] で実行してみよう。

C で、ハッシュ値を求める方法

#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main(int argc, char** argv) {

    unsigned char hash[SHA_DIGEST_LENGTH];
    unsigned char* b;
    unsigned char* s = "string string string";
    int dlen;

    dlen = strlen(s);

    if ((b = (unsigned char *)malloc(dlen)) == NULL) {
        return (-1);
    }

    memcpy(b, s, dlen);  //  s を b に dlen 分だけ(すなわち文字列 s を)コピーする。
    SHA1(b, dlen, hash); // b を c 分だけのハッシュ値を hash に求める。

// 処理

    free(b);
}
上の内容を hashtest.c とかいう名前で保存して、 gcc -lssl hashtest.c とコンパイルすればよい。
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main(int argc, char** argv) {

    unsigned char hash[SHA_DIGEST_LENGTH];
    unsigned char* b;
    unsigned char* s = "string string string";
    int dlen;

    dlen = strlen(s);

    if ((b = (unsigned char *)malloc(dlen)) == NULL) {
        return (-1);
    }

    memcpy(b, s, dlen);  //  s を b に dlen 分だけ(すなわち文字列 s を)コピーする。
    SHA1(b, dlen, hash); // b を c 分だけのハッシュ値を hash に求める。

// 処理

    free(b);
}
上の内容を hashtest.c とかいう名前で保存して、 gcc -lssl hashtest.c とコンパイルすればよい。

C で、処理にかかった時間を計る方法

以下の関数を用意して、
#include <sys/time.h>

int cputime()
{
    struct timeval tp;
    void *tzp;

    tzp = NULL;
    gettimeofday(&tp,tzp);

    return tp.tv_sec*1000 + tp.tv_usec/1000;
}
void foo {
    int starttime, endtime
    startime = cputime();

    // 処理

    endtime = cputime();

printf("CPU Time: %d ms\n", endtime - starttime);
}
とすればよい。これで、ミリ秒(ms)の値が得られる。ポイントは gettimeofday という関数を使うこと。
以下の関数を用意して、
#include <sys/time.h>

int cputime()
{
    struct timeval tp;
    void *tzp;

    tzp = NULL;
    gettimeofday(&tp,tzp);

    return tp.tv_sec*1000 + tp.tv_usec/1000;
}
void foo {
    int starttime, endtime
    startime = cputime();

    // 処理

    endtime = cputime();

printf("CPU Time: %d ms\n", endtime - starttime);
}
とすればよい。これで、ミリ秒(ms)の値が得られる。ポイントは gettimeofday という関数を使うこと。