看这里,char* gg[] = {"John", "Maria"};
我想明白,如果这是一个指向字符串的指针数组,那么什么指向John?也许John指向其第一个字符(即 J)的地址,并存储指向该行的gg[i]
字符的地址?J
John
AslanPAPA's questions
现在,如果我有一个电报机器人,我如何将其上传到托管?我以后可以编辑机器人代码吗?
我想提前说一下,我的问题有点奇怪,但我目前正在学习 C#,学习它的目标之一是编写电报机器人。我需要学习什么才能正确编写 tg 机器人?我知道的一件事是有一个库Telegram.Bot
并且它使用异步。总的来说,他们无法给出任何明确的计划。
我想写一个控制台海战,现在我只显示玩家字段。
using System;
class Program
{
static int fieldSize = 10;
static char[,] PlayerField = new char[fieldSize, fieldSize];
static char[,] OpponentField = new char[fieldSize, fieldSize];
static Random rnd = new Random();
static void Main(string[] args)
{
InitializateField(PlayerField);
InitializateField(OpponentField);
PrintField(PlayerField, "Поле игрока:");
}
static void InitializateField(char [,] field)
{
for (int i = 0; i < fieldSize; ++i)
{
for (int j = 0; j < fieldSize; ++j)
{
field[i,j] = '~';
}
}
}
static void PrintField(char[,] field, string nameOfField)
{
Console.WriteLine(nameOfField);
Console.Write(" ");
for (int i = 0; i < fieldSize; ++i)
Console.Write($"{i + 1} ");
Console.WriteLine();
for (int i = 0; i < fieldSize; ++i)
{
Console.Write($"{(char)('A' + i)} ");
for (int j = 0; j < fieldSize; ++j)
{
Console.Write($"{field[i,j]} ");
}
Console.WriteLine();
}
}
}
我真的不明白如何在场上安排船只,我所能做的就是自己随机安排船只 10 次,然后在 (0, 9) 范围内调用随机,对于每个值都会有case
它的值自己手动放置。那么如何理解在战场上放置船只的算法呢?
以下是放置船只的方法:
static void PlaceShips(char[,] field)
{
PlaceShip(field, 4);
for (int i = 0; i < 2; i++) PlaceShip(field, 3);
for (int i = 0; i < 3; i++) PlaceShip(field, 2);
for (int i = 0; i < 4; i++) PlaceShip(field, 1);
}
static void PlaceShip(char[,] field, int size)
{
bool placed = false;
while (!placed)
{
// Выбираем случайное направление: 0 - горизонтально, 1 - вертикально
int direction = rnd.Next(2);
// Случайные координаты для начальной точки корабля
int row = rnd.Next(fieldSize);
int col = rnd.Next(fieldSize);
if (CanPlaceShip(field, row, col, size, direction))
{
// Размещаем корабль
for (int i = 0; i < size; i++)
{
if (direction == 0)
field[row, col + i] = 'S'; // горизонтально
else
field[row + i, col] = 'S'; // вертикально
}
placed = true;
}
}
}
// Проверка, можно ли разместить корабль
static bool CanPlaceShip(char[,] field, int row, int col, int size, int direction)
{
// Проверяем, не выходит ли корабль за границы
if (direction == 0 && col + size > fieldSize) return false; // горизонтально
if (direction == 1 && row + size > fieldSize) return false; // вертикально
// Проверяем, что на пути корабля нет других кораблей
for (int i = 0; i < size; i++)
{
int r = row + (direction == 1 ? i : 0);
int c = col + (direction == 0 ? i : 0);
if (field[r, c] == 'S' || !IsSurroundingAreaClear(field, r, c))
{
return false; // Есть пересечения
}
}
return true;
}
// Проверка, что вокруг клетки корабля нет других кораблей
static bool IsSurroundingAreaClear(char[,] field, int row, int col)
{
for (int i = row - 1; i <= row + 1; i++)
{
for (int j = col - 1; j <= col + 1; j++)
{
if (i >= 0 && i < fieldSize && j >= 0 && j < fieldSize)
{
if (field[i, j] == 'S')
return false;
}
}
}
return true;
}
但我认为解析起来会非常困难,我该如何解析这些方法以便了解它是如何生成船舶的?
我从JetBrains下载了字体,并将它们放在VSCode 中字体编辑器~/.fonts
设置中的 Next中。但重新启动后对我来说没有任何作用 'JetBrains Mono'
您可以使用这些示例来解释:
#include <stdio.h>
int main(void)
{
int g = 476789;
char *ptr = (char *)&g;
int r = (*ptr)++;
printf("%d\n", r);
return 0;
}
#include <stdio.h>
int main(void)
{
int g = 476789;
char *ptr = (char *)&g;
int r = *ptr + 1;
printf("%d\n", r);
return 0;
}
为什么变量的值在第一种情况下改变g
,而在第二种情况下不变?
令存储变量的单元格中的低字节g
为 = 107。另外,在例子中,首先解引用ptr
,即得到值 107 并加 +1,结果变量r
等于 = 108,结果是变量的值g
没有改变,因为低字节没有改变。但在第一种情况下,我有点困惑,也就是说,首先指针被取消引用,ptr
即107,然后这个值被分配给一个变量r
,然后指针本身的值,即地址增加 1一切都对还是有问题?
有一个功能
private void checkAndLoad()
{
string GenerateOrderNumber()
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
return new string(Enumerable.Repeat(chars, 8)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
string orderNumber = GenerateOrderNumber();
if (!string.IsNullOrEmpty(orderNumber))
{
string QueryGetItogPrice1 = $"select ({Numeric.Value} * price) as itog_cena from titles where title = '{TitlesList.Text}'";
SqlCommand cmd = new SqlCommand(QueryGetItogPrice1, sqlConn);
string summa = $"{cmd.ExecuteScalar():F2}";
string QueryGetPrice = $"SELECT COALESCE(price, 0) AS ytd_sales FROM titles where title = '{TitlesList.Text}'";
SqlCommand cmd3 = new SqlCommand(QueryGetPrice, sqlConn);
string price = $"{cmd3.ExecuteScalar():F2}";
DataTable table = new DataTable();
table.Columns.Add("№ Заказа", typeof(string));
table.Columns.Add("Магазин", typeof(string));
table.Columns.Add("Издания", typeof(string));
table.Columns.Add("Кол-во", typeof(string));
table.Columns.Add("Услове оплаты", typeof(string));
table.Columns.Add("Цена", typeof(string));
table.Columns.Add("Сумма", typeof(string));
table.Rows.Add($"{orderNumber}", $"{StoresList.Text}", $"{TitlesList.Text}", Numeric.Value, Terms.Text, price, summa);
DataGridView1.DataSource = table;
}
}
要求再次调用该函数时,checkAndLoad()
内部函数不被调用GenerateOrderNumber()
。
我试图使用WPF 库通过 C#从数据库中的Departments表的Departments列中获取数据,并使用这些名称填充 ComboBox,但最终我的 ComboBox 为空:
代码:
private void FillComboBox()
{
try
{
// Запрос для выборки
string sqlCommand = "SELECT названиеОтдела FROM Отделы";
// Создание команды для выполнения запроса
SqlCommand command = new SqlCommand(sqlCommand, sqlCnct);
// Выполнение запроса и получение результата
SqlDataReader reader = command.ExecuteReader();
// Очистка ComboBox перед добавлением новых значений
Deportaments.Items.Clear();
// Добавление значений в ComboBox
while (reader.Read())
{
Deportaments.Items.Add(reader["названиеОтдела"].ToString());
}
// Закрытие ридера
reader.Close();
}
catch (Exception ex)
{
// Обработка исключений, если не удалось выполнить запрос
MessageBox.Show("Ошибка при заполнении ComboBox: " + ex.Message);
}
}
// Вызов FillComboBox() в методе Window_Loaded
private void Window_Loaded(object sender, RoutedEventArgs e)
{
FillComboBox();
}
怎么了 ?
添加:
private void FillComboBox()
{
try
{
// Проверка, что соединение с базой данных открыто
if (sqlCnct.State != ConnectionState.Open)
{
sqlCnct.Open();
}
// Запрос для выборки названий отделов
string sqlCommand = "SELECT названиеОтдела FROM Отделы";
// Создание команды для выполнения запроса
SqlCommand command = new SqlCommand(sqlCommand, sqlCnct);
// Выполнение запроса и получение результата
SqlDataReader reader = command.ExecuteReader();
// Очистка ComboBox перед добавлением новых значений
Deportaments.Items.Clear();
// Добавление значений в ComboBox
/* while (reader.Read())4eeeee
{
Deportaments.Items.Add(reader["названиеОтдела"].ToString());
}*/
Deportaments.Items.Add("Один");
Deportaments.Items.Add("Два");
Deportaments.Items.Add("Три");
// Закрытие ридера
// reader.Close();
}
catch (Exception ex)
{
// Обработка исключений, если не удалось выполнить запрос
MessageBox.Show("Ошибка при заполнении ComboBox: " + ex.Message);
}
finally
{
// Убедимся, что соединение с базой данных закрыто после использования
if (sqlCnct.State == ConnectionState.Open)
{
sqlCnct.Close();
}
}
}
// Вызов FillComboBox() в методе Window_Loaded
private void Window_Loaded(object sender, RoutedEventArgs e)
{
FillComboBox();
}
我有一个处理程序,在其中比较从用户接收到的单词的长度,并将其与用户在InputCountFromUser中输入的数字进行比较,如果它们匹配,我会在OutputWordsFromStr中输入该单词。
但是如何输入一行并将其中的每个单词与InputCountFromUser进行比较,并在OutputWordsFromStr中显示与用户输入的数字匹配的单词,即InputCountFromUser
示例: ``InputStrFromUser:='嗨汤姆!你好吗?' 来自用户的输入计数:= 3;并在 Memo (OutputWordsFromStr) 中显示单词 Tom 和 How。
procedure TForm1.OutputBtnClick(Sender: TObject);
var
InputStr: string;
gg:integer;
begin
InputStr:= InputStrFromUser.Text;
OutputWordsFromStr.Clear;
if ( IntToStr(length(InputStr)) = InputCountFromUser.Text) then
begin
OutputWordsFromStr.Text:= InputStr;
end;
end;
解决方案:
procedure TForm1.OutputBtnClick(Sender: TObject);
var
inputStr: string;
words: TStringList;
i:integer;
begin
inputStr := InputStrFromUser.Text;
OutputWords.Clear;
words:= TStringList.Create;
words.DelimitedText:= inputStr;
ShowMessage(IntToStr(words.Count));
for i := 0 to words.Count - 1 do
begin
if IntToStr(Length(words[i])) = InputCountFromUser.Text then
begin
OutputWords.Lines.Add(words[i]);
end;
end;
end;
唯一分隔单词的是空格,即行中有Привет мир!
2 个单词Привет
和мир!
。
该标志!
也被考虑在内。
在函数中sendRassInLs
我设置了 state linksForRas
。为什么当用户进入状态linksForRas
并发送消息时,该函数gotLinksForRass
应该捕获该状态linksForRas
并发送消息消息已收到!,但它要么捕获,要么不捕获。为什么是这样?
async def sendRassInLs(callback: CallbackQuery, state: FSMContext):
await state.set_state(Rass.linksForRas)
await callback.message.edit_text('<b>Введите сообщение:</b>', reply_markup=kb.BackToRass, parse_mode='html')
@router.message(Rass.linksForRas)
async def gotLinksForRass(message: Message, state: FSMContext):
await state.update_data(linksForRas=message.text)
await message.delete()
await message.answer("Сообщение получено!: ")
await state.set_state(Rass.msgForRas)
@router.message(Rass.msgForRas)
async def send_msg_in_ls(message: Message, state: FSMContext):
await state.update_data(msgForRas=message.text)
user_id = message.from_user.id
token = await get_token_from_database(user_id)
data = await state.get_data()
accsForRass = data["linksForRas"]
msg = data["linksForRas"]
остальной код...
健康)状况:
class Rass(StatesGroup):
linksForRas = State()
msgForRas = State()
为什么它总是在日志中写给我:
ERROR:aiogram.dispatcher:Failed to fetch updates - TelegramConflictError: Telegram server says - Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
WARNING:aiogram.dispatcher:Sleep for 3.471689 seconds and try again... (tryings = 4, bot id = 7024637563)
我在 Linux 上下载了 CodeBlocks,并尝试编译一个简单的Hello World!程序显示错误:
||=== Build: Debug in pr (compiler: GNU GCC Compiler) ===|
||cannot find obj/Debug/main.o: No such file or directory|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
该程序文件夹位于桌面上。
编译器设置:
可能是因为我的资源编译器项是空的 (见图3)
解决方案: 问题是程序所在的路径中存在俄语(西里尔字母)字符。我将符号重命名为英文符号并且成功了!
我有一个数据库脚本demo-small.sql,我需要将其导入到pgadmin4中,在WIndows中我在psql命令行中输入了\i脚本路径,但是我如何在Linux中执行此操作?
输入命令:
1)sudo -u postgres psql
2)\i /home/asl/Загрузки/demo-small-20170815.sql
写入: 访问被拒绝
我安装了 fedora budgie spin 发行版,需要更改设置中的组合,但我无法更改组合键来将语言布局从 super + space 更改为 ctrl + Lshift。
在该函数中,send_GetAccounts
用户向机器人发送消息,然后机器人根据情况响应用户的消息。如何确保机器人回复用户消息后,之前的所有消息都被删除?
例子:
BOT:在此处输入包含收到的令牌的链接
用户:(发送链接)
机器人:链接已成功接收
然后,在机器人发出最后一条消息之后,所有以前的消息都应该被删除。
@router.callback_query(StateFilter(None), F.data == 'addAcc')
async def send_GetAccounts(callback: CallbackQuery, state: FSMContext):
await state.set_state(Auth.token)
await callback.message.edit_text('Введите ссылку с токеном, полученный <a href=vkhost.github.io>ЗДЕСЬ</a>:',
reply_markup=kb.AddingAccount, parse_mode='html', disable_web_page_preview=True)
@router.message(Auth.token)
async def get_token_and_auth(message: Message, state: FSMContext):
token_text = message.text
#получение токена из ссылки пользователя
token_match = re.search(r'token=(.*?)&expires_in', token_text)
if token_match:
token = token_match.group(1)
await state.update_data(token=token)
user_id = message.from_user.id
insert_into_db = await insert_token_into_database(user_id, token)
if insert_into_db:
try:
vk_auth = vk_api.VkApi(token=token)
vk = vk_auth.get_api()
user_info = vk.users.get()
first_name = user_info[0]['first_name']
last_name = user_info[0]['last_name']
await message.answer(f'Аккаунт <b>{first_name}</b> <b>{last_name}</b> успшено добавлен!', reply_markup=kb.Countinue, parse_mode='html')
await state.clear()
await message.delete()
except vk_api.AuthError as e:
await message.answer(f'Произошла ошибка при авторизации под данному токену!')
else:
await message.answer('Произошла ошибка при добавление данных в базу данных!')
else:
await message.answer("Не правильный формат ссылки!\nПопробуйте еще раз")```
我有一个handlers.py文件
from aiogram import F, Router
from aiogram.filters import CommandStart, Command
from aiogram.types import Message, CallbackQuery
import app.keyboards as kb
router = Router()
@router.callback_query(F.data == 'addAcc')
async def send_GetAccounts(callback: CallbackQuery, state: FSMContext):
await state.set_state(Auth.token)
await callback.message.edit_text('Введите ссылку с токеном, полученный <a href=vkhost.github.io>ЗДЕСЬ</a>:',
reply_markup=kb.GetAccount, parse_mode='html', disable_web_page_preview=True)
在这里,我希望该函数是send_GetAccounts
当机器人发送消息时Введите ссылку с токеном, полученный <a href=vkhost.github.io>ЗДЕСЬ</a>
,然后用户向机器人发送消息,然后机器人在另一个函数中使用该消息执行某些操作。我怎样才能做到这一点 ?
添加:
class Auth(StatesGroup):
token = State()
@router.callback_query(StateFilter(None), F.data == 'addAcc')
async def send_GetAccounts(callback: CallbackQuery, state: FSMContext):
await state.set_state(Auth.token)
await callback.message.edit_text('Введите ссылку с токеном, полученный <a href=vkhost.github.io>ЗДЕСЬ</a>:',
reply_markup=kb.GetAccount, parse_mode='html', disable_web_page_preview=True)
def check_token(token):
access_token_match = re.search(r'access_token=([^&]+)', token).group(1)
if access_token_match:
access_token = access_token_match.group(1)
vk_session = vk_api.VkApi(token=access_token)
try:
vk_session.auth(token_only=True)
print('Авторизация прошла успешно')
return True
except vk_api.AuthError as err_msg:
print(err_msg)
return False
@router.message(Auth.token)
async def token_inputed(message: Message, state: FSMContext):
if check_token(message.text):
await message.answer("Успешно добавлен токен!")
await state.clear()
else:
await message.answer("Некорректно введен токен!")```