Как "работать" с безразмерным массивом в структуре?
вот у меня пример и я совершенно не могу принципов работы с безразмерными массивами. Как в структуре "работать" с массивом в СИ-шарп ??
Вот пример :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// структура
struct Message
{
byte[] setMessage = new byte[]; // вот тут ошибка !!!!
public string name_can; // первый либо второй кан
public int speed_can; //скорость кан соединения
public System.UInt32 id; /* идентификатор кадра */
public System.Byte data[8]; /* данные */
public System.Byte len; /* фактическая длина поля данных, от 0 до 8 байт */
public System.UInt16 flags; /* bit 0 - RTR, bit 2 – EFF */
public System.UInt32 ts; /* отметка времени получения (timestamp) в микросекундах */
//public int size_can_mes; // размер принятого сообщения от 0 до 8
// public char mes_can[8]; // кан сообщение
public void InitializationInfo()
{
Console.WriteLine($"name_can: {name_can} speed_can: {speed_can}");
}
}
class TrimTram1
{
static bool Issued_mess(byte[] IssuedMess)
{
Message message = new Message();
int size_mess = message.setMessage.Lean;
byte Nastr = 0xA1; // Маркер о настройке устройства
string can_t = null;
int speed_t = null;
if (message.setMessage[0] == 0xA1)
{
Console.WriteLine("Инициализация прошла успешно, ");
if(message.setMessage[1] == 0x00)
can_t = "can0";
if (message.setMessage[1] == 0x01)
can_t = "can1";
Console.WriteLine("Имя машины : {0}", can_t);
// тут превращаем байт в в число десятиричное
byte tex_t = message.setMessage[2];
int speed_t = Convert.ToInt32(tex_t);
Console.WriteLine("Скорость машины: {0}", speed_t);
}
return true;
}
static void Main(byte[] args)
{
Console.WriteLine("Тестовая прога.");
// передача данных в структуру
Message message = new Message();
message.setMessage = args;
// вызов функции запуска
bool a = Issued_mess(args);
if (a)
Console.WriteLine("Инициализация прошла успешно");
else
Console.WriteLine("Инициализация прошла отрицательно");
}
}
авто какие он мне ошибки выдаёт :
comp@comp0:~/Qt_project/TCP_IP$ mcs tehn.cs
tehn.cs(11,29): error CS1586: Array creation must have array size or array initializer
tehn.cs(16,32): error CS1519: Unexpected symbol `[' in class, struct, or interface member declaration
tehn.cs(16,33): warning CS0658: `value' is invalid attribute target. All attributes in this attribute section will be ignored
tehn.cs(94,17): error CS0136: A local variable named `speed_t' cannot be declared in this scope because it would give a different meaning to `speed_t', which is already used in a `parent or current' scope to denote something else
Compilation failed: 3 error(s), 1 warnings
с ошибкой error CS1586 вообще не знаю как справиться :-(
Ответы (2 шт):
Автор решения: OXYGEN
→ Ссылка
вот Решение
Структура
data[8] = data
byte[] setMessage = new byte[] setMessage[] = public byte[] setMessage;
struct Message { public byte[] setMessage; // вот тут ошибка !!!! public string name_can; // первый либо второй кан public int speed_can; //скорость кан соединения public System.UInt32 id; /* идентификатор кадра */ public System.Byte data; /* данные */ public System.Byte len; /* фактическая длина поля данных, от 0 до 8 байт */ public System.UInt16 flags; /* bit 0 - RTR, bit 2 – EFF */ public System.UInt32 ts; /* отметка времени получения (timestamp) в микросекундах */ //public int size_can_mes; // размер принятого сообщения от 0 до 8 // public char mes_can[8]; // кан сообщение public void InitializationInfo() { Console.WriteLine($"name_can: {name_can} speed_can: {speed_can}"); } }Класс
message.setMessage.Lean = message.setMessage.Length;
int speed_t = null; = int speed_t = 0;
class TrimTram1
{
static bool Issued_mess(byte[] IssuedMess)
{
Message message = new Message();
int size_mess = message.setMessage.Length;
byte Nastr = 0xA1; // Маркер о настройке устройства
string can_t = null;
int speed_t = 0;
if (message.setMessage[0] == 0xA1)
{
Console.WriteLine("Инициализация прошла успешно, ");
if(message.setMessage[1] == 0x00)
can_t = "can0";
if (message.setMessage[1] == 0x01)
can_t = "can1";
Console.WriteLine("Имя машины : {0}", can_t);
// тут превращаем байт в в число десятиричное
byte tex_t = message.setMessage[2];
speed_t = Convert.ToInt32(tex_t);
Console.WriteLine("Скорость машины: {0}", speed_t);
}
return true;
}
Маин
static void Main(byte[] args)
{
Console.WriteLine("Тестовая прога.");
// передача данных в структуру
Message message = new Message();
message.setMessage = args;
// вызов функции запуска
bool a = Issued_mess(args);
if (a)
Console.WriteLine("Инициализация прошла успешно");
else
Console.WriteLine("Инициализация прошла отрицательно");
}
Автор решения: timob256
→ Ссылка
Правда тут ошибка почему то в функцию Issued_mess не заходит
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
struct Message
{
public byte[] setMessage; // вот тут ошибка !!!!
//public byte[] setMessage = new byte[256];
public string name_can; // первый либо второй кан
public int speed_can; //скорость кан соединения
public System.UInt32 id; /* идентификатор кадра */
public System.Byte data; /* данные */
public System.Byte len; /* фактическая длина поля данных, от 0 до 8 байт */
public System.UInt16 flags; /* bit 0 - RTR, bit 2 – EFF */
public System.UInt32 ts; /* отметка времени получения (timestamp) в микросекундах */
//public int size_can_mes; // размер принятого сообщения от 0 до 8
// public char mes_can[8]; // кан сообщение
public void InitializationInfo()
{
Console.WriteLine($"name_can: {name_can} speed_can: {speed_can}");
}
}
class TrimTram1
{
static bool Issued_mess(byte[] IssuedMess)
{
Message message = new Message();
message.setMessage = new byte[256];
// public byte[] setMessage = new byte[256];
int size_mess = message.setMessage.Length;
byte Nastr = 0xA1; // Маркер о настройке устройства
string can_t = null;
int speed_t = 0;
if (message.setMessage[0] == 0xA1)
{
Console.WriteLine("Инициализация прошла успешно, ");
if(message.setMessage[1] == 0x00)
can_t = "can0";
if (message.setMessage[1] == 0x01)
can_t = "can1";
Console.WriteLine("Имя машины : {0}", can_t);
// тут превращаем байт в в число десятиричное
byte tex_t = message.setMessage[2];
speed_t = Convert.ToInt32(tex_t);
Console.WriteLine("Скорость машины: {0}", speed_t);
}
return true;
}
public static void Main()
{
Console.WriteLine("Тестовая прога.");
// передача данных в структуру
Message message = new Message();
message.setMessage = System.Text.Encoding.UTF8.GetBytes(Console.ReadLine());
// вызов функции запуска
bool a = Issued_mess(message.setMessage); // Тут ошибка , почему то в Issued_mess он не заходит
if (a == true)
Console.WriteLine("Инициализация прошла успешно");
else
Console.WriteLine("Инициализация прошла отрицательно");
}
}
Вот вывод:
comp@comp0:~/Qt_project/TCP_IP$ mono tehn1_old.exe
Тестовая прога.
0xA10x000xff
Инициализация прошла успешно