powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
25 сообщений из 47, страница 1 из 2
Переписываю древний код на C#.
    #39502722
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
В комментариях датируется 1991!!! годом, КАРЛ!!!
Мне тогда было 6 лет.

Код: plaintext
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.
long  ica010(short nv,char *a, char kod,long l1,long l2)
{
short   t=0,k;
long  j,lf,li,lx;
char  *nam,*cl,c;
FILE  *VECTOR;

if (a==NULL) return(0);
if ( l1>l2 )  return(0);    // обмен с файлом не возможен
if (kod!='m' && kod!='w') kod='r';
nam=file_name(t,nv);
cl=(char *) &lf;
if ((VECTOR = fopen(nam, "rb")) != NULL) {
	for (j = 0; j<4; j++)	*(cl + j) = getc(VECTOR);
	k = feof(VECTOR);
}
else k = 1;
if (k != 0 || kod == 'w')  lf = 0;
li = (lf<l2) ? lf : l2;  lx = (l2>lf) ? l2 : lf;

if (kod == 'r') {                        // считование файла 
	if (k != 0 || l1 >= lf || l2 <= 0)
	{
		if (VECTOR != NULL) fclose(VECTOR); return(0);
	}       // считование файла не возможно

	if (l1>0) fseek(VECTOR, l1, 1);
	for (j = l1; (j<li && feof(VECTOR) == 0); j++)
		*(a + j - l1) = getc(VECTOR);
	fclose(VECTOR); return(li - l1);
}     // конец считования файла



Вызов
Код: plaintext
1.
2.
3.
4.
 static pasat0   stp;
if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; } 
	ic = stp.kcp;  // кол. сква.
	ip = stp.plp;  // кол. 



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  typedef struct {
.....................................
.....................................
.....................................
    char   a10buf[3]; // резерв                                                    224
//========== Защита ===================
	char   zasita;           // признак защиты  1-защищена 0-не защищена           225
	char   zasita2;          // признак строгой защиты                             226
	char   parol_zas[14];    // пароль защиты                                      240
    char   name_hoz_mod[32]; // имя компа (хозяин модели)                          272
	char   name_admin[32];   // имя администратора                                 304
 short  burbs[4];     // 

//
}   pasat0;



Не понимаю как это же самое сделать на C#.
Больше всего смущает как это все вливается в переменную struct:
Код: plaintext
1.
*(a + j - l1) = getc(VECTOR);



Совсем не врубаюсь как это повторить на C#
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502763
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
*(a + j - l1) = getc(VECTOR);


равнозначно
Код: plaintext
1.
a[j - l1] = getc(VECTOR);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502938
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем ценность этого кода? Он стоит таких трудозатрат?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502942
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

5-10 минут?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglmayton,

5-10 минут?
Я думаю что у нас с вами разные оценки качества кода.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502969
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSiemarglmayton,

5-10 минут?
Я думаю что у нас с вами разные оценки качества кода.я оценил переписывание
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglmaytonпропущено...

Я думаю что у нас с вами разные оценки качества кода.я оценил переписывание
Я бы сюда добавил переосмысление этого куска кода и покрытие тестами.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502992
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokНе понимаю как это же самое сделать на C#.
Больше всего смущает как это все вливается в переменную struct:
Код: plaintext
1.
*(a + j - l1) = getc(VECTOR);



Совсем не врубаюсь как это повторить на C#

Что за переменная struct.struct - ключевое слово, не может переменная иметь такое имя. А вливается, как вы говорите, у вас всё в stp, которая является структурой. Ничего удивительного там нет, вы передаете адрес начала участка памяти и некими значениями производите инициализацию по этому адресу и соседних с ним.

Возьмите и перепишите на C#, что конкретно-то не понятно?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39502999
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВозьмите и перепишите на C#, что конкретно-то не понятно?

Ну, как бы, C# не позволяет так вольно обращаться с памятью. Она защищена от погроммистов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503003
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok,

Исходник толст и нуден. По Холстеду difficulty ~ 1 час и 20 минут где-то. Это время на освоение и review.

Кроме того в лихих 91-х кодеры были тоже лихие и не следовали конвенциям по именам. Отсюда и
вырвиглазный VECTOR (типа константа блин) и подозрительный lf который издалека
похож на if.

Я-бы тебе предложил следующее. Поскольку исходник на "C" рабочий то его надо использовать
как площадку для генерации тестовых сценариев. Необходимо набрать кучу бинарных файлов
(штук 10-20) и обработать их всех через ica010. Зафикировать результат (return(li - l1)) и ее побочный
эффект в виде изменения аргумента char *a.

Далее. Мы имеем чоткие сценарии которые можно включать в Unit-тесты для C#. У тебя есть вход
и выход для фунции.

Я-бы также советовал не бездумно переписывать а рефакторить. Игры с указателями должны уйти.
Вместо них - операции с массивами.

Для того чтобы подавить diffuculty я-бы предложил убрать прямые файловые операции (fseek).
И разбить ica010 на обертку

Код: c#
1.
long ica010(int nv, ref string a, char kod, long l1, long l2){...}


и внутренний метод который будет работать с текстовым стримом (System.IO.StreamReader)

Код: c#
1.
long ica010_internal(StreamReader sr, .....) {....}



Обе из них разделят difficulty на части и общая сложность функций упадет и станет чуть легче разбираться
и суппортить. Модульные тесты также удобно гонять по внутреннему методу.

И сделать интерфейс отвязным от файловых имет и путей и прочее.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503051
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryvadipokНе понимаю как это же самое сделать на C#.
Больше всего смущает как это все вливается в переменную struct:
Код: plaintext
1.
*(a + j - l1) = getc(VECTOR);



Совсем не врубаюсь как это повторить на C#

Что за переменная struct.struct - ключевое слово, не может переменная иметь такое имя. А вливается, как вы говорите, у вас всё в stp, которая является структурой. Ничего удивительного там нет, вы передаете адрес начала участка памяти и некими значениями производите инициализацию по этому адресу и соседних с ним.

Возьмите и перепишите на C#, что конкретно-то не понятно?

Конкретно не понятно как работает getc.
Мы ему не передаем какие символы от куда до куда считать нужно.
А он получается берет корректные данные разной длины и заполняет ими struct.
Есть аналог данной функции на C#?
Хотя mayton вроде все разжевал уже что делать.
Спасибо.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503053
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokКонкретно не понятно как работает getc.
Это считывание одного байта из файла.

В C# аналог FileStream.ReadByte()
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503055
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю тебе не помешает поизучать что такое указатели в С/С++. В C# это тоже может пригодится, их там можно использовать в unsafe коде.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503232
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один вопрос, коллеги.
Как сделать индексный доступ к переменной struct?
Гугление не помогает.
А то в одну и ту же функцию isa010 могут передаваться разного формата struct.
Желательно этот момент сделать наиболее гибким.

Спасибо.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503248
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЕще один вопрос, коллеги.
Как сделать индексный доступ к переменной struct?
Гугление не помогает.
А то в одну и ту же функцию isa010 могут передаваться разного формата struct.
Желательно этот момент сделать наиболее гибким.

Спасибо.
Если речь об этом
Код: plaintext
1.
2.
 static pasat0   stp;
if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; } 


то никак. Только сериализация в массив byte[] и обратно. В isa010 передавать byte[].

А лучше сделать все структуры классами унаследованными от какого-то базового и ica010() поправить так чтобы на вход принимал базовый класс и его заполнял.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503253
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TvadipokЕще один вопрос, коллеги.
Как сделать индексный доступ к переменной struct?
Гугление не помогает.
А то в одну и ту же функцию isa010 могут передаваться разного формата struct.
Желательно этот момент сделать наиболее гибким.

Спасибо.
Если речь об этом
Код: plaintext
1.
2.
 static pasat0   stp;
if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; } 


то никак. Только сериализация в массив byte[] и обратно. В isa010 передавать byte[].

А лучше сделать все структуры классами унаследованными от какого-то базового и ica010() поправить так чтобы на вход принимал базовый класс и его заполнял.нельзя. в оригинале сериализация без элайна
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503279
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TvadipokЕще один вопрос, коллеги.
Как сделать индексный доступ к переменной struct?
Гугление не помогает.
А то в одну и ту же функцию isa010 могут передаваться разного формата struct.
Желательно этот момент сделать наиболее гибким.

Спасибо.
Если речь об этом
Код: plaintext
1.
2.
 static pasat0   stp;
if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; } 


то никак. Только сериализация в массив byte[] и обратно. В isa010 передавать byte[].

А лучше сделать все структуры классами унаследованными от какого-то базового и ica010() поправить так чтобы на вход принимал базовый класс и его заполнял.

Речь об этом
Код: plaintext
1.
*(a + j - l1) = getc(VECTOR);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503313
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Об этом я уже ответил 20711429 20712493
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503323
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОб этом я уже ответил 20711429 20712493

В C++ понятно все, спасибо.
Мне бы это же сделать на С#.
При команде
Код: c#
1.
stp[i] = fs.ReadByte();


возникает ошибка: не удается применить индексирование через [] к выражению типа "Programma.pasat0".
Лучше наверно об это в форуме C# спросить.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503331
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тебе уже написал что так не получится 20713095
stp должно иметь тип byte[], для этого тебе надо написать свой сериализатор Programma.pasat0 в byte[]
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503413
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая однако *фигура*, байтовый доступ в С#.....

Слегка почерканный пример из MSDN
Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
using System.Runtime.InteropServices;

unsafe class TestCopy
{
	
	[StructLayout(LayoutKind.Sequential, Pack = 1)]
	struct BeepBop {
		public byte a;
		public int ia;
		public byte b;
		public 	int ib;
	}
	
    // The unsafe keyword allows pointers to be used in the following method.

    static unsafe void Copy(byte[] source, int sourceOffset, byte* target,
        int targetOffset, int count)
    {
        // If either array is not instantiated, you cannot complete the copy.
        if ((source == null) || (target == null))
        {
            throw new System.ArgumentException();
        }

        // If either offset, or the number of bytes to copy, is negative, you
        // cannot complete the copy.
        if ((sourceOffset < 0) || (targetOffset < 0) || (count < 0))
        {
            throw new System.ArgumentException();
        }

        // If the number of bytes from the offset to the end of the array is 
        // less than the number of bytes you want to copy, you cannot complete
        // the copy. 
        if (source.Length - sourceOffset < count)
        {
            throw new System.ArgumentException();
        }

        // The following fixed statement pins the location of the source and
        // target objects in memory so that they will not be moved by garbage
        // collection.
        byte* pTarget = target;
        fixed (byte* pSource = source)
        {
            // Set the starting points in source and target for the copying.
            byte* ps = pSource + sourceOffset;
            byte* pt = pTarget + targetOffset;

            // Copy the specified number of bytes from source to target.
            for (int i = 0; i < count; i++)
            {
                *pt = *ps;
                pt++;
                ps++;
            }
        }
    }

    static void Main()
    {
        // Create two arrays of the same length.
        int length = 100;
        byte[] byteArray1 = new byte[length];
        byte[] byteArray2 = new byte[length];
        BeepBop stru = new BeepBop {a = 60, ia = 3,b = 62, ib = 5};
        
        
        System.Console.WriteLine( "id = {0} sizeof =  {1}", stru.ib, sizeof(BeepBop) );

        // Fill byteArray1 with 0 - 99.
        for (int i = 0; i < length; ++i)
        {
            byteArray1[i] = (byte)i;
        }

        // Display the first 10 elements in byteArray1.
        System.Console.WriteLine("The first 10 elements of the original are:");
        for (int i = 0; i < 10; ++i)
        {
            System.Console.Write(byteArray1[i] + " ");
        }
        System.Console.WriteLine("\n");

        // Copy the contents of byteArray1 to byteArray2.
        fixed (byte *pC = byteArray2)
        	Copy(byteArray1, 0, pC , 0, length);
      	Copy(byteArray1, 0,  (byte*)&stru, 0, sizeof(BeepBop));

        // Display the first 10 elements in the copy, byteArray2.
        System.Console.WriteLine("The first 10 elements of the copy are:");
        for (int i = 0; i < 10; ++i)
        {
            System.Console.Write(byteArray2[i] + " ");
        }
        System.Console.WriteLine("\n");


        // Display the first 10 elements in the copy, byteArray2.
        System.Console.WriteLine("The first 10 elements of the copy are:");
        for (int i = 0; i < 10; ++i)
        {
            System.Console.Write(byteArray2[i] + " ");
        }
        System.Console.WriteLine("\n");
    }
}

...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503704
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капец как у ms фигурные скобки пишут.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503806
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ тебе уже написал что так не получится 20713095
stp должно иметь тип byte[], для этого тебе надо написать свой сериализатор Programma.pasat0 в byte[]

Код: 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.
        static byte[] ica010(long l1, long l2)
        {
            // создаем объект BinaryFormatter
            BinaryFormatter formatter = new BinaryFormatter();
            byte[] bytePasat;

            using (FileStream fileStream = new FileStream(GLBnam, FileMode.Open))
            {
                fileStream.Seek(l1, SeekOrigin.Begin);
                bytePasat = new byte[l2];
                for (int i = 0; i < l2; i++)
                {
                    bytePasat[i] = (byte) fileStream.ReadByte();
                }
            }
            return bytePasat;
        }

        static void ByteArrayToNewPasat0(byte[] bytes)
        {
            GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
            pasat = (Pasat0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Pasat0));
            handle.Free();
        }

        static Pasat0 ByteArrayToStructure<Pasat0>(byte[] bytes) where Pasat0 : struct
        {
            GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
            Pasat0 pasat = (Pasat0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Pasat0));
            handle.Free();
            return pasat;
        }

        static void Main(string[] args)
        {
            string put = "Z:\\L_TN\\ALM\\";

            acatconfig_read(put);       // считывание файла acat.cnf
            Console.WriteLine(GLBnam);

            file_name(0, 0);
            Console.WriteLine(GLBnam);

            byte[] bytePasat = ica010((long) 0, (long)Marshal.SizeOf(pasat));
            Pasat0 pasatTest = ByteArrayToStructure<Pasat0>(bytePasat);

            Console.WriteLine("babac");
            Console.ReadKey();
        }



Вот так заработала, но одно большое НО:
Работает, когда в struct нет параметра
Код: c#
1.
public char[] shu;

.
Как только его добавляю начинаются ошибки.
Интуитивно понимаю, что скорее всего программа не может определить размер, т. к. задана динамически.
Как его обойти без использования [FieldOffset(18)]?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503811
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не забывай также что разрядность char может быть больше чем byte.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503814
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char в C# это юникод (UTF16), т.е. 2 байта. В С/С++ char 1 байт.
Используй перекодировку в 1251, или возможно в 866 если прога старинная.
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]