powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
47 сообщений из 47, показаны все 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
Переписываю древний код на C#.
    #39503816
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе забывай также что разрядность char может быть больше чем byte.

C++
Макрос getc() возвращает следующий за текущей позицией символ во входном потоке stream и дает приращение указателю положения в файле. Символ считывается как unsigned char, преобра­зованный к переменной целого типа.

При достижении конца файла getc() возвращает EOF. Однако поскольку EOF имеет значение целого типа, при работе с двоичными файлами для контроля достижения конца файла необхо­димо использовать feof(). Если getc() обнаруживает ошибку, то также возвращается EOF. Следует помнить, что при работе с двоичными файлами для проверки ошибок в файле следует использо­вать ferror().

C#
ReadByte(): считывает один байт и перемещает указатель на один байт

ReadChar(): считывает значение char, то есть один символ, и перемещает указатель на столько байтов, сколько занимает символ в текущей кодировке

Я использую у себя ReadByte(), мне скорее всего нужно использовать ReadChar()?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503824
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokЯ использую у себя ReadByte(), мне скорее всего нужно использовать ReadChar()?
Нет. ReadByte() и перекодировка Encoding из 1251 или 866, смотря какая кодировка в твоем файле используется.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503826
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503831
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДо того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо!
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503840
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok[qwuot mayton]До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо![/quot]
О каком экране ты говоришь?

Мне кажется ты смешал в кучу два понятия. Чтение и разбор файла - это одна логика. Там могут быть свои преференции. Свои кодировки.

Публикация текста в окне cmd/powershell это другая задача никак с первой не связаная
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503857
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvadipok[qwuot mayton]До того как мы кинемся портировать - нам надо ответить на вопрос - нужна ли нам бинарная совместимость со старыми файлами?

Скорее всего да, но пока реализую только чтение файла.
Запись возможно и не пригодиться.
Сейчас там кодировка ANSI стоит.
Как его корректно отображать на экране?
Пока я вижу, что значения с тестовой С++ программой пока не совпадают.

И все таки не ответили на вопрос как быть с public char[] shu;
Делать как тут написано?

Спасибо!
О каком экране ты говоришь?

Мне кажется ты смешал в кучу два понятия. Чтение и разбор файла - это одна логика. Там могут быть свои преференции. Свои кодировки.

Публикация текста в окне cmd/powershell это другая задача никак с первой не связаная[/quot]

C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
            byte[] bytePasat = ica010((long) 0, (long)Marshal.SizeOf(pasat));
            Pasat0 pasatTest = ByteArrayToStructure<Pasat0>(bytePasat);
            ByteArrayToNewPasat0(bytePasat);
            Console.WriteLine(pasat.kcp);
            Console.WriteLine(pasat.plp);
            Console.WriteLine(pasatTest.kcp);
            Console.WriteLine(pasatTest.plp);



C++
Код: plaintext
1.
2.
3.
4.
	if (ica010(0, (char *)&stp, 'r', 0l, (long)sizeof(stp)) == 0) { return; }

	ic = stp.kcp;  // кол. сква.
	ip = stp.plp;  // кол. пласт.



Отличаются результаты.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503868
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokОтличаются результаты.
Ожидаемо. Это 20715355 прочитал?

У тебя код написан исходя из бинарной совместимости структуры в С и C#, но они разные.
Чтобы были одинаковы надо использовать типы одинакового размера, т.е. char заменить на byte. А потом уже конвертировать в char при выводе.

Хотя и это возможно не поможет, т.к. массивы в C# это ссылочный тип, т.е. внутри структуры может оказаться только ссылка на содержимое массива. Это мое предположение, не разбирался в этих деталях.

ИМХО лучше эту тему в форуме по C# поднять.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503879
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503887
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglvadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?

Добавил, он был в С++ программе в struct.
struct очень длинный, поэтому только частично его привел в первом сообщении.
Посмотрите, там есть похожие объявления.
Переписал на C# и начались ошибки, попробовал закоментарить именно до этого объявления и заработала.
Таким образом локализовал ошибку.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503893
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokSiemarglvadipok> И все таки не ответили на вопрос как быть с public char[] shu;

Телепатов нет. Откуда ты его взял ?

Добавил, он был в С++ программе в struct.
struct очень длинный, поэтому только частично его привел в первом сообщении.
Посмотрите, там есть похожие объявления.
Переписал на C# и начались ошибки, попробовал закоментарить именно до этого объявления и заработала.
Таким образом локализовал ошибку.
Ты вообще структурировано думать в состоянии??? Ну чтобы хотя бы вопрос смочь задать.

На тебе бубен, сам и пляши.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39503917
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokон был в С++ программе в struct.

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504109
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovvadipokон был в С++ программе в struct.

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.

+1
Проще всего читать файл в массивы byte[] и поэлементно конвертировать в нужную структуру
для числовых типов BitConverter для char[] - Encoding.GetString()

Правда букав много будет, если элементов много.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504171
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TDimitry Sibiryakovпропущено...

Забудь об этой С++ программе, пиши с нуля программу, которая читает файлы определённой
структуры. Она не должна (и не может) быть похожа на ту, которая их записывает.

+1
Проще всего читать файл в массивы byte[] и поэлементно конвертировать в нужную структуру
для числовых типов BitConverter для char[] - Encoding.GetString()

Правда букав много будет, если элементов много.

Сегодня шеф объяснил как все работает на С++.
В файле данные хранятся в виде байтов.
Он просто в выделенную память их считывает и получает корректные данные.

Но ведь BitConverter берет массив байтов, а у меня только одна переменная байт.
Как это будет работать?
Код: c#
1.
2.
3.
4.
5.
                fileStream.Seek(66, SeekOrigin.Begin);
                bytePasat[0] = (byte)fileStream.ReadByte();

                uint kol_pl = BitConverter.ToUInt32(bytePasat, 0);
                int kol_pl2 = bytePasat[0];


Вот так оба переменных имеют одинаковые значения 66.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504178
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokСегодня шеф объяснил как все работает на С++.
В файле данные хранятся в виде байтов.
Он просто в выделенную память их считывает и получает корректные данные.
Если б ты еще это понял, то вопроса ниже не было бы.
vadipokНо ведь BitConverter берет массив байтов, а у меня только одна переменная байт.
Как это будет работать?
Код: c#
1.
2.
3.
4.
5.
                fileStream.Seek(66, SeekOrigin.Begin);
                bytePasat[0] = (byte)fileStream.ReadByte();

                uint kol_pl = BitConverter.ToUInt32(bytePasat, 0);
                int kol_pl2 = bytePasat[0];


Вот так оба переменных имеют одинаковые значения 66.
для одного байта не надо ничего конвертировать
Код: c#
1.
2.
                fileStream.Seek(66, SeekOrigin.Begin);
                uint kol_pl = fileStream.ReadByte();



Конвертировать надо когда несколько байт представляют одно значение, например int это 4 байта.

PS fileStream может сразу массив прочитать, а дальше выколупывай из массива, т.е. примерно так
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(bytePasat, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504182
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например это
Код: plaintext
1.
2.
3.
4.
long  j,lf,li,lx;
char  *nam,*cl,c;
cl=(char *) &lf;
	for (j = 0; j<4; j++)	*(cl + j) = getc(VECTOR);


не что иное как прочитать 4 байта и сохранить в переменную lf
В С/С++ можно в int побайтно читать с помощью трюка с приведением к указателю char *

в C# это будет так выглядеть
Код: c#
1.
2.
3.
var data = new byte[4];
fileStream.Read(data, 0, 4);
uint lf = BitConverter.ToUInt32(data);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504184
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);



Сейчас в документации нашел, что количество которое я пытаюсь вытащить, это:
1.0.21 Количество short 66-67
Находиться на 66-й позиции при чтении с помощью команды getc.
Но там перед ним еще куча переменных и float, long.
Мне получается нужно со читать количество байтов для каждой переменной а потом это все сложить, и эта цифра будет искомой цифрой, которая стоит 66-й при чтении с помощью команды getc?
Ну я попал!!!
В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504194
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokDima TНе дописал малость
Код: c#
1.
2.
3.
var data = new byte[fileStream.Lenght];
fileStream.Read(data, 0, data.Lenght);
uint kol_pl = BitConverter.ToUInt32(data, 66);



Сейчас в документации нашел, что количество которое я пытаюсь вытащить, это:
1.0.21 Количество short 66-67
Находиться на 66-й позиции при чтении с помощью команды getc.
Но там перед ним еще куча переменных и float, long.
Мне получается нужно со читать количество байтов для каждой переменной а потом это все сложить, и эта цифра будет искомой цифрой, которая стоит 66-й при чтении с помощью команды getc?
Ну я попал!!!
В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
А зачем тебе считать если в документации уже написано short 66-67 ? Документацию перепроверять собрался?

Ты на мои 3 строчки кода глянь, которые процитировал. Там цифра 66 даже есть. Если там тип short, т.е. 2 байта, то
Код: plaintext
1.
short kol_pl = BitConverter.ToUInt16(data, 66);
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504283
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok, рано ты взялся за эту задачу.

Тебе нужна сноровка. И понимание того как можно работать с байтами и символами
и целыми числами и стоками в файлах.

Похоже сейчас у тебя такого понимания нет. Задачу ты хотя и сделаешь - то не поймешь.
Или даже не поймешь и не сделаешь. И вобщем-то я-бы тебе предложил ее на месяцок
отставить. И возьми и поразбирайся с файловыми операциями и типами данных
в отдельных топиках. Что такое byte, char, short, int, long, WORD, DWORD, QWORD,
signed/unsigned, кодировки, big-last endian,
что такое struct/union/bitfields в С++. Какие разрядности бывают. Как работают
fopen,fseek,fread,fwrite,fclose и такое же зеркальное семейство функций в C#.
Как работают битовые операции <<, >>, |, &, (xor), как выделить в целом числе
бит как установить как сбросить как влияет знаковый бит, что такое float/double/extended,
и BCD арифметика.

Создавай отдельный топик и погнали. А мы по мере возможности будем каментить и помогать.

Вобщем как-то так.

Что скажете, коллеги?
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504287
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто скажете, коллеги?
Пусть делает сейчас. ИМХО за месяц бездействия умнее не станет, а если сделает с подсказками то может через месяц/год поймет как и почему сделал.

PS Чистую теорию далеко не каждый осилит, через практику пройти гораздо легче, а итого примерно одинаково.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504293
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok....В начале говорили, что там все просто, ты быстро все сделаешь. )))))))))))))))))))))))
я говорил, что там работы на 10-15 минут.

ошибся кстати, на полчаса.

Просто нужна квалификация.
...
Рейтинг: 0 / 0
Переписываю древний код на C#.
    #39504352
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvadipok, рано ты взялся за эту задачу.

Тебе нужна сноровка. И понимание того как можно работать с байтами и символами
и целыми числами и стоками в файлах.

Похоже сейчас у тебя такого понимания нет. Задачу ты хотя и сделаешь - то не поймешь.
Или даже не поймешь и не сделаешь. И вобщем-то я-бы тебе предложил ее на месяцок
отставить. И возьми и поразбирайся с файловыми операциями и типами данных
в отдельных топиках. Что такое byte, char, short, int, long, WORD, DWORD, QWORD,
signed/unsigned, кодировки, big-last endian,
что такое struct/union/bitfields в С++. Какие разрядности бывают. Как работают
fopen,fseek,fread,fwrite,fclose и такое же зеркальное семейство функций в C#.
Как работают битовые операции <<, >>, |, &, (xor), как выделить в целом числе
бит как установить как сбросить как влияет знаковый бит, что такое float/double/extended,
и BCD арифметика.

Создавай отдельный топик и погнали. А мы по мере возможности будем каментить и помогать.

Вобщем как-то так.


Что скажете, коллеги?


Понял, спасибо большое.
Если будут вопросы, то буду спрашивать. А куда я еще пойду.
...
Рейтинг: 0 / 0
47 сообщений из 47, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Переписываю древний код на C#.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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