2014-04-13 75 views
0

我有以下代碼:從嵌套結構訪問信息傳遞給函數

struct wordPair { 
     char* englishWord; 
     char* foreignWord; 
}; 

struct dictionary { 
     struct wordPair ** data; 
     int nbwords; 
     int size; 
}; 

說我有struct dictionary *dictionaryPtr充滿了一些數據,我把它傳遞給下面的功能:

char* dictionary_translate(struct dictionary* d, 
         const char* const english_word, 
         const char* const foreign_word) 

在函數dictionary_translate,我如何訪問嵌套在傳遞的struct中的struct wordPair的數據?我需要該函數返回englishWordforeignWord的一個strdup。

我試圖d->data->englishWord,但這給了我錯誤「請求成員'englishWord'在某些不是結構或聯盟」。

更新!

我需要的功能dictionary_translate要做的是確定是否有一個匹配的單詞對包含傳遞給它的單詞之一,並返回翻譯的strdup(對中的另一個單詞)。以下是我定義的詞的數組:

const char* test_translations[NB_TESTS][NB_COLS] = 
{ 
    {"hello", "hola"}, 
    {"cat", "gato"}, 
    {"dog", "perro"}, 
    {"thanks", "gracias"}, 
    {"pants", "pantalones"}, 
    {"shoes", "zapatos"}, 
}; 

這是我如何打電話來的第一次測試,我想的功能,這是當函數傳遞一個英文單詞的翻譯和要求返回一個外來詞:只要程序獲取到翻譯功能

char* translationPtr = NULL; 

for (i = 0; i < NB_TESTS; i++) { 
    translationPtr = dictionary_translate(dictionaryPtr, test_translations[i][0], NULL); 
    printf("English Word %s translated: %s\n", test_translations[i][0], translationPtr); 
} 

這裏是因爲我有這麼遠的翻譯功能......

char* dictionary_translate(struct dictionary* d, 
          const char* const english_word, 
          const char* const foreign_word){ 
    int i; 

    if (d == NULL) return NULL; 

    for (i = 0; i < d->nbwords; i++) { 
     if (strcmp(english_word, d->data[i]->englishWord) == 0) 
      return strdup(d->data[i]->foreignWord); 
     else if (strcmp(foreign_word, d->data[i]->foreignWord) == 0) 
      return strdup(d->data[i]->englishWord); 
    } 

    return NULL; 
} 

,它崩潰。我無法弄清楚調試器是怎麼回事,但看起來好像translationPtr從來沒有一個NULL(0x0)以外的值。我對調試器是新的,所以我確信它可以告訴我更多,如果我知道如何閱讀它。

+0

也許你需要解引用數據,如d - >(* data) - > englishWord,因爲它看起來像數據是指向數組的指針。 – HypnoToad

+0

@DoctorZero:這不是語法上有效的C. –

回答

-3
d->(*data)->englishWord 

應該編譯。

+1

我認爲你應該去諮詢一個編譯器,以瞭解它對錶達式編譯的看法。我的觀點(我承認不是C編譯器)是它在語法上不正確。 –

+0

這是正確的。試一試。 –

+0

我正在努力禮貌。你需要通過C編譯器運行代碼 - 它不能編譯。如果你有一個C編譯器,它可以編譯它,請提供完整的細節。添加行'if(strcmp(d - >(* data) - > englishWord,「aleph」)== 0)return NULL;'我顯示的代碼導致了Mac OS X上的GCC 4.8.2 10.9.2 Mavericks說:'dict.c:函數'dictionary_translate':'和 'dict.c:24:19:error:expected identifier before'('token' at'if(strcmp(d - >(* data) - >英語字符,「aleph」)== 0)' 和插入標記'^'標記'(*(* data)''。' –

0

這是不完全清楚你的函數是做什麼的,但對可能合法地工作的最簡單的實現是:

#include <string.h> 

struct wordPair 
{ 
    char *englishWord; 
    char *foreignWord; 
}; 

struct dictionary 
{ 
    struct wordPair **data; 
    int nbwords; 
    int size; 
}; 

extern char *dictionary_translate(struct dictionary *d, 
            const char *const english_word, 
            const char *const foreign_word); 

char *dictionary_translate(struct dictionary *d, 
          const char *const english_word, 
          const char *const foreign_word) 
{ 
    for (int i = 0; i < d->nbwords; i++) 
    { 
     if (strcmp(english_word, d->data[i]->englishWord) == 0) 
      return strdup(d->data[i]->foreignWord); 
     else if (strcmp(foreign_word, d->data[i]->foreignWord) == 0) 
      return strdup(d->data[i]->englishWord); 
    } 
    return 0; 
} 

我想你應該檢查你的struct dictionary的設計。使用雙指針似乎沒有必要(或使用它的原因並不明顯)。唯一的優點是你有一個指向struct wordPair的連續指針陣列,而實際的struct wordPair元素不需要連續分配它們自己。以下代碼是一個更正統定義,假定的struct wordPair一個連續數組是沒有問題的:

#include <string.h> 

struct wordPair 
{ 
    char *englishWord; 
    char *foreignWord; 
}; 

struct dictionary 
{ 
    struct wordPair *data; 
    int nbwords; 
    int size; 
}; 

extern char *dictionary_translate(struct dictionary *d, 
            const char *const english_word, 
            const char *const foreign_word); 

char *dictionary_translate(struct dictionary *d, 
          const char *const english_word, 
          const char *const foreign_word) 
{ 
    for (int i = 0; i < d->nbwords; i++) 
    { 
     if (strcmp(english_word, d->data[i].englishWord) == 0) 
      return strdup(d->data[i].foreignWord); 
     else if (strcmp(foreign_word, d->data[i].foreignWord) == 0) 
      return strdup(d->data[i].englishWord); 
    } 
    return 0; 
} 

鑑於樣品測試代碼,其中的參數dictionary_translate()一個是NULL指針,代碼在該函數中,如果它爲空,則必須修改它以不引用該參數。這假定struct dictionary的雙指針版本。

char *dictionary_translate(struct dictionary *d, 
          const char *const english_word, 
          const char *const foreign_word) 
{ 
    for (int i = 0; i < d->nbwords; i++) 
    { 
     if (englishWord != NULL && strcmp(english_word, d->data[i]->englishWord) == 0) 
      return strdup(d->data[i]->foreignWord); 
     else if (foreignWord != NULL && strcmp(foreign_word, d->data[i]->foreignWord) == 0) 
      return strdup(d->data[i]->englishWord); 
    } 
    return 0; 
} 
+0

感謝您的輸入!我更新了我的原始問題。我實現了您的建議功能(需要指導者添加幾個)更多信息現在問題在運行時崩潰了,但是您在嵌套結構中訪問信息的方式似乎很有用! – xfriendsonfirex