小编Lei*_*sen的帖子

C和H文件中的Typedef和Struct

我一直在使用以下代码来创建各种结构,但只给C文件外的人一个指向它的指针.(是的,我知道他们可能会搞乱它,所以它不完全像Java中的私有关键字,但对我来说没关系).

无论如何,我一直在使用以下代码,今天我看了它,我真的很惊讶它实际上正在工作,任何人都可以解释为什么这是?

在我的C文件中,我创建了我的结构,但是不要在typedef命名空间中给它一个标记:

struct LABall {
    int x;
    int y;
    int radius;
    Vector velocity;
};
Run Code Online (Sandbox Code Playgroud)

在H文件中,我把它放在:

typedef struct LABall* LABall;
Run Code Online (Sandbox Code Playgroud)

我显然在c文件中使用#include"LABall.h",但我没有在头文件中使用#include"LABall.c",因为这会破坏单独头文件的整个目的.那么,为什么我还没有实际包含H文件中的LABall*结构的指针呢?是否与跨文件的struct命名空间有关,即使一个文件没有链接到另一个文件?

谢谢.

c struct typedef include

7
推荐指数
2
解决办法
3万
查看次数

Racket中的双向HashMap

Racket是否有双向散列映射?

也就是说,哈希映射可以在恒定时间内,给一个键并查找值,或者给出值并查找键?我很高兴看起来像这样的API:

#lang racket

(define my-map (bidirectional-hash '(key1 val1) '(key2 val2)))
(bidirectional-hash-ref my-map 'key 'key1) ; => val1
(bidirectional-hash-ref my-map 'val 'val2) ; => key2
Run Code Online (Sandbox Code Playgroud)

符号keyval告诉哈希映射它被赋予val,并寻找一个键,或给一个键,并寻找一个val.在这两种情况下,我希望在恒定的O(1)时间内完成.

我知道你可以通过使用两个彼此反转的哈希表来实现这一点,但我想要一个构建在Racket(或现有库)中的结构.

bimap racket

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

C中的运算符重载

在C++中,我可以通过执行以下操作来更改特定类的运算符:

MyClass::operator==/*Or some other operator such as =, >, etc.*/(Const MyClass rhs) {
    /* Do Stuff*/;
}
Run Code Online (Sandbox Code Playgroud)

但是由于C中没有类(默认内置),所以,我怎样才能对一般函数进行运算符重载?

例如,如果我没记错的话,导入stdlib.h会给你 - >运算符,它只是(*strcut_name).struct_element的语法糖.

那么我怎么能在C中做到这一点?

谢谢.

c c++ operator-overloading operators

6
推荐指数
2
解决办法
2508
查看次数

将用户构建的小部件添加到qt creator中的ui文件

qt creator的qt设计器部分有许多内置的小部件.但是,假设我想将在同一qt项目中创建的自定义小部件添加到窗口的ui文件中.通过采取这些步骤:

  1. 使用主窗口创建一个新的Qt GUI应用程序,我们将调用窗口A.
  2. 向项目添加新窗口小部件,窗口小部件只使用标准UI组件,比如按钮.我们将这个小部件称为B.
  3. 将小部件B的实例添加到窗口A.

现在,我知道一种方法,那就是:

  1. 在窗口A中,从可能的小部件列表的容器部分添加一个空白小部件(或小部件容器.我们将调用此小部件C.
  2. 将它(小部件C)推广到小部件B.

然而,问题在于Qt Creator的设计师将其视为通用的QWidget.因此,您无法执行将其添加到拆分器或连接特定于窗口小部件的信号/插槽等操作.

那么有没有其他方法使用qt creator将小部件B添加到ui文件中的窗口A?谢谢.

qt qt4 qt-creator qt-designer

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

QDockWidget导致qt崩溃

我有在ubuntu 11.10中内置的Qt版本.并且我试图使用一个QDockWidget实际上无法停靠的(基本上,我只是想要一个漂浮的窗口.我不想只是让视图成为顶级视图,因为那时我会将OS窗口栏放在那里,我不想要,如果我要隐藏它,那么窗口将不会移动).

所以,我基本上创建一个新的Qt Gui项目,并且不要更改任何文件,除了mainwindow.cpp我更改为的文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDockWidget>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QDockWidget *dockWidget = new QDockWidget(this);
    // Without window management and attached to mainwindow (central widget)
    dockWidget->setFloating( true );
    // resize by frame only - not positional moveable
    dockWidget->setFeatures( QDockWidget::DockWidgetMovable );
    // never dock in mainwindow
    dockWidget->setAllowedAreas( Qt::NoDockWidgetArea );
    // title
    dockWidget->setWindowTitle( "Dock Widget" );
    // add contents. etc etc....
    dockWidget->show();
}

MainWindow::~MainWindow()
{
    delete ui;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我去移动小部件时,整个程序崩溃了.我想知道我做错了什么,或者qt中是否只有一个bug.

c++ qt qt4 qdockwidget

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

为什么Racket中的集合(或列表)打印#0#作为唯一的数据?

我正在编写一个广泛使用集合的Racket程序.查看程序的输出,其中几个集合包括#0#作为他们唯一的数据.是什么造成的?

set racket data-structures

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

我的代码表示错误"应用程序:不是程序"或"调用非程序"

在执行我的代码期间,我在不同的Scheme实现中遇到以下错误:

球拍:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '(1 2 3)
  arguments...:
Run Code Online (Sandbox Code Playgroud)

的Ikarus:

Unhandled exception
 Condition components:
   1. &assertion
   2. &who: apply
   3. &message: "not a procedure"
   4. &irritants: ((1 2 3))
Run Code Online (Sandbox Code Playgroud)

鸡:

Error: call of non-procedure: (1 2 3)
Run Code Online (Sandbox Code Playgroud)

开局:

*** ERROR IN (console)@2.1 -- Operator is not a PROCEDURE
((1 2 3) 4)
Run Code Online (Sandbox Code Playgroud)

MIT计划:

;The object (1 2 3) is not applicable.
;To continue, call RESTART with an option number: …
Run Code Online (Sandbox Code Playgroud)

scheme runtime-error racket

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

为什么 RefCell 不具有与常规引用相同的范围?

我可以编写以下函数f,并且代码可以按我的预期进行编译:

use std::collections::HashMap;

struct A {
    data: HashMap<u32, B>,
}

struct B {
    val: Option<u32>,
}

impl A {
    fn f(&mut self, key: u32) {
        let data = &self.data[&key];
        match data.val {
            Some(value) => panic!("{}", value),
            None => self.data.remove(&key),
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

这里key首先以不可变的方式签出&self.data[&key],然后再次以可变的方式签出(self.data.remove(&key)),但编译器允许这样做,可能是因为data在可变签出之后从未使用过。

但是,如果我随后使用 aRefCell而不仅仅是常规引用,则会出现编译时错误,即使逻辑在其他方面(看似)相同:

use std::collections::HashMap;
use std::cell::RefCell;

struct A {
    data: HashMap<u32, RefCell<B>>,
}

struct B {
    val: Option<u32>,
}

impl A {
    fn f(&mut self, …
Run Code Online (Sandbox Code Playgroud)

scope rust

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

告诉git永远不要更新文件

我在git中有一些文件(即配置文件),我需要在git repo中,但我不希望它们更新(出于某种原因,运行它们,make,更改配置文件).

那么有什么方法可以告诉git忽略对文件的任何更改,但保持原始文件仍然在repo中?目前,我发现这样做的唯一方法是将文件添加到.gitignore文件中,然后git直接将文件添加到项目中(使用-f覆盖).有没有更好的方法?

git gitignore

5
推荐指数
2
解决办法
3657
查看次数

在javascript中为对象创建函数

据我所知,有两种主要方法可以在javascript中为对象创建函数.他们是:

方法A,在构造函数中创建:

function MyObject() {
    this.myFunc1 = function() {
        ...
    }
    this.myFunc2 = function() {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

方法B,将其添加到原型中:

function MyObject() {
    ...
}

MyObject.prototype.myFunc1 = function() {
    ...
}

MyObject.prototype.myFunc2 = function() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

显然,如果你这样做:

MyObject.myFunc3 = function() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

然后myFunc3将与MyObject本身相关联,而不是与new关键字一起创建的任何新对象.为清楚起见,我们将其称为方法C,即使它不适用于使用new关键字创建新对象.

所以,我想知道两者之间的区别是什么.据我所知,它们在逻辑上具有相同的效果,即使机器上发生的事情有所不同.

如果我猜测我会说唯一真正的区别是当你在方法A中的构造函数中定义它们时,它会为每个创建的对象创建一个全新的函数对象,而方法B只保留它的一个副本(在MyObject中),它指的是它被调用的任何时间.如果是这种情况,你为什么要以另一种方式做到这一点.否则,方法A和方法B之间有什么区别.

javascript

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