2015-10-10 2 views
1

я кодирование то, что должно найти оптимальный ответ на следующий вопрос:«ошибка: индексируются значение ни массив, ни указатель, ни вектор»

You have a vector of ints that you have to put in decrescent order by doing the "flip" operation, that is, given an i position in the vector of size n you should switch the values of i and n-1, the values of i+1 and n-2 and so on and so forth. The goal is to find and optimal way to put the vector in order, that is, with the minimal number of flips

я решил использовать A * algorithim найти ответ, так как это важно, чтобы найти оптимальный ответ, и хранить всю информацию, мне нужно, я выбираю использовать следующую структуру:

typedef struct{ 
      int *v, *flips,g, h; 
} node; 

, в котором v будет состояние раствора, переворачивает бы сохраните мой выбор, g сохранит значение функции g, а h - значение эвристического ,

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

estados=malloc(n*sizeof(node)); 

и идея состояла в том, чтобы использовать каждую позицию вектора узла для сохранения состояния, так что можно было бы сравнить и расширена и т.д. по большей части компилятор не жалуетесь много, но в этих функциях:

int funcaoh(node estados,int n,int goal[], int pos){ 
    int cont=0, i; 
    for(i=0;i<n;i++){ 
     if(estados[pos].v[i]!=goal[i]){ 
      cont++; 
     } 
    } 
    return (cont/2); 
} 

void criaNode(node x[], int n, int pos){ 
    int i; 
    x[pos].v =malloc(n*sizeof(int)); 
    x[pos].flips =malloc(n*sizeof(int)); 
    for(i=0;i<n;i++){ 
     x[pos].flips[i]=-1; 
     x[pos].v[i]=-1; 
    } 
    x[pos].h=0; 
    x[pos].g=0; 
    return; 
} 

Я получаю ошибку «ошибка: индексируются значение не является ни массивом, ни указателя, ни вектор» в заявлении, если функция funcaoh ion и «предупреждение: несовместимое неявное объявление встроенной функции« malloc »[включено по умолчанию]» предупреждение в первом malloc заявление, но не на втором, как ни странно. То же самое происходит и в нескольких подобных примерах кода. Я подозреваю, что предупреждающий может мне просто использовать malloc не так, потому что я получаю такое же предупреждение в других местах, которые действительно не должны быть проблемой, например, в :

Но главное - заставить вектор struct работать, потому что он, очевидно, является неотъемлемой частью успеха программы. Если бы я мог догадаться, я полагаю, что это связано с использованием структуры как вектора, может быть, она не работает так, как я думаю, что она делает? Хотя я не знаю.

P.S. Я бразилец, поэтому некоторые части кода написаны на португальском языке, в основном просто имена переменных и функций, при необходимости я могу их перевести.

+0

Обратите внимание, что стандарт C не использует термин «вектор», но более основной «массив». – Olaf

+0

Как вы сами признались, было бы более последовательно давать обе функции и переменные в вашем коде значащие английские имена. Я также не являюсь носителем английского языка, и не программисты вокруг меня в Париже, но я соблюдаю это правило в своей компании и во всех других местах, за которыми я отвечал. – chqrlie

ответ

2

В funcaoh():

int funcaoh(node estados,int n,int goal[], int pos){ 

estados является простой структурой, а не указатель на структуру, так что вы не можете индексировать его и т.д. Вот что сказал компилятор; Я должен согласиться с этим.

Вы вероятно, потребуется один из них (они эквивалентны):

int funcaoh(node *estados, int n, int goal[], int pos) { … } 

int funcaoh(node estados[], int n, int goal[], int pos) { … } 
+0

'' Я должен согласиться с этим. - Вы нашли повод не согласиться с компиляторами? –

+1

@FiddlingBits: иногда у компиляторов есть ошибки, особенно те, которые мы пишем сами ;-) В этом конкретном случае я был бы немного более точным: 'estados' должен быть указателем на ** массив ** по меньшей мере' n '' структуры узла. – chqrlie

+2

@FiddlingBits: У меня были случаи, когда я хотел не согласиться с компиляторами, но компиляторы обычно были правы. Я нашел пару ошибок в компиляторах (в течение тридцати лет - не часто!), Но они довольно редки, и для того, чтобы доказать, что это ошибка, требуется много работы. И в этом случае нет вопроса (на мой взгляд), но что компилятор прав, по причинам, которые я изложил. –

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