我一直在使用以下代码来创建各种结构,但只给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命名空间有关,即使一个文件没有链接到另一个文件?
谢谢.
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)
符号key并val告诉哈希映射它被赋予val,并寻找一个键,或给一个键,并寻找一个val.在这两种情况下,我希望在恒定的O(1)时间内完成.
我知道你可以通过使用两个彼此反转的哈希表来实现这一点,但我想要一个构建在Racket(或现有库)中的结构.
在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中做到这一点?
谢谢.
qt creator的qt设计器部分有许多内置的小部件.但是,假设我想将在同一qt项目中创建的自定义小部件添加到窗口的ui文件中.通过采取这些步骤:
现在,我知道一种方法,那就是:
然而,问题在于Qt Creator的设计师将其视为通用的QWidget.因此,您无法执行将其添加到拆分器或连接特定于窗口小部件的信号/插槽等操作.
那么有没有其他方法使用qt creator将小部件B添加到ui文件中的窗口A?谢谢.
我有在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.
我正在编写一个广泛使用集合的Racket程序.查看程序的输出,其中几个集合包括#0#作为他们唯一的数据.是什么造成的?
在执行我的代码期间,我在不同的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) 我可以编写以下函数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) 我在git中有一些文件(即配置文件),我需要在git repo中,但我不希望它们更新(出于某种原因,运行它们,make,更改配置文件).
那么有什么方法可以告诉git忽略对文件的任何更改,但保持原始文件仍然在repo中?目前,我发现这样做的唯一方法是将文件添加到.gitignore文件中,然后git直接将文件添加到项目中(使用-f覆盖).有没有更好的方法?
据我所知,有两种主要方法可以在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之间有什么区别.
racket ×3
c ×2
c++ ×2
qt ×2
qt4 ×2
bimap ×1
git ×1
gitignore ×1
include ×1
javascript ×1
operators ×1
qdockwidget ×1
qt-creator ×1
qt-designer ×1
rust ×1
scheme ×1
scope ×1
set ×1
struct ×1
typedef ×1