Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Мне нужно отладить некоторые довольно сложные алгоритмы которые бегут в эмбедед системе. На таргете это делать неудобно и муторно а в шарпе GUI и все дела.

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

получаю значение по указателю
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;
}

и записываю значению по указателю
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; 
    }
}


Как мне сэмулировать это на С-шарп?
21 май 19, 14:25    [21889765]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
hVostt
Member

Откуда:
Сообщений: 15852
jenya7,

https://habr.com/ru/post/84076/
21 май 19, 14:30    [21889768]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
hVostt
jenya7,

https://habr.com/ru/post/84076/

фига се! я хотел упростить жизнь а не сойти с ума :)
21 май 19, 14:39    [21889783]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
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
что ему не нравиться?
21 май 19, 15:00    [21889795]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13936
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

ИМХО проще всего забыть про указатели и сделать с помощью BitConverter.
21 май 19, 15:05    [21889799]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13936
jenya7
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 на С и вызывать её.
21 май 19, 15:13    [21889803]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
Dima T
string в C# только для чтения, нельзя там буквы менять. Используй массивы.


string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }
21 май 19, 15:27    [21889820]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
Dima T
jenya7
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 на С и вызывать её.

спасибо. попробую.
21 май 19, 15:27    [21889821]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4794
Dima T
Если это продолжение этой темы , то ты еще забыл упомянуть про union, которому в C# нет аналогов.

Есть десантные войска и нет задач не выполнимых.
    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);
21 май 19, 15:49    [21889839]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1164
Зачем эмулировать, если есть просто unsafe код с указателями.
21 май 19, 15:56    [21889854]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

о! то что доктор прописал! :)
21 май 19, 16:32    [21889886]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

Error CS0227 Unsafe code may only appear if compiling with /unsafe
21 май 19, 16:39    [21889891]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13936
jenya7
fkthat
Зачем эмулировать, если есть просто unsafe код с указателями.

Error CS0227 Unsafe code may only appear if compiling with /unsafe

В гугле забанили? Error CS0227

В свойствах проекта поставь галку "Разрешить небезопасный код"
21 май 19, 16:45    [21889897]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
так работает - с локальной переменной
public unsafe int* ParseVar(/*string var, ref byte var_type, ref byte data_type*/)
{
       int* ptr;
       int test;

       ptr = &test; 
          
       return ptr;
}

но если я подставляю глобальную переменную
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
21 май 19, 18:05    [21889979]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1164
jenya7,

Да, указатели можно использовать только внутри конструкции fixed. Потому что может в любой момент сработать мусорщик, переместить указуемый объект в другое место и указатель станет неправильным. Fixed на время запрещает мусорщику перемещать объект на который указывает указатель.
21 май 19, 18:18    [21889987]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
fkthat
jenya7,

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


так работает
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;
     }

}
21 май 19, 18:22    [21889991]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1164
ЕвгенийВ
string Коля = "Коля";
                fixed(char* str = Коля)
                {
                    str[0] = 'Т';
                }


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

var s1 = "Foo";
var s2 = "Foo";

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

Console.WriteLine(s2);
21 май 19, 18:25    [21889995]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1164
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"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).
21 май 19, 18:43    [21890004]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
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"), но он этого не умеет (хотя, вполне возможно, что какой-нибудь решарпер такое даже делает, но не пользуюсь, поэтому точно не знаю).

но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.
21 май 19, 18:52    [21890012]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
fkthat
Member

Откуда:
Сообщений: 1164
jenya7
но после *ptr = 5; я вижу в Params.motor_rt_params[0].position - 5.

А в другой раз можешь увидеть вообще непонятно что, если мусорщик кучу уплотнит.
21 май 19, 19:42    [21890033]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Dima T
Member

Откуда:
Сообщений: 13936
jenya7
но после *ptr = 5; ...

Это можно написать в С/С++, хотя лучше union как я уже советовал, но не делай такого в C#. Это даже для С нездорово, но С это правильно поймет, а C# это совсем другой язык, тут так нельзя. Если можешь сделать DLL, то лучше сделай.
21 май 19, 20:00    [21890040]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3445
кстати, для справки :)
если открыть окно Memory 1 или 2,3,4 в строке адреса можно вводить адрес памяти в hex, можно вводить и имена переменных, методов и т.д. Всё это поддерживается и в QuickWatch и скорее всего в прочих окнах отладчика, с unsafe операторами
для локальных переменных знач. типа (в стеке) &varName
для переменной ссылочного типа на объект просто имя переменной varName.
первые x байт в открывшейся области памяти, это TypeHandler, дальше кишки объекта в куче,
не забываем, что если получить адрес переменной через &varName, это будет стек и смотреть надо наверх, а не вниз
бывает полезно, но не особо, чтоб уж так :)
21 май 19, 20:30    [21890056]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5108
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд
21 май 19, 22:45    [21890101]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
jenya7
Member

Откуда:
Сообщений: 1159
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
22 май 19, 08:18    [21890229]     Ответить | Цитировать Сообщить модератору
 Re: Эмуляция указателей в С-шарп  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
jenya7
kealon(Ruslan)
jenya7,

а что просто на плюсах проект не завести? и хоть заотлаживайся, вывод в консоль и вперёд

в плюсах нет оконных приложений. не понятно как визуальные компоненты добавлять.
тогда дельфи)))
Как ты совмещаешь несовместимое? ГУИ и низкоуровневое?
Так не бывает.
22 май 19, 08:32    [21890244]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить