Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.04.2012
Сообщений: 7

Перевести код с C на C#

10.04.2012, 16:21. Показов 794. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть код на C мне необходимо перевести его на C#
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
long i, x, y, z;
unsigned char *v, *vbuf;
 
 
for(y=0;y<512;y++)
{
        for(x=0;x<512;x++)
        {
            z = 0;
            while (1)
            {
                for(i=z;i<v[1];i++) setgeom(x,y,i,0);
                for(z=v[1];z<=v[2];z++) setcol(x,y,z,*(long *)&v[(z-v[1]+1)<<2]);
                if (!v[0]) break; z = v[2]-v[1]-v[0]+2; v += v[0]*4;
                for(z+=v[3];z<v[3];z++) setcol(x,y,z,*(long *)&v[(z-v[3])<<2]);
            }
            v += ((((long)v[2])-((long)v[1])+2)<<2);
        }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.04.2012, 16:21
Ответы с готовыми решениями:

Перевести ассемблерный код TASM в программный код для архитектуры ARM
Необходимо программный код перевести в программный код языка ассемблер для архитектуры ARM, учитывая синтаксис, структуру программы и...

Ребята,можно ли этот код перевести на чистый си(Код смешан с си++)
Задача: 4 балла: Разработать игровое поле для змейки. Продумать способ хранения змейки, управления с помощью стрелок. Отобразить змейку...

Каким образом можно перевести код Паскаля в код Фортран?
Здравствуйте уважаемые программисты! Может быть банальная, но довольно сложная проблема - перевод из одного кода в другой! Как его можно...

5
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.04.2012, 16:24
Код же не полный.
Во-первых, не определены методы setgeom и setcol, во-вторых он закрашится на первой же итерации при попытке доступа к не определенному указателю v.
Ну и в-третьих, чтобы его "перевести", достаточно заменить unsigned char* v, bbuf на byte[] v, vbuf и условие while(1) на while(true).
0
0 / 0 / 0
Регистрация: 10.04.2012
Сообщений: 7
10.04.2012, 16:54  [ТС]
Я и сам смог определить эти методы
Вот весь код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
typedef struct { double x, y, z; } dpoint3d;
dpoint3d ipos, istr, ihei, ifor;
 
    //Called at least once for every voxel of the board
    //issolid: 0:air, 1:solid
void setgeom (long x, long y, long z, long issolid) { /*your code here*/ }
 
    //Called only for surface voxels
    //A surface voxel is any solid voxel with at least 1 air voxel
    //  on one of its 6 sides. All solid voxels at z=0 are automatically
    //  surface voxels, but this is not true for x=0, x=1023, y=0, y=1023,
    //  z=255 (I believe)
    //argb: 32-bit color, high byte is used for shading scale (can be ignored)
void setcol (long x, long y, long z, long argb) { /*printf("%d %d %d: %08x\n",x,y,z,argb);*/ }
 
long loadvxl (char *filnam)
{
    FILE *fil;
    long i, x, y, z;
    unsigned char *v, *vbuf;
 
    fil = fopen(filnam,"rb"); if (!fil) return(-1);
 
        //Allocate huge buffer and load rest of file into it...
    i = filelength(_fileno(fil))-ftell(fil);
    vbuf = (unsigned char *)malloc(i); if (!vbuf) { fclose(fil); return(-1); }
    fread(vbuf,i,1,fil);
    fclose(fil);
 
        //Set entire board to solid
    for(z=0;z<64;z++)
        for(y=0;y<512;y++)
            for(x=0;x<512;x++)
                setgeom(x,y,z,1);
 
    v = vbuf;
    for(y=0;y<512;y++)
        for(x=0;x<512;x++)
        {
            z = 0;
            while (1)
            {
                for(i=z;i<v[1];i++) setgeom(x,y,i,0);
                for(z=v[1];z<=v[2];z++) setcol(x,y,z,*(long *)&v[(z-v[1]+1)<<2]);
                if (!v[0]) break; z = v[2]-v[1]-v[0]+2; v += v[0]*4;
                for(z+=v[3];z<v[3];z++) setcol(x,y,z,*(long *)&v[(z-v[3])<<2]);
            }
            v += ((((long)v[2])-((long)v[1])+2)<<2);
        }
 
    free(vbuf);
}
Добавлено через 10 минут
Вот что у меня получилось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
 
namespace ConsoleApplication1
{
    class MapLoader
    {
        struct dpoint3d
        {
            double x, y, z;
        }
        dpoint3d ipos, istr, ihei, ifor;
        void setgeom(long x, long y, long z, long issolid) { /*your code here*/ }
        void setcol(long x, long y, long z, long argb) { /*printf("%d %d %d: %08x\n",x,y,z,argb);*/ }
 
        void loadvxl(string filnam)
        {
            StreamReader file = new StreamReader(filnam);
            int i, x, y, z;
            byte[] v, vbuf;
            i = (int)file.BaseStream.Length;
            vbuf = new byte[i];
            file.BaseStream.Read(vbuf, 1, i);
            file.Close();
            for (z = 0; z < 64; z++)
            {
                for (y = 0; y < 512; y++)
                {
                    for (x = 0; x < 512; x++)
                    {
                        setgeom(x, y, z, 1);
                    }
                }
            }
            v = vbuf;
            for (y = 0; y < 512; y++)
            {
                for (x = 0; x < 512; x++)
                {
                    z = 0;
                    while (true)
                    {
                        //не могу перевести эту часть
                    }
                    //и эту
                }
            }
        }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.04.2012, 17:07
В шарпе нет смещения массива через указатель, потому как отсутствуют указатели в безопасном контексте.
Проще всего в вашем случае подключить небезопасный контекст и воспользоваться указателями, тогда код останется практически таки же:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unsafe void loadvxl(string filnam)
{
    long i, x, y, z;
    byte[] vbuf;
 
    vbuf = File.ReadAllBytes(filnam);
 
    //Set entire board to solid
    for (z = 0; z < 64; z++)
        for (y = 0; y < 512; y++)
            for (x = 0; x < 512; x++)
                setgeom(x, y, z, 1);
 
    fixed (byte* ptr = vbuf)
    {
        byte* v = ptr;
        for (y = 0; y < 512; y++)
            for (x = 0; x < 512; x++)
            {
                z = 0;
                while (true)
                {
                    for (i = z; i < v[1]; i++) setgeom(x, y, i, 0);
                    for (z = v[1]; z <= v[2]; z++) setcol(x, y, z, *(long*)&v[(z - v[1] + 1) << 2]);
                    if (v[0] != 0) break; z = v[2] - v[1] - v[0] + 2; v += v[0] * 4;
                    for (z += v[3]; z < v[3]; z++) setcol(x, y, z, *(long*)&v[(z - v[3]) << 2]);
                }
                v += ((((long)v[2]) - ((long)v[1]) + 2) << 2);
            }
    }            
}
1
0 / 0 / 0
Регистрация: 10.04.2012
Сообщений: 7
11.04.2012, 16:22  [ТС]
Спасибо, даже не знал что так можно.

Добавлено через 23 часа 11 минут
У тебя в коде ошибка:
C#
1
if (v[0] != 0) break;
Должно быть так:
C#
1
if (v[0] == 0) break;
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.04.2012, 16:53
Alexey19, точно, спасибо за поправку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2012, 16:53
Помогаю со студенческими работами здесь

Нужно код из паскаль перевести в делфи (сортировка выбором), код ниже и условие
нужно добавить в процедуру делфи код сортировки выбором из паскаль чтобы сортировало код делфи procedure TForm1.Button18Click(Sender:...

Как перевести код с паскаля на Java. Пытался сам но код не хочет работать переведенный
А сам код на паскале работает. Вот код на паскале var i,j,m,c,d: integer; A:array of integer; begin c:=1; ...

Перевести код С++ в код на Ассемблере (Ассемблерная вставка для С++)
Приветствую знатоков! Трудоемко ли перевести код функции Func под ассемблерную вставку (в Visual Studio через __asm (?)) Код на С++...

Как перевести этот код на код Delphi
uses crt; const nmax=100; var a:arrayof integer; n,i,k,j,x:integer; begin clrscr; randomize; repeat write('Размер...

Как шестнадцатеричный код перевести в код символа
Подскажите пожалуйста. Есть шестнадцатеричный код как его перевести в код символа: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru