小编Sam*_* B.的帖子

矩阵作为 C89 中的函数参数

在我本科 C 编程课程的大部分时间里,我们学习了 C99,我们的讲师从不费心教我们 C99 和以前版本之间的主要区别。

我们最近被告知,我们可能会被要求在下一次考试期间使用 C89 实施解决方案。

我的问题是关于函数内部声明和使用的可变长度多维数组的使用。

在 C99 中,我可以有这样的功能:

void func(int cols, int mat[][cols], int rows);
Run Code Online (Sandbox Code Playgroud)

而在 C89 中,VLA 和类似的装置是不合法的。有人告诉我,您需要改用指向指针的指针。所以像:

void func(int **mat, int cols, int rows);
Run Code Online (Sandbox Code Playgroud)

但是,我在理解方面遇到了问题:

  1. 您将如何在函数内部访问此矩阵中的元素。你还能用这个符号mat[i][j]吗?
  2. 您将如何声明和填充这样的矩阵。你从类似的东西开始int **mat;吗?我认为您必须使用malloc(),但我很难弄清楚确切的声明语句。
  3. 矩阵甚至可以像指向指针一样使用吗?我读过它们的工作方式相似但不完全相同。您如何解决 C89 中概述的问题?

边问。仍然关于可变大小的矩阵,有人告诉我有这样的设置:

int rows, cols;

// get rows and cols from stdinput

int mat[rows][cols];
Run Code Online (Sandbox Code Playgroud)

由于程序堆栈上的分配,这不是创建具有给定维度的矩阵的最佳方法。什么是更好的方法?

谢谢!

c function matrix c89 variable-length-array

6
推荐指数
1
解决办法
260
查看次数

Django - 使用模块化架构开发应用程序

我使用 Django REST 作为后端应用程序制作了一个学习管理系统。该应用程序已经发展了很多,其用户群也有了很大的增长,越来越多的人对它表现出了兴趣。

我意识到最先进的 LMS 应用程序有一些共同点:模块化——人们可以开发插件、扩展并轻松添加功能。我的应用程序是整体式的,实际上不允许这样做,因此我正在考虑重新设计代码库,以便对扩展更加开放;特别是,我正在尝试适应插件系统。

在 Django 中你会如何处理类似的事情?即使是一些一般性的想法,不一定是 Django 或 Python 特定的,也是非常受欢迎的。

我将给出一个需要从核心硬编码转变为可插入功能的示例。

考虑以下模型:

class Exercise(TimestampableModel, OrderableModel, LockableModel):
    """
    An Exercise represents a question, coding problem, or other element that can appear inside of an exam.
    """

    MULTIPLE_CHOICE = 1
    OPEN_ANSWER = 2
    CLOZE = 3
    PROGRAMMING = 4

    EXERCISE_TYPES = (
        (MULTIPLE_CHOICE "Multiple choice"),
        (OPEN_ANSWER, "Open answer"),
        (CLOZE, "Cloze"),
        (PROGRAMMING, "Programming exercise"),
    )

    course = models.ForeignKey(
        Course,
        on_delete=models.PROTECT,
        related_name="exercises",
    )
    exercise_type = models.PositiveSmallIntegerField(choices=EXERCISE_TYPES)
    name = models.CharField(max_length=75, blank=True) …
Run Code Online (Sandbox Code Playgroud)

python django plugins

6
推荐指数
1
解决办法
791
查看次数

Monaco Editor - 添加Python语言服务器

我正在尝试在 Monaco Editor 中添加对 Python 智能感知的支持。我发现的所有示例都涉及使用在服务器上运行的 Python 语言服务器并使用 websocket 与前端进行通信;然而,Monaco 运行的 TS 语言服务器是在浏览器工作线程内部运行的,所以我尝试为 Python 模拟同样的事情。

我查看了此地址中的示例,但它们对于我的用例来说不够具体,因为它们非常简单,并且不涉及运行成熟的语言服务器。

如何才能做到这一点?

python intellisense monaco-editor language-server-protocol

5
推荐指数
0
解决办法
3251
查看次数

Django - 添加游戏化功能

我有一个中等大小的 Django REST 应用程序,我希望为其添加游戏化功能。

该应用程序是一个学校网络应用程序,学生可以在其中创建模拟测验、参加教师发布的考试以及编写由其他学生和教师投票的教学内容。

我想添加一些游戏化功能,使应用程序更有趣,并激励参与和使用各种功能:例如,每个学生都会有一个个人“声誉”分数,并在完成某些操作后获得积分 - 学生可以以高分完成测验、提交某些内容或收到对此类内容的点赞时获得积分。

棘手的部分是,出于各种原因,我希望能够使此逻辑尽可能与现有代码库分离:关注点分离、根据需要插入/拔出引擎的能力、轻松停用某些组的功能的能力用户数量等

我在这里寻找的是一些特定于 Django 的软件工程建议。这是我正在考虑做的事情的高级描述——我想要一些关于该方法的建议。

  • 创建一个新gamification应用程序。在这里,我将拥有描述用户声誉变化以及可能的其他相关事件的模型。当游戏化相关事件发生时,应用程序还应该发送通知
  • gamification应用程序中公开一个基于回调的接口,其他主应用程序可以调用该接口来调度事件
  • 使用django-lifecycle包在触发器发生时调用回调gamification

这样,我现有的模型只会被触及以注册来自 django-lifecycle 的触发器(类似于信号)。例如,假设我想在学生交作业时给他们评分。假设我有一个AssignmentSubmission模型来处理作业提交。添加生命周期钩子后,它看起来像这样:

class AssignmentSubmission(models.Model):
    NOT_TURNED_IN = 0
    TURNED_IN = 1
    STATES = ((NOT_TURNED_IN, 'NOT_TURNED_IN'), (TURNED_IN, 'TURNED_IN'))

    user = models.ForeignKey(user)
    assignment = models.ForeignKey(assignment)
    state = models.PositiveSmallIntegerField(choices=STATES, default=NOT_TURNED_IN)

    @hook(AFTER_UPDATE, when="state", was=NOT_TURNED_IN, is_now=TURNED_IN)
     def on_turn_in(self):
        get_gamification_interface().on_assignment_turn_in(self.user)
Run Code Online (Sandbox Code Playgroud)

on_assignment_turn_in方法可能类似于:

def on_assignment_turn_in(user):
    ReputationIncrease.objects.create(user, points=50)
    notifications.notify(user, "You gained 50 points")
Run Code Online (Sandbox Code Playgroud)

这几乎只是一个提供想法的草图。

我不确定如何get_gamification_interface()运作。它应该返回一个单例吗?也许实例化一个对象?或者返回一个带有静态方法的类?我认为最好有一个像这样的 getter,而不是从gamification应用程序手动导入方法,但也许它也会产生太多的开销。 …

django separation-of-concerns django-rest-framework

5
推荐指数
1
解决办法
327
查看次数

在 Vue3 中处理自动保存

我有一个 Vue3 应用程序,我想传达一种特定类型的 UX,其中对资源所做的更改会自动保存(即没有保存按钮)。该应用程序有几种不同类型的可编辑资源和几个不同的编辑器组件,我想创建一个可以处理自动保存并且可以简单地插入我的编辑器组件内部的抽象。作为附加要求,某些字段必须去抖(例如文本字段),而其他字段则要立即保存到服务器。

我有兴趣了解使用我在这里提供的解决方案可能存在哪些缺点以及是否有更好的方法。

想法:

  • 创建一个多态类AutoSaveManager<T>来处理类型对象的自动保存T
  • 传递一个更新内存中本地对象的函数,该函数在该对象发生更改时调用(例如,绑定到该对象字段的输入元素发出更新)
  • 传递更新远程对象(即数据库中的记录)的函数。例如,进行 API 调用的 Pinia 操作
  • 将远程函数包装在需要去抖的字段的去抖器中,或者如果更新了无去抖字段,则立即刷新它。

类的代码:

/* eslint-disable @typescript-eslint/no-explicit-any */

import { debounce, DebouncedFunc } from "lodash";

type RemotePatchFunction<T> = (changes: Partial<T>) => Promise<void>;
type PatchFunction<T> = (changes: Partial<T>, reverting?: boolean) => void;
export type FieldList<T> = (keyof T)[];

enum AutoSaveManagerState {
    UP_TO_DATE,
    PENDING,
    ERROR,
}
export class AutoSaveManager<T> {
    instance: T;
    unsavedChanges: Partial<T>;
    beforeChanges: Partial<T>;
    remotePatchFunction: DebouncedFunc<RemotePatchFunction<T>>;
    localPatchFunction: PatchFunction<T>;
    errorFunction?: (e: any) => void;
    successFunction?: () …
Run Code Online (Sandbox Code Playgroud)

autosave typescript vue.js vuejs3 pinia

5
推荐指数
0
解决办法
499
查看次数

从套接字接收消息时,Vue.js 数据未更新

我正在尝试设计一个 vue.js 应用程序,它在从套接字接收到“new_state”消息时更新有关游戏状态的数据。套接字是使用 django 通道实现的。

这是代码的样子:

const ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"

const gameSocket = new WebSocket(
    ws_scheme +
    '://'
    + window.location.host
    + '/ws/play/'
    + game_id
    + '/'
)
    let vue = new Vue({
        el: '#app',

        data: {
            current_turn: 0,
            last_turn: -1,
            current_card: 0,
            last_card: -1,
            number_of_stacked_cards: 0,
            last_amount_played: 0,
            won_by: -1,
            my_cards: [],
            other_players_data: {},
        },

        created() {
            gameSocket.onmessage = function(e) {
                data = JSON.parse(e.data)
                this.current_turn = data.state.current_turn
                this.last_turn = data.state.last_turn
               // ... update the …
Run Code Online (Sandbox Code Playgroud)

javascript websocket vue.js

2
推荐指数
1
解决办法
616
查看次数

使用 CSV 格式的空格时,strtok 无法按预期工作

我正在制作一个 C 程序,它需要将书籍上的数据作为输入并创建一个有序列表。数据以 CSV 格式输入。每本书的信息如下:“ISBN 代码”、“书名”、“作者”、3 个字符串。

我使用带有“,”分隔符的 strtok 将输入信息分成三个字符串,然后我需要将这些字符串传递给插入函数。除非字段中有空格,否则这似乎工作正常。例如, 111111,AAA,BBB将正常工作但 111111,A AA,BBB不会。

这是我的代码:

    Book book; // previously defined struct

    char data[212];

    scanf("%s", data);


    char *field;

    field = strtok(data, ",");
    if(field != NULL) {
        strcpy(book.isbn, field);
    }
    field = strtok(NULL, ",");
    if(field != NULL) {
        strcpy(book.title, field);
    }
    field = strtok(NULL, ",");
    if(field != NULL) {
        strcpy(book.author, field);
    }
Run Code Online (Sandbox Code Playgroud)

使用此输入: 1,A,B1 - A - B 从一个函数中获取输出 ,该函数应该遍历列表并打印所有字段,以“-”分隔,后跟换行符。

有了这个输入: 1,A A,b 我得到以下输出:

A - b -
1 …
Run Code Online (Sandbox Code Playgroud)

c string strtok

1
推荐指数
1
解决办法
833
查看次数