2010-10-25 2 views
0

Привет всем, Я получаю ошибку компиляции в своем коде, и я не могу понять, что делать. Вот блок:Ошибка несовместимого указателя Ошибка

#include <stdio.h> 
#include <string.h>  
/* 
* Function to return index at which team ID input is stored 
*/ 
int getIndex(char* id, char* idList[][50]) { 
    int k; 
    for (k=0; k<50; k++) { 
     if (strcmp(id,idList[k])==0) { 
      return k; 
     } 
    } 
    printf("Error in getIndex function.\n"); 
    return -1; 
} 

и ошибка говорит

Passing argument 2 of 'strcmp' from incompatible pointer type 

ошибка происходит на 8-й строке кода в блоке (если заявление).

EDIT (размещена здесь от имени Михаила, так как он не может редактировать свои сообщения пока)

уточню, что я хотел сделать, так как я на самом деле не делают хорошую работу при этом.

Мне нужен id [], который должен быть массивом до 50 символов для сравнения с idList [] [], который представляет собой массив строк (до 50 строк до 50 символов каждый).

Я изменил код этого,

/* 
* Function to return index at which team ID input is stored 
*/ 
int getIndex(char* id[], char* idList[][50]) { 
    int k; 
    for (k=0; k<50; k++) { 
     if (strcmp(id[],idList[k][])==0) { 
      return k; 
     } 
    } 
    printf("Error in getIndex function.\n"); 
    return -1; 
} 

но получил ошибку говоря:

Expected expression ']' before token 

ответ

4

idList[k] Выражения является char* [50] объектом, а не char* объекта. Вероятно, вы намеревались сделать подпись char idList[][50] или char* idList[50], или вы, вероятно, хотели бы дать второй указатель (как в idList[k][j]). Именно это означает сообщение об ошибке. Очевидно, вы знаете, что функция лучше всего, поэтому вы находитесь в лучшем положении, чтобы точно знать, какой из этих вариантов вы имели в виду.

Редактировать
На основе этой обновленной информации, что вы, вероятно, хотите, это:

int getIndex(const char* id, const char* id_list[], int id_list_length) { 
    for (int i = 0; i < id_list_length; i++) { 
     if (!strcmp(id, id_list[i])) { 
      return i; 
     } 
    } 
    printf("Error in getIndex function; ID \"%s\" not found.\n", id); 
    return -1; 
} 

Во-первых, обратите внимание, что я использую const char* вместо char*. Это является улучшением в том, что он сообщает компилятору, что содержимое строки не будет изменено. Во-вторых, размер списка задается в параметре, а не жестко закодирован в сигнатуру функции. Наконец, в подписи гораздо меньше применений скобок (т.е. []) (как правило, в C и C++ обычно чаще встречается указатель в сигнатуре, особенно учитывая, что массивы фактически являются не чем иным, как указателями на повторяющиеся данные) , Вы можете применять требование длины, когда вы создаете массив, однако обычно чаще всего разрешается динамическая динамика и вычисляется автоматически.Вот пример использования:

const char* id_list[] = { "Alpha", "Bravo", "Charlie" }; 
int id_list_length = 3; 
int zero = getIndex("Alpha", id_list, id_list_length); 
int one = getIndex("Bravo", id_list, id_list_length); 
int two = getIndex("Charlie", id_list, id_list_length); 
int negative_one = getIndex("Not in there", id_list, id_list_length); 

Вы могли бы также рассмотреть вопрос об изменении этого использовать NULL, как символ окончания для списка:

int getIndex(const char* id, const char* null_terminated_id_list[]) { 
    for (int i = 0; null_terminated_id_list[i] != NULL; i++) { 
     if (!strcmp(id, null_terminated_id_list[i])) { 
      return i; 
     } 
    } 
    printf("Error in getIndex function; ID \"%s\" not found.\n", id); 
    return -1; 
} 

Тогда вам даже не нужно записывать длину списка , вы можете написать что-то вроде:

const char* id_list[] = { "Alpha", "Bravo", "Charlie", NULL }; 
int zero = getIndex("Alpha", id_list); 
int one = getIndex("Bravo", id_list); 
int two = getIndex("Charlie", id_list); 
int negative_one = getIndex("Not in there", id_list); 
+0

Я пытался сравнить id [] (я оставил скобки в коде) с idList [k] [] (я не уверен, что k находится в правой скобке). Я хочу сравнить идентификатор «string» со всеми «строками» в idList (содержит 50 строк по 50 символов каждый). – Michael

+0

@Michael: если idList - это список из 50 строк, то он может быть объявлен как 'char * idList [50]', имея в виду, что компилятор не будет принудительно применять то, что ему действительно 50. Вы объявили 'idList 'как 2-мерный массив' char * ', но, похоже, вам нужен массив' char * '. –

0

В VS, я получаю эту ошибку:

error C2664: 'strcmp' : cannot convert parameter 2 from 'char *[50]' to 'const char *'

Проблема заключается в том, что idList[k] представляет собой массив указателей, а не массив символов.

В C строка является либо char*, либо char[], но не char*[]. A char*[] будет представлять собой массив строк, что означает char*[][] (это то, что ваша функция в настоящее время принимает) представляет собой массив массивов строк ...

Вам либо нужно будет сменить подпись функции (на что-то вроде char idList[][50] или char* idList[50]), или как-нибудь добавить второй индекс (что-то вроде idList[k][j]), чтобы подпись соответствовала правильно.

У вас есть массив строк или массив массивов строк?

  • Если у вас есть массив строк, исправить подпись функции: char* idList[50]
  • Если у вас есть массив массивов строк, вам нужно изменить тело функции, и, возможно, подпись, передать размер каждого из этих внутренних массивов:

Пример кода для 2-го варианта ...

int getIndex(char* id, char* idList[][50], size_t idListSizes[50]) { 
    int k, l; 
    for (k=0; k<50; k++) { 
    for (l=0; l<idListSizes[k]; l++) { 
     if (strcmp(id,idList[k][l])==0) { 
     /* somehow return both k and l */ 

EDIT

После просмотра правку (который Вы отправляли сообщение в ответ на ваш вопрос :)), это то, что вы хотите:

int getIndex(char id[50], char idList[50][50]) { 
    int k; 
    for (k=0; k<50; k++) { 
    if (strcmp(id,idList[k])==0) { 
     return k; 
    } 
    } 
    printf("Error in getIndex function.\n"); 
    return -1; 
} 

Ключевым моментом здесь является то, что вы не должны использовать char* для представляют строку. A char[] - это то же самое.

Также обратите внимание, что в некоторых случаях C не будет обеспечивать размер. С кодом, я просто разместил, это будет компилироваться:

char blah[70]; 
char blee[14][50]; 
return getIndex(blah, blee); 

Хотя это не будет:

char blah[70]; 
char blee[14][27]; 
return getIndex(blah, blee); 

EDIT

Одна последняя вещь, вам нужны ваши строки быть размер 51, из-за завершающего нуля.Например:

char test[] = "test"; /* This is actually an array of size 5, not 4 */ 
char alt[] = { 't', 'e', 's', 't', '\0' }; /* same content as test... */ 
0

Если параметр idList должен представлять собой линейный массив идентификаторов, то он должен быть объявлен как либо char idList[][50] или char *idList[], в зависимости от того, на самом деле предоставляет сам массив строку памяти (бывший) или строковая память выделяется в другом месте (последнее). Скорее всего, вам нужен прежний вариант.

Что у вас сейчас есть - char *idList[][50] выглядит как странный гибрид двух и не имеет смысла в контексте ваших намерений, как я его понимаю.

Смежные вопросы