Здравствуйте! Проблема такова: Нужно построить картинку на Bitmap из значений массива y. Значения там хранятся в виде 0 и 1ю Проблема заключается в самом построении. Компилятор выдает ошибки:
Unexpected identifier in expression
в этом месте(выделяется temp перед [<EntryPoint>]):
for i=0 to count-1 do
y.[i]<- y1.[i]
temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
temp
[<EntryPoint>]
do Application.Run(avtomat(y, y1, count, zero))
И Incomplete structured construct at or before this point in implementation file .
Компилятор выделяет как ошибку конец строки
do Application.Run(avtomat(y, y1, count, zero))
Вот весь код:
#light
open System;
open System.Drawing;
open System.Windows.Forms;
let count=61
let zero= 0
let y = Array.create count 0
let y1 = Array.create count 0
let TorIt(x:int, count:int)=
if x < 0 then x+count
else x % count
let f(y1:int, y2:int, y3:int)= y1 ||| y2 ||| y3;;
let image = new Bitmap(600, 600);;
let temp = new Form();;
let avtomat (y: int[], y1: int[], count:int, zero:int) =
let y = Array.init count (fun i -> if i=30 then 1 else 0)
for i=0 to count-1 do
for x2=0 to image.Width do
for y2=0 to image.Height do
if y.[i]=0 then image.SetPixel(x2,y2,Color.Red)
else image.SetPixel(x2,y2,Color.Green)
for g=0 to 100 do
for i=0 to count-1 do
y1.[i]<- f(y.[TorIt(i-1, count)], y.[TorIt(i, count)], y.[TorIt(i+1, count)])
for i=0 to count-1 do
y.[i]<- y1.[i]
temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
temp
[<EntryPoint>]
do Application.Run(avtomat(y, y1, count, zero))
Помогите пожалуйста с проблемой! Заранее спасибо!
Здравствуйте, algoritm256, Вы писали:
A>A> temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
A>
Добавьте недостающую закрывающую скобку для Add
Здравствуйте, samius, Вы писали:
S>Здравствуйте, algoritm256, Вы писали:
A>>A>> temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0)
A>>
S>Добавьте недостающую закрывающую скобку для Add
Спасибо! Исправил, что вы указали и кое-где еще код подправил. Теперь проблема: ArgumentOutOfRange exception( Parameter must be positive and < Height.)
вот в этом месте
else
image.SetPixel(w,h,Color.Green)
for g=0 to 100 do
Вот измененный код:
#light
open System;
open System.Drawing;
open System.Windows.Forms;
let count=61
let zero= 0
let y = Array.create count 0
let y1 = Array.create count 0
let TorIt(x:int, count:int)=
if x < 0 then x+count
else x % count
let f(y1:int, y2:int, y3:int)= y1 ||| y2 ||| y3;;
let image = new Bitmap(600, 600);;
let temp = new Form();;
let avtomat (y: int[], y1: int[], count:int, zero:int) =
let y = Array.init count (fun i -> if i=30 then 1 else 0)
for w=0 to image.Width do
for h=0 to image.Height do
for i=0 to count-1 do
if y.[i]=0 then image.SetPixel(w,h,Color.Red)
else
image.SetPixel(w,h,Color.Green)
for g=0 to 100 do
for i=0 to count-1 do
y1.[i]<- f(y.[TorIt(i-1, count)], y.[TorIt(i, count)], y.[TorIt(i+1, count)])
for i=0 to count-1 do
y.[i]<- y1.[i]
temp.Paint.Add(fun e -> e.Graphics.DrawImage(image, 0, 0))
temp
[<EntryPoint>]
avtomat(y, y1, count, zero)
Мне нужно в зависимости от значения i-го элемента массива, окрасить определенным цветом пиксель и вивести на битмап. Если не трудно, можете подсказать, где я туплю. Заранее спасибо!
Здравствуйте, algoritm256, Вы писали:
A>Здравствуйте, samius, Вы писали:
A>Спасибо! Исправил, что вы указали и кое-где еще код подправил. Теперь проблема: ArgumentOutOfRange exception( Parameter must be positive and < Height.)
Не удивительно
A>A> for w=0 to image.Width do
A> for h=0 to image.Height do
A> for i=0 to count-1 do
A>
размеры картинки 600x600. Координаты пикселей начинаются с 0-я. Значит максимально допустимая координата — 599. А вы обращаетесь к методу SetPixel с координатой 600.
При этом у вас цикл по i оформлен правильно, до count-1.
надо чуток внимательнее.
З.Ы. вычисление свойств Width/Height у объекта Bitmap очень долгое. Будет лучше если вы однажды их запомните, или вынесете в константы, что бы не обращаться к этим свойствам на каждой итерации цикла.
Или если вам без разницы, с какой стороны ходить по картинке, можно вывернуть циклы наизнанку.
for w = image.Width - 1 to 0 do
Дело пойдет значительно быстрее.
То же можно сказать о функции SetPixel — очень дорого. Но пока не заморачивайтесь по поводу SetPixel.