ошибка: неоднозначная перегрузка для оператора - PullRequest
2 голосов
/ 26 июля 2010

Я новичок в c, и следующее вызывает у меня некоторое горе:

int i,j,ll,k;
double ddim,ddip,ddjm,ddjp,ddlm,ddlp;
for(i=1; i<(mx-1); i++){
for(j=1; j<(my-1); j++){
 for(ll=1; ll<(mz-1); ll++){

 ddim=0.5*k
 ddip=0.5*k
 ddjm=0.5*k
 ddjp=0.5*k
 ddlm=0.5*k
 ddlp=0.5*k

  Wijl(i,j,ll) =  ((1.0/h_x)*(ddip) \
     ((1.0/h_x)*(ddim))   \
     ((1.0/h_y)*(ddjp))   \
     ((1.0/h_y)*(ddjm))   \
     ((1.0/h_z)*(ddlp))   \
     ((1.0/h_z)*(ddlm)) ; 
          }
     }
}

Затем я компилирую это с помощью gcc, используя python и scipy, передавая ему все, что не инициализировано, но я знаю, что проблема в части кода 1.0 / h_x. Если я скомпилирую базовые операторы c, используя python / gcc, это сработает, поэтому у меня нет проблем с python / gcc.

Ошибка, которую я получаю: "ошибка: неоднозначная перегрузка для оператора 'в' 1.0e + 0 / h_x"

Кажется, что он пытается перегрузить присвоение, и все, что я хочу сделать, это деление!

Любая помощь будет принята с благодарностью! :)

Спасибо

Тайлер

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Я думаю, что пытается сказать, что не ясно, что это за тип h_x, поэтому он не знает, какой из перегруженных / операторов использовать (double / int, double / double и т. Д.).Вы можете попробовать привести его (h_x) к int или double, чтобы указать, какую версию использовать.

0 голосов
/ 27 июля 2010

Я настоятельно рекомендую вам тщательно удалить все лишние скобки и внимательно изучить, что осталось.

Например, этот фрагмент:

((1.0/h_x)*(ddim)*((q(i,j,ll) - q(i-1,j,ll)))/h_x)

сводится к:

ddim * (q(i,j,ll) - q(i-1,j,ll)) / h_x / h_x

Обратите внимание, что первоначальное разделение двух вхождений / h_x заставляет задуматься, каково было первоначальное намерение.

0 голосов
/ 26 июля 2010

Если h_x равно float, то при делении 1.0 (по умолчанию double) на него C задается вопросом, выполнять ли операцию с плавающей или двойной математикой.

Если вы хотите сделать это поплавками, измените 1.0 на 1.0f; если удваивается, объявите или разыграйте h_x на double.

Если h_x равно int (это то, чего я боюсь), вы, вероятно, преуспели бы в том, чтобы назначить свои h_? на три соответствующие переменные типа float или double temp вне цикла, чтобы сохранить компилятор от (возможно) выполнения множества ненужных преобразований типа int-to-float. В качестве побочного эффекта это устранит неопределенность вашего типа.


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

...