我正在尝试使用系统调用进行基本的bash,但我对指针数组有一些小问题.
为了恢复我的代码,我从stdin中读取带有read()的命令到缓冲区,然后我使用strsep()将命令与参数和所有参数分离到一个数组中.然后我用fork()创建一个新进程,并使用execvp()的相关参数执行该命令.
所有这一切都进入无限循环,直到用户键入"退出"(尚未编码).问题是在第一次迭代之后,我需要*pArgs为空,用于下一个命令和参数.我不知道怎么做......
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char **argv) {
char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr;
int aCount;
pid_t pid;
while(1) {
write(1, "\e[1;31mmyBash \e[1;32m# \e[0m", 27);
read(0, bBuffer, BUFSIZ);
sPtr = bBuffer;
aCount = 0;
do {
aPtr = strsep(&sPtr, " ");
pArgs[aCount++] = aPtr;
} while(aPtr);
pArgs[aCount-2][strlen(pArgs[aCount-2])-1] = '\0';
// Debug code to output pArgs content
write(1, "|>", 2);
write(1, pArgs[0], strlen(pArgs[0]));
write(1, "<|", 2);
if(strlen(pArgs[0]) > 1) { …Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于何时以及如何覆盖的10个不同的问题,GetHashCode但仍然有一些我不太了解的问题.大多数实现GetHashCode都是基于对象字段的哈希码,但是引用的是值的值GetHashCode永远不会在对象的生命周期内发生变化.如果它所基于的字段是可变的,那该怎么办?另外,如果我确实希望字典查找等基于引用相等而不是我的重写Equals?
我主要是Equals为了方便单元测试我的序列化代码,我假设序列化和反序列化(在我的情况下为XML)会导致引用相等,所以我想确保至少它的值是正确的.Equals在这种情况下,这种不良做法是否会被覆盖?基本上在大多数执行代码中,我希望引用相等,而且我总是使用,==而不是重写.我应该创建一个新的方法ValueEquals或什么而不是覆盖Equals?我曾经认为框架总是使用==而不是Equals比较事物,因此我认为覆盖是安全的,Equals因为在我看来,如果你想要有与==运算符不同的第二个等式定义,那么它的目的是什么.从阅读其他几个问题虽然看起来并非如此.
编辑:
看来我的意图不清楚,我的意思是99%的时候我想要普通的老参考平等,默认行为,没有惊喜.对于非常罕见的情况,我希望值相等,并且我希望通过使用.Equals而不是显式请求值相等==.
当我这样做时,编译器建议我也覆盖GetHashCode,这就是这个问题的出现方式.GetHashCode当应用于可变对象时,似乎存在矛盾的目标,即:
a.Equals(b)那时a.GetHashCode()应该== b.GetHashCode().a.GetHashCode()永远不应该改变的价值a.当一个可变对象时,这些看起来自然是矛盾的,因为如果对象的状态发生变化,我们期望值的.Equals()变化,这意味着GetHashCode应该改变以匹配变化.Equals(),但GetHashCode不应该改变.
为什么会出现这种矛盾呢?这些建议不适用于可变对象吗?可能是假设,但可能值得一提的是我指的是不是结构的类.
解析度:
我将JaredPar标记为已被接受,但主要用于评论互动.总结我从中学到的是,在边缘情况下实现所有目标和避免可能的古怪行为的唯一方法是仅覆盖Equals并GetHashCode基于不可变字段或实现IEquatable.这种类似似乎削弱了覆盖Equals引用类型的有用性,因为从我看到的大多数引用类型通常没有不可变字段,除非它们存储在关系数据库中以使用它们的主键来标识它们.
如果我有一个foo()windows已经在kernel32.dll中实现的函数并且它总是返回true,我可以使用我的程序:"bar.exe"挂钩/绕过Windows函数并使其为所有进程返回false吗?
所以,如果我的svchost,例如,调用foo(),它将返回false而不是true.对于当前运行的所有其他进程,应该应该执行相同的操作.
如果是这样,怎么样?我想我正在寻找一个系统范围的钩子或东西.
我是一名开发人员,正在努力维护一个非常需要在Vista下运行的VB6应用程序.但是,它必须在Vista Starter Edition下正常工作,因为这里是新版本的计算机(阿根廷).
现在,关于技术的东西:我的应用程序使用ImageMagick的转换来处理图像(调整大小,黑白分割,旋转等),所以三个应用程序限制是......在某个地方真正的痛苦.最糟糕的是:运行转换失败不是(当前?)检测到的,所以当这种情况发生时,程序会挂起.
任何人都可以告诉我如何:
a_检测打开的应用程序的数量,以便在重试之前我可以要求用户关闭某些内容?可能是API调用?要么
b_检测到转换(当前使用"Shell"功能运行)未正确启动?
请注意,"你应该将你的应用程序迁移到x"这样的评论应该发送给我的老板(不是我),不欢迎,并且会让我去你的地方并咬你的脚趾.但是我需要一些时间来获得签证,但我向你保证,有一天,一个陌生人会敲你的门,问你的StackOverflow用户名然后他会咬你的脚趾.
谢谢你的考虑
我是Boost C++库的新手.我想知道Boost bjam在GNU make上是否有任何优势?如果我使用make来构建使用Boost.Python库的C++代码,那有什么用呢?
我仍然对ThreadLocal的概念感到困惑.我已经阅读了JavaDoc以及其他相关问题,但是使用的术语并没有对我有多大帮助.
我有点了解ThreadLocal,也就是说,每个线程都有自己的变量副本.那么......这怎么会让它与...每次构建新变量有所不同?
例如,使用DateFormatter作为示例:
public void convertDate(String date)
{
// Contruct new date formatter for every invocation of the method.
DateFormatter df = new SimpleDateFormatter(...);
....
}
public void convertDate(String date)
{
// Getting date formatter from threadlocal.
DateFormatter df = threadLocal.get();
....
}
Run Code Online (Sandbox Code Playgroud)
如果第二个所做的只是返回变量的新副本,第一个与第二个有什么不同?
谢谢.
所以这是我的设置:
看起来很简单,但这些部分都非常耗费资源.当他们弹回时我找不到一个好的方法来彻底清除XIB的内存 - 我只是调用[viewController release],虽然它工作并最终调用UIViewController子类的 - (void)dealloc方法, XIB文件中的一些内容仍保留在内存中(我可以在ObjectAllocations中看到它们,我可以在ActivityMonitor中看到大量内存).
基本上我要问的是从内存中完全删除动态加载的XIB的最佳方法是什么?
我很难解决这个问题,需要一种客户名称,客户ID,最后是应付金额.我有整个程序,但无法弄清楚进行排序所需的最后一个原型.我有一个名为Customers的结构,我也将提供int main()部分.我只需要任何帮助来启动原型SortData().
struct Customers {
string Name;
string Id;
float OrderAmount;
float Tax;
float AmountDue;
};
const int MAX_CUSTOMERS = 1000;
bool MoreCustomers(int);
Customers GetCustomerData();
void OutputResults(Customers [], int);
void SortData(const int, const int, Customers []);
int main() {
Customers c[MAX_CUSTOMERS];
int Count = 0;
do {
c[Count++] = GetCustomerData();
} while (MoreCustomers(Count));
for (int i = 0; i < Count; i++) {
c[i].Tax = 0.05f * c[i].OrderAmount;
c[i].AmountDue = c[i].OrderAmount + c[i].Tax;
}
SortData(0, Count, c); //0:Sorts by customer …Run Code Online (Sandbox Code Playgroud) 我在本机C++进程中创建并设置/重置了一个全局事件,如下所示:
HANDLE hGlobalEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\MyEvent"));
Run Code Online (Sandbox Code Playgroud)
是否有任何方法(即使它是由MS编写的库)在.NET(C#)进程中注册这些事件之一,以便在全局事件发生变化时触发标准.NET事件处理程序?
而且我真的不想等待事件和循环,就像在C++中使用WaitForSingleObject一样...我真的希望它是一个完全异步的事件处理程序.
我必须想象有一种简单的方法可以做到这一点......就是找不到它.
c++ ×3
.net ×2
arrays ×2
c ×2
c# ×2
bjam ×1
bubble-sort ×1
comparison ×1
editor ×1
equals ×1
events ×1
gethashcode ×1
hook ×1
iphone ×1
java ×1
makefile ×1
overriding ×1
pointers ×1
sorting ×1
struct ×1
thread-local ×1
vb6 ×1
whitespace ×1
winapi ×1
windows ×1
xcode ×1