2014-12-04 2 views
0

Я написал очень маленькую функцию в C. Функция должна читать две [долготы], [широта] матрицы местоположения. И моя цель состоит в том, чтобы выводить расстояния между ними и весовым массивом. Ниже приведен код, который я написал:Нельзя скрывать от 'double' до 'double [1]' in C

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#define PI 3.14159265358979323846 

double hdist(double in1[][3], double in2[][3], double dout[][1], double wout[][1]) 
/* data input: in1, in2 */ 
/* output: dout, wout */ 
{ 
    int i,j,k,rowin1,rowin2; 
    double lonH, latH; 
    rowin1=(sizeof(in1)/sizeof(in1[0])); // The number of observations for in1 
    rowin2=(sizeof(in2)/sizeof(in2[0])); // The number of observations for in2 

    k=0; 
    for(i=0;i<rowin1;i++) { 
     for(j=0;j<rowin2;j++) { 
      lonH = sin(0.5*(in1[i][0]-in2[i][0])*PI/180.0) 
       * sin(0.5*(in1[i][0]-in2[i][0])*PI/180.0); 
      latH = sin(0.5*(in1[i][1]-in2[i][1])*PI/180.0) 
       * sin(0.5*(in1[i][1]-in2[i][1])*PI/180.0); 
    /* distance in kilometers */ 
      dout[k] = 0.001*6372797.560856*2*asin(sqrt(latH+(cos(in1[i][1]*PI/180.0) 
        * cos(in2[j][1]*PI/180))*lonH)); 
    /* weights */ 
      wout[k] = in1[i][3]*in2[j][3]; 
      k++; 
     } 
    } 
} 

Я получил сообщение об ошибке в время компиляции:

dout2.c(21):error C2440: '=' : cannot convert from 'double' to 'double [1]' 
dout2.c(23):error C2440: '=' : cannot convert from 'double' to 'double [1]' 

бы вы пожалуйста, дайте мне знать, как пересмотреть код --- для вывода массивы «dout» и «wout»?

+0

Почему люди голосуют за это? – onemasse

+0

возможно из-за его крайней неприязни к пробелу? Во всяком случае, я ненавижу горизонтальную прокрутку. – Deduplicator

+0

Это не мой вопрос. :) И, может быть, это ваше крайнее отвращение к отсутствию пробелов, что является проблемой.;) – onemasse

ответ

2

Есть по крайней мере три ошибки:

1) Вам необходимо изменить double dout[][1] на double dout[]. Или, альтернативно, измените dout[k] на dout[k][0]. То же самое для wout.

2) Измените double hdist(...) на void hdist(...), потому что ваша функция не возвращает значение.

3) Неверный расчет rowin1=(sizeof(in1)/sizeof(in1[0])). Вам нужно будет это сделать за пределами из hdist, а затем передать rowin1 в качестве параметра. То же для rowin2.

+0

Спасибо, Джозеф. Я последовал твоему предложению. Кажется, это сработало. Не могли бы вы посмотреть обновление, которое я сделал? Нужно ли мне «возвращение»? утверждение в функции hdist? Благодарю. –

2

Это:

wout[i] = in1[i][3] * in2[j][3]; 

присваивает результат умножения, что явно один double, к переменной, объявленной в double wout[][2]. Это не имеет никакого смысла, вы действительно не можете назначить одно значение массиву.

3

dout[k] и wout[k], вам не хватает второго индекса в этих случаях.

Согласно вашему делу, dout[k] имеет тип данных double[1] и in1[i][3] имеет тип double. То же самое для wout[k].

Ваш компилятор очень прав. :-)

Возможно, вы хотите изменить dout и wout в массив 1D?

1

Лучший способ решить эту проблему, я думаю, чтобы удалить дополнительные измерения на DOUT и Wout, например, так:

double hdist(double in1[][3], double in2[][3], double dout[], double wout[])

+0

Спасибо вам. Я попробовал «dout []» и «wout []». Теперь у меня есть другое сообщение об ошибке: предупреждение C4716: «hdist» должен вернуть значение. LIBCMT.lib (crt0.obj): ошибка LNK2019: неразрешенная внешняя символьная основная ссылка в функции __tmainCRTStartup ... фатальная ошибка LNK1120: 1 нерешенные внешние. –

1

EDIT: Спасибо за все ваши комментарии:

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#define PI 3.14159265358979323846 

void hdist(double in1[][3], double in2[][3], 
      int num1, int num2, 
     double dout[], double wout[]) 
/* data input: in1[lon,lat], in2[lon,lat], 
      num1: The # of obs in1, 
      num2: The # of obs in2 */ 
/* output: dout, wout */ 
{ 
int i,j,k,rowin1,rowin2; 
double lonH,latH; 

rowin1 = num1; 
rowin2 = num2; 

k=0; 
for(i=0;i<rowin1;i++) { 
    for(j=0;j<rowin2;j++) { 
     lonH = sin(0.5*(in1[i][0]-in2[j][0])*PI/180.0) 
     *sin(0.5*(in1[i][0]-in2[j][0])*PI/180.0); 
     latH = sin(0.5*(in1[i][1]-in2[j][1])*PI/180.0) 
     *sin(0.5*(in1[i][1]-in2[j][1])*PI/180.0); 
/* distance in kilometers */ 
     dout[k] = 0.001*6372797.560856*2 
     *asin(sqrt(latH+(cos(in1[i][1]*PI/180.0) 
     *cos(in2[j][1]*PI/180.0))*lonH)); 
/* weights */ 
     wout[k] = in1[i][2]*in2[j][2]; 
     k++; 
    } 
} 
return; // Do I need this "return;" statement?? 
} 

int main() 
{ 
/* lon, lat */ 
double loc1[3][3] = {{-75.547513,39.757077,679}, 
        {-75.554342,39.749864,1199}, 
      {-75.555394,39.730672,626}}; 
double loc2[2][3] = {{-75.688608,39.284356,466}, 
        {-75.530489,39.770331,320}}; 
double dout[6]; double wout[6]; 
int i,n1,n2; 

n1 = sizeof(loc1)/sizeof(loc1[0]); 
n2 = sizeof(loc2)/sizeof(loc2[0]); 

printf("The number of rows loc1=%d\n", n1); 
printf("The number of rows loc2=%d\n", n2); 

hdist(loc1,loc2,n1,n2,dout,wout); 

for(i=0;i<6;i++){ 
    printf("Distance = %.3f\n", dout[i]); 
} 

for(i=0;i<6;i++){ 
    printf("weight = %.1f\n", wout[i]); 
} 

return 0; 
} 

Вопрос: мне нужен ли "вернуться"; в функции «void hdist»?

+0

Здесь нет инструкции 'return'. –