Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Эмуляция указателей в С-шарп / 25 сообщений из 42, страница 1 из 2
21.05.2019, 14:25
    #39815829
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Мне нужно отладить некоторые довольно сложные алгоритмы которые бегут в эмбедед системе. На таргете это делать неудобно и муторно а в шарпе GUI и все дела.

В оригинальном коде я беру указатель переменной
Код: c#
1.
2.
case VAR_TYPE_FLSW: return &motor_rt_params[num].flimsw_state; break;
case VAR_TYPE_RLSW: return &motor_rt_params[num].rlimsw_state; break;


получаю значение по указателю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
int32_t SCRIPT_GetVar(data_type_t *obj, uint8_t data_type)
{
    switch (data_type)
    {
        case DATA_TYPE_U8:  return obj->u8;  break;
        case DATA_TYPE_S16: return obj->i16; break;
        case DATA_TYPE_U16: return obj->u16; break; 
        case DATA_TYPE_S32: return obj->i32; break;
        case DATA_TYPE_U32: return obj->u32; break; 
    }
    
    return 0;
}


и записываю значению по указателю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void SCRIPT_SetVar(void *var, int32_t val, uint8_t data_type)
{
    switch (data_type)
    {
        case DATA_TYPE_U8:  *((uint8_t *)var)  = val; break;
        case DATA_TYPE_S16: *((int16_t *)var)  = val; break;
        case DATA_TYPE_U16: *((uint16_t *)var) = val; break; 
        case DATA_TYPE_S32: *((int32_t *)var)  = val; break; 
        case DATA_TYPE_U32: *((uint32_t *)var) = val; break; 
    }
}



Как мне сэмулировать это на С-шарп?
...
Рейтинг: 0 / 0
21.05.2019, 14:30
    #39815831
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
...
Рейтинг: 0 / 0
21.05.2019, 14:39
    #39815840
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
hVosttjenya7,

https://habr.com/ru/post/84076/
фига се! я хотел упростить жизнь а не сойти с ума :)
...
Рейтинг: 0 / 0
21.05.2019, 15:00
    #39815851
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}



на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?
...
Рейтинг: 0 / 0
21.05.2019, 15:05
    #39815853
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

ИМХО проще всего забыть про указатели и сделать с помощью BitConverter .
...
Рейтинг: 0 / 0
21.05.2019, 15:13
    #39815856
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}



на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?
string в C# только для чтения, нельзя там буквы менять. Используй массивы.

PS Не самая хорошая идея в C# отлаживать С-ишный код. Как вариант может сделать DLL на С и вызывать её.
...
Рейтинг: 0 / 0
21.05.2019, 15:27
    #39815868
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Dima Tstring в C# только для чтения, нельзя там буквы менять. Используй массивы.


Код: c#
1.
2.
3.
4.
5.
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }
...
Рейтинг: 0 / 0
21.05.2019, 15:27
    #39815869
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Dima Tjenya7
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public struct Token
{
    public string name;
    public TokenType type;
}

 bool LEXER_GetToken(string expr, ref Token token, ref int exp_idx)
{
    int i = 0;
    token.name[i++] = expr[exp_idx++];
}



на строчке token.name[i++] = expr[exp_idx++]; ругается
Error CS0200 Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
что ему не нравиться?
string в C# только для чтения, нельзя там буквы менять. Используй массивы.

PS Не самая хорошая идея в C# отлаживать С-ишный код. Как вариант может сделать DLL на С и вызывать её.
спасибо. попробую.
...
Рейтинг: 0 / 0
21.05.2019, 15:49
    #39815879
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Dima TЕсли это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

Есть десантные войска и нет задач не выполнимых.
Код: 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.
    public enum uint8_t
    {
       DATA_TYPE_U8,
       DATA_TYPE_S16,
       DATA_TYPE_U16,
       DATA_TYPE_S32,
       DATA_TYPE_U32,
    }
    [StructLayout(LayoutKind.Sequential, Size = 8)]
    public unsafe struct data_type_t
    {
        public uint8_t vt;
        public unsafe sbyte u8
        {
            get
            {
                fixed( data_type_t* tmp = &this)
                {
                    return *((sbyte*)((void*)tmp)+4);
                }
            }
            set
            {
                fixed (data_type_t* tmp = &this)
                {
                    *((sbyte*)((void*)tmp)+4) = value;
                    vt = uint8_t.DATA_TYPE_U8;
                }
            }
        }

    }
data_type_t dat = default(data_type_t);

                dat.u8 = 111;
                Console.WriteLine(dat.u8);
...
Рейтинг: 0 / 0
21.05.2019, 15:56
    #39815888
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
Зачем эмулировать, если есть просто unsafe код с указателями.
...
Рейтинг: 0 / 0
21.05.2019, 16:32
    #39815911
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
о! то что доктор прописал! :)
...
Рейтинг: 0 / 0
21.05.2019, 16:39
    #39815915
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
...
Рейтинг: 0 / 0
21.05.2019, 16:45
    #39815919
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
В гугле забанили? Error CS0227

В свойствах проекта поставь галку "Разрешить небезопасный код"
...
Рейтинг: 0 / 0
21.05.2019, 18:05
    #39815972
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
так работает - с локальной переменной
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;
       int test;

       ptr = &test; 
          
       return ptr;
}


но если я подставляю глобальную переменную
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;

       ptr = &glob_var;
          
       return ptr;
}


получаю
Error CS0212 You can only take the address of an unfixed expression inside of a fixed statement initializer
...
Рейтинг: 0 / 0
21.05.2019, 18:18
    #39815979
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7,

Да, указатели можно использовать только внутри конструкции fixed . Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.
...
Рейтинг: 0 / 0
21.05.2019, 18:22
    #39815983
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
fkthatjenya7,

Да, указатели можно использовать только внутри конструкции fixed . Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.

так работает
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public unsafe int* ParseVar()
{ 

     fixed (int* ptr= &Params.motor_rt_params[0].position) { return ptr; }
          
 }

private void buttonRun_Click(object sender, EventArgs e)
{     
     unsafe
      {
                int *ptr = parser.ParseVar();
                *ptr = 5;
     }

}
...
Рейтинг: 0 / 0
21.05.2019, 18:25
    #39815987
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
ЕвгенийВ
Код: c#
1.
2.
3.
4.
5.
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }



Так можно отстрелить себе ногу из-за "интернирования" строк.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var s1 = "Foo";
var s2 = "Foo";

fixed (char* p = s1)
{
    *p = 'B';
}

Console.WriteLine(s2);
...
Рейтинг: 0 / 0
21.05.2019, 18:43
    #39815995
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7так работает
Нет. Потому что "After the code in the statement is executed, any pinned variables are unpinned and subject to garbage collection. Therefore, do not point to those variables outside the fixed statement." Неплохо бы было, если бы компилятор отлавливал подобные ляпы (еще такой же типичный ляп - это вернуть из метода переменную объявленную в "using"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).
...
Рейтинг: 0 / 0
21.05.2019, 18:52
    #39816001
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
fkthatjenya7так работает
Нет. Потому что "After the code in the statement is executed, any pinned variables are unpinned and subject to garbage collection. Therefore, do not point to those variables outside the fixed statement." Неплохо бы было, если бы компилятор отлавливал подобные ляпы (еще такой же типичный ляп - это вернуть из метода переменную объявленную в "using"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).
но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
...
Рейтинг: 0 / 0
21.05.2019, 19:42
    #39816016
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
А в другой раз можешь увидеть вообще непонятно что, если мусорщик кучу уплотнит.
...
Рейтинг: 0 / 0
21.05.2019, 20:00
    #39816019
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7но после *ptr = 5; ...
Это можно написать в С/С++, хотя лучше union как я уже советовал, но не делай такого в C#. Это даже для С нездорово, но С это правильно поймет, а C# это совсем другой язык, тут так нельзя. Если можешь сделать DLL, то лучше сделай.
...
Рейтинг: 0 / 0
21.05.2019, 20:30
    #39816027
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
кстати, для справки :)
если открыть окно Memory 1 или 2,3,4 в строке адреса можно вводить адрес памяти в hex, можно вводить и имена переменных, методов и т.д. Всё это поддерживается и в QuickWatch и скорее всего в прочих окнах отладчика, с unsafe операторами
для локальных переменных знач. типа (в стеке) &varName
для переменной ссылочного типа на объект просто имя переменной varName.
первые x байт в открывшейся области памяти, это TypeHandler, дальше кишки объекта в куче,
не забываем, что если получить адрес переменной через &varName, это будет стек и смотреть надо наверх, а не вниз
бывает полезно, но не особо, чтоб уж так :)
...
Рейтинг: 0 / 0
21.05.2019, 22:45
    #39816057
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
...
Рейтинг: 0 / 0
22.05.2019, 08:18
    #39816150
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
kealon(Ruslan)jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
...
Рейтинг: 0 / 0
22.05.2019, 08:32
    #39816158
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эмуляция указателей в С-шарп
jenya7kealon(Ruslan)jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.тогда дельфи)))
Как ты совмещаешь несовместимое? ГУИ и низкоуровневое?
Так не бывает.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Эмуляция указателей в С-шарп / 25 сообщений из 42, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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