void foo(const char *s);
Run Code Online (Sandbox Code Playgroud)
相当于:
void foo(const char s[]);
Run Code Online (Sandbox Code Playgroud)
是否有类似的以下两个?
void foo(char * const s);
void foo(const char * const s);
Run Code Online (Sandbox Code Playgroud) 假设我有一个TList类的实例(BDS 2006,所以这是一个指针类型列表).我放入列表的每个指针都引用New()函数分配的内存.因此,当我想清除列表时,我必须遍历它并处理每个项目,对吧?但如何正确地做到这一点?我是否必须将每个处理过的物品投射到它的实际类型?
type
TMyRec = record
Field1: string;
Field2: integer;
end;
PMyRec = ^TMyRec;
...
var
MyList: TList;
MyRecPointer: PMyRec;
begin
...
New(MyRecPointer);
...
MyList.Add(MyRecPointer);
...
for i := 0 to MyList.Count - 1 do
Dispose(PMyRec(MyList[x]));
MyList.Clear();
end;
Run Code Online (Sandbox Code Playgroud)
请查看最后的for循环.我将每个项目投射到PMyRec以处置内存.这有必要吗?我知道Dispose()函数有一个Pointer参数,所以在这种情况下,转换似乎很愚蠢,但我仍然不确定.因为Dispose()函数如何知道在获得一般指针类型时要处理多少内存?
这是第二种方法(没有类型转换):
for i := 0 to MyList.Count - 1 do
Dispose(MyList[x]);
Run Code Online (Sandbox Code Playgroud)
如果有人解释我该怎么做以及为什么,我将不胜感激.非常感谢.
好吧,我无法理解指针与指向数组指针的指针.请考虑以下代码:
char s[] = "Hello, World";
char (*p1)[] = &s;
char **p2 = &s;
printf("%c\n", **p1); /* Works */
printf("%c\n", **p2); /* Segmentation fault */
Run Code Online (Sandbox Code Playgroud)
为什么第一个printf工作,而第二个不工作?
据我所知,'s'是指向数组第一个元素的指针(即'H').因此将p2声明为char**意味着它是指向char的指针.使它指向's'应该是合法的,因为's'是指向char的指针.因此解除引用它(即**p2)应该给出'H'.但事实并非如此!
我试图围绕R编程语言的基本概念,我发现很难,因为R面向统计而不是通用编程.我找不到任何类似于指针/引用的东西.如何在R语言中实现链表,搜索树等?
注意:我理解如果你实际上在R中滚动自己的自引用数据结构,可能有更好的方法来完成你想要完成的任务.但是,我相信一个答案将帮助我更好地理解语言的整体结构和概念.
编辑:关于Matt Shotwell的评论,这个问题的关键在于我希望在 R中干净地编写链表和树,而不是用C或其他语言编写的扩展.做它作为一个扩展或通过与解释器的神秘细节混淆失败的目的.
我一直在研究STM(软件事务内存)实现,特别是在利用锁的算法上,并且不依赖于垃圾收集器的存在,以保持与非托管语言(如C/C++)的兼容性.我已经阅读了Herlihy和Shavit的"多处理器编程艺术"中的STM章节,并阅读了几篇描述他的"事务锁定"和"事务锁定II" STM实现的Shavit论文.他们的基本方法是利用存储全局版本时钟和锁定值的散列表来确定另一个线程的写入是否触及了内存位置.据我了解算法,当执行写入事务时,读取版本时钟并将其存储在线程本地存储器中,并且还在线程本地存储器中创建读取集和写入集.然后执行以下步骤:
如果上述任何检查步骤失败(即步骤#1,#3和#5),则中止写入事务.
读事务的过程要简单得多.根据Shavit的论文,我们简单地说
如果步骤#2或#4失败,则中止读取事务.
我在脑海中似乎无法解决的问题是,当您尝试读取位于堆中的对象内的内存位置,而另一个线程调用delete指向该对象的指针时会发生什么?在Shavit的论文中,他们详细解释了如何不对已经被回收或释放的内存位置进行写入,但似乎在读取事务中,没有什么可以阻止可能的时序场景从另一个线程释放的对象内部的内存位置读取.例如,请考虑以下代码:
Thread A 在原子读事务中执行以下命令: linked_list_node* next_node = node->next;
Thread B 执行以下操作: delete node;
由于next_node是一个线程局部变量,它不是一个事务对象.为其分配值所需的解除引用操作node->next实际上需要两个单独的读取.在这些读取之间,delete可以调用node,以便成员的读取next实际上是从已经释放的一段内存中读取.由于读是乐观的,内存的释放指向node中Thread B不会被检测到Thread A.这不会导致可能的崩溃或分段错误吗?如果是这样的话,如何在不锁定读取的内存位置的情况下避免这种情况(教科书和论文表示的内容都是不必要的)?
通常,如果您执行以下操作:
int * i = &someint;
它只是一个指向变量的指针.
但是,当你这样做的时候
char * str = "somestring";
它会自动将其转换为数组.它是执行此操作的指针,还是初始化语法的语法糖?
我已经在C和C#中编程了很长时间,我觉得转向C++会很顺利......
无论如何,我看过使用插入符号,但我不明白它的含义.
有什么不同:
std::string *st1;
Run Code Online (Sandbox Code Playgroud)
至
String::string ^st2;
Run Code Online (Sandbox Code Playgroud)
谢谢!
我被困.我正在尝试形成一个函数,它将吃掉无类函数指针和来自对象的函数.这是我目前的代码,希望能够解释更多.
(它应该在Arduino上运行,所以我不能使用大型库.)
首先,我使用这个库为Arduino:
/* SimpleTimer - A timer library for Arduino.
* Author: mromani@ottotecnica.com
* Copyright (c) 2010 OTTOTECNICA Italy
*/
Run Code Online (Sandbox Code Playgroud)
它采用它在此类型的设定计时器间隔上调用的函数:
typedef void (*timer_callback)(void);
Run Code Online (Sandbox Code Playgroud)
据我所知,它是一个类别功能,成员函数的网页指针让我真的很远,但还不够远.可能是我这方面的术语缺陷.
现在,我已经创建了自己的类,我想依次使用这个SimpleTimer库.但是,如果我为SimpleTimer提供我的类函数,它就不喜欢它们(我理解).但是如何在不改变SimpleTimer库的情况下实现这一目标是可能的.
所以有类机器人,它有Robot::halt().我希望机器人能够向前移动一段时间.像这样:
void Robot::forward(int speed, long time) {
reset();
timer.setTimer(time, c_func, 1);
analogWrite(l_a, speed);
analogWrite(r_a, speed);
isMoving(true);
}
void Robot::halt() {
__isMoving = false;
digitalWrite(r_a, LOW);
digitalWrite(r_b, LOW);
digitalWrite(l_b, LOW);
digitalWrite(l_a, LOW);
}
Run Code Online (Sandbox Code Playgroud)
此时c_func变量是一个无类函数,但我想使用该Robot::halt函数.我看了,读过,学过但还没有成功.我似乎无法绕过这一个,因为我错过了一些角度.
我试过了:
timer.setTimer(time, (this->*halt), 1);
timer.setTimer(time, Robot::*halt, 1);
timer.setTimer(time, &Robot::halt), 1);
Run Code Online (Sandbox Code Playgroud)
但这一切都等于同样的问题/我只是在黑暗中刺伤......
编辑 …
我实际上已经听过两种说法.我怀疑他们不是,但我想让这个话题得到解决.
当我想用C++实例化一个类时,我通常会这样做
Book bk = new Book();
Run Code Online (Sandbox Code Playgroud)
我的教授最近这样做了
Book &bk = *new Book();
Run Code Online (Sandbox Code Playgroud)
他只告诉我他会使用引用来使用点(例如bk.getTitle();)运算符而不是箭头(例如bk-> getTitle();).我理解这部分代码,但是当你将*运算符与new结合使用时会发生什么?
提前致谢
完整的示例代码可以在这里找到它是main函数中的arraystack