powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Эмуляция указателей в С-шарп
25 сообщений из 42, страница 1 из 2
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39815831
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815840
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttjenya7,

https://habr.com/ru/post/84076/
фига се! я хотел упростить жизнь а не сойти с ума :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39815853
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

ИМХО проще всего забыть про указатели и сделать с помощью BitConverter .
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39815868
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tstring в C# только для чтения, нельзя там буквы менять. Используй массивы.


Код: c#
1.
2.
3.
4.
5.
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39815888
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем эмулировать, если есть просто unsafe код с указателями.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815911
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
о! то что доктор прописал! :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815915
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39815919
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7fkthatЗачем эмулировать, если есть просто unsafe код с указателями.
Error CS0227 Unsafe code may only appear if compiling with /unsafe
В гугле забанили? Error CS0227

В свойствах проекта поставь галку "Разрешить небезопасный код"
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39815979
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

Да, указатели можно использовать только внутри конструкции fixed . Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #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
Эмуляция указателей в С-шарп
    #39816016
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
А в другой раз можешь увидеть вообще непонятно что, если мусорщик кучу уплотнит.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816019
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но после *ptr = 5; ...
Это можно написать в С/С++, хотя лучше union как я уже советовал, но не делай такого в C#. Это даже для С нездорово, но С это правильно поймет, а C# это совсем другой язык, тут так нельзя. Если можешь сделать DLL, то лучше сделай.
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816027
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, для справки :)
если открыть окно Memory 1 или 2,3,4 в строке адреса можно вводить адрес памяти в hex, можно вводить и имена переменных, методов и т.д. Всё это поддерживается и в QuickWatch и скорее всего в прочих окнах отладчика, с unsafe операторами
для локальных переменных знач. типа (в стеке) &varName
для переменной ссылочного типа на объект просто имя переменной varName.
первые x байт в открывшейся области памяти, это TypeHandler, дальше кишки объекта в куче,
не забываем, что если получить адрес переменной через &varName, это будет стек и смотреть надо наверх, а не вниз
бывает полезно, но не особо, чтоб уж так :)
...
Рейтинг: 0 / 0
Эмуляция указателей в С-шарп
    #39816057
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

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

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

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


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