2015-05-25 3 views
0

Мне нужно рассчитать комиссионные за разные интервалы продаж в разные дни и сформировать таблицу «День», «Продажи», «Комиссионные». До сих пор я сделал это:Fortran 90 Ошибка массива символов

real::a(5),b(5) 
character(10)::c(5)=(/Sunday,Monday,Tuesday,Wednesday,Thursday/) 

open(1,file='in_1.txt') 
open(2,file='out_1.txt') 

read(1,*)(a(i),i=1,5) 

do i=1,5 
    if(0.<a(i).and.a(i)<99.)then 
     b(i)=a(i)*.02 
    elseif(100.<a(i).and.a(i)<299.)then 
     b(i)=a(i)*.05 
    elseif(300.<a(i).and.a(i)<499.)then 
     b(i)=a(i)*.075 
    else 
     b(i)=500.*.1+(a(i)-500.)*.125 
    endif 
enddo 

write(2,*)' Day ',' Sales ',' Commissions ' 

do i=1,5 
    write(2,10)c(i),a(i),b(i) 
    10 format(a10,t15,f4.1,t25,f8.2) 
enddo 

total=0. 
do i=1,5 
    total=total+b(i) 
enddo 

write(2,20)total 
20 format('Total Commissions',t25,f8.2) 

end 

продаж с воскресенья по четверг в входном файле in_1.txt.

При запуске отображается ошибка: Элемент в REAL (4) конструктор массива INTEGER (4).

Что это значит и как его решить?

+0

Объём компилятора в строке 2. Я использую Code :: Blocks 13.12 в качестве компилятора. –

+2

Если это ваш полный код, то 'implicit none', так как ваша первая строка покажет вам, почему возникает проблема – francescalus

+3

неявное правило -> Sunday = single-precision-real -> real (4) array -> Monday = integer -> Ошибка ? – roygvib

ответ

2

Вы используете неявное типирование, которое маскирует основную ошибку. Неявная типизация присваивает тип, основанный на первом символе имени переменной.

Инициализатором массив:

(/Sunday,Monday,Tuesday,Wednesday,Thursday/) 

решает типы этих необъявленных переменных, как

(/ реальное, целочисленный, вещественный, реальный, реальный /)

и выдает ошибку, потому что вы имеют целое число в вашем массиве реалов.

Вы можете увидеть это более ясно с тестом ниже:

print *,(/1., 2, 3., 4., 5./) 
end 

Это не компилируется с такой же ошибкой, как ваши:

arcon.f90:1:13: 

print *,(/1., 2, 3., 4., 5./) 
      1 
Error: Element in REAL(4) array constructor at (1) is INTEGER(4) 

Таким образом, типы в конструкторе массива должны все совпадают, и это то, что означает ошибка.


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

character(10)::c(5)=(/Sunday,Monday,Tuesday,Wednesday,Thursday/) 

в

character(10)::c(5)=(/"Sunday","Monday","Tuesday","Wednesday","Thursday"/) 

но вы найдете новую ошибку:

print *,(/"Sunday","Monday","Tuesday","Wednesday","Thursday"/) 
          1 
Error: Different CHARACTER lengths (6/7) in array constructor at (1) 

и решить, что вы хотите изменить свою инициализацию

character(10)::c(5)=(/"Sunday ","Monday ","Tuesday ","Wednesday","Thursday "/) 

Вы всегда должны использовать implicit none в своем коде, чтобы избежать маскировки вашей реальной ошибки. Ваш оригинальный конструктор массива, без неявной типизации бы вместо того, чтобы излучаемый ошибку

Error: Symbol ‘monday’ at (1) has no IMPLICIT type 

давая вам знать, что вы либо забыли объявить переменную monday или что это должно было быть что-то еще, например, строковый литерал в этом случае.

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