1

文字列に関しては、私が理解していない(Cの初心者)基本的なことがあると思います。基本的に私はuthashを使用しており、文字列を直接送信するときに機能しますが、ループからは機能しません(配列からデータを取得します)。

次に例を示します。

enum { MAX_ID_LEN = 5 };
struct my_struct {
    char id[MAX_ID_LEN];                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};
struct my_struct *users = NULL;

void new_stock(char *user_id, float price) {
    //printf("%c - %f \n", *user_id, price);
    struct my_struct *s;

    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, user_id);
    s->price = price;
    HASH_ADD_STR( users, id, s );  /* id: name of key field */
}
int main() {
    printf("starting.. \n");
    new_stock("IBM", 10.2);
    new_stock("goog", 2.2);
    return 0;
}

それは機能しますが、配列から同じことを行おうとすると機能しません(コンパイル時にエラーは発生しません)。

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char); 
float price_all[] =  {10.2, 2.2};

enum { MAX_ID_LEN = 5 };
struct my_struct {
    char id[MAX_ID_LEN];                    /* key */
    float price;
    UT_hash_handle hh;         /* makes this structure hashable */
};

struct my_struct *users = NULL;


void insert_data() {
    printf("inserting data \n");
    int data_loc;
    for (data_loc=0;data_loc<name_all_size;data_loc++) {
        //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
        //new_stock(name_all[data_loc], price_all[data_loc]);
        //new try
        struct my_struct *s;
        s = (struct my_struct*)malloc(sizeof(struct my_struct));
        strcpy(s->id, name_all[data_loc]);
        s->price = price_all[data_loc];
        //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
        HASH_ADD_STR( users, id, s );  /* id: name of key field */

    }
}

int main() {
    insert_data();
        return 0;
}

私はCを初めて使用するので、おそらくこれを間違って評価していますが、変数を渡す方法に関係していると思います。最初に試したときは関数に送信していましたnew_stockが、最初の文字しか表示されていなかったため、変数を渡す問題を回避するために、関数のすべての内容を、すべてのデータを追加するために使用していた関数に移動しました。しかし、私はまだ同じ問題を抱えています。

私が間違っていることについて何か考えはありますか?

また、個人的な興味から、コードの問題を警告するツールはありますか?gccは役に立ちますが、警告が停止すると、トラブルシューティングの方法がわかりません。このような問題を以前にキャッチするのに役立つ何かがありますか(gccよりも冗長なもの)。それが可能かどうかはわかりませんが、聞きたかったのです。

4

2 に答える 2

3

これがあなたのエラーです:

char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);

配列name_allcharポインタの配列であり、ではcharありません。したがって、32ビットポインタを備えた32ビットシステムの場合は8バイトになり、64ビットポインタを備えた64ビットシステムの場合は16バイトになります。ポイントされている文字列リテラルは配列に格納されず、文字列リテラルへのポインタのみが配列に格納されることに注意してください。あなたが本当に欲しいのは:

int name_all_size = sizeof(name_all)/sizeof(char*);
                                            ^^^^^ note the pointer type

これにより、の値が得られます2。これは、の正しい要素数ですname_all

于 2012-06-05T17:45:14.460 に答える
1
char *name_all[] =  {"ibm", "goog"};
int name_all_size =sizeof(name_all)/sizeof(char);

name_all2つの配列ですchar*。もそうsizeof name_allです2*sizeof(char*)。これは、32ビットシステムと64ビットシステムのどちらを使用しているかに応じて、通常は8ビットまたは16ビットです。sizeof(char)定義上1です。だからで

for (data_loc=0;data_loc<name_all_size;data_loc++) {
    //printf("%s - %f \n", name_all[data_loc], price_all[data_loc]);
    //new_stock(name_all[data_loc], price_all[data_loc]);
    //new try
    struct my_struct *s;
    s = (struct my_struct*)malloc(sizeof(struct my_struct));
    strcpy(s->id, name_all[data_loc]);
    s->price = price_all[data_loc];
    //printf("%s - %f \n", s->id, s->price); //ahh displays correctly but still fails
    HASH_ADD_STR( users, id, s );  /* id: name of key field */

}

配列の終わりを超えてアクセスしていますname_all

で割るつもりでしsizeof(char*)name_all_sizeか?

于 2012-06-05T17:45:21.470 に答える