流程图绘制.这种古老的旧习惯已经使用了1000多年,被强加给我们贫穷的学生,没有任何用处(或者我认为是这样).它可能适用于命令式,顺序运行的语言,但我心爱的函数式编程呢?
可悲的是,我被迫为我的程序创建一个流程图(用Haskell编写).
我想这很容易:
main :: IO ()
main = do
someInput <- getLine
let upped = map toUpper someInput
putStrLn upped
Run Code Online (Sandbox Code Playgroud)
这只是3个有序的步骤,获取数据,高位输出,输出它.
这次事情变得更糟:
main :: IO ()
main = do
someInput <- fmap toUpper getLine
putStrLn someInput
Run Code Online (Sandbox Code Playgroud)
或者像这样:
main :: IO ()
main = interact (map toUpper)
Run Code Online (Sandbox Code Playgroud)
好的,那就是IO,你可以像命令式语言那样处理它.纯函数怎么样?
一个实际的例子:
onlyMatching :: String -> [FilePath] -> [FilePath]
onlyMatching ext = filter f
where f name = lower ('.' : ext) == (lower . takeExtension $ name)
lower = map toLower
Run Code Online (Sandbox Code Playgroud)
你将如何描绘最后一个?
真正简单的问题.根据我的手册页,这两个人会做同样的事情:
time_t t;
time(&t);
printf("Time: %ld", t);
Run Code Online (Sandbox Code Playgroud)
...
printf("Time: %ld", time(NULL));
Run Code Online (Sandbox Code Playgroud)
那么,将指针传递给时间的好处究竟是什么?如果time()由于没有时钟可能会失败,我认为这两种变体都不会有任何好处.
我认为,可用的编程语言数量既是一种祝福,也是一种诅咒.我已经了解了很多编程语言,有些只是语法级别的,有些还不错,可以进行实际编码(Python,C,C++,Haskell,Perl,BASH,PHP等等).几乎只要我使用计算机(6年),几乎在每个范例(功能,命令,面向对象)中,我一直在编程,但我并不为软件行业做好准备.
我用很多不同的语言编写了很多更大的程序,主要是基于网络的,包括大型的多线程服务器/客户端,我仍然感觉不准备!
目前我痴迷于我的"3层"计划,其中包括像Haskell这样的高级语言,像Python这样的解释性语言和像C这样的低级语言,但我感觉还不够好!
我知道如何在团队中工作,以及如何按照指导方针工作,但我不确定.
我准备好了吗?
请亲切的stackoverflow人帮我摆脱这个烂摊子!:(
感谢所有的答案,我希望我能选择更多的答案为的答案:)
public static string SERVER = "irc.rizon.net";
private static int PORT = 6667;
private static string USER = "Test C# Irc bot";
private static string NICK = "Testing";
private static string CHANNEL = "#Test0x40";
public static void Main(string[] args)
{
NetworkStream stream;
TcpClient irc;
StreamReader reader;
StreamWriter writer;
irc = new TcpClient(SERVER, PORT);
stream = irc.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
writer.WriteLine("NICK " + NICK);
writer.Flush();
writer.WriteLine("JOIN " + CHANNEL);
writer.Flush();
Console.ReadKey(true);
}
Run Code Online (Sandbox Code Playgroud)
为什么我的IRC机器人没有连接?
我有一个irc_sendline可以像printfcan 一样调用的函数
irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我对它的实现不满意:
int irc_sendline(irc *iobj, char *msg, ...)
{
char tmp_msg[BUFSIZE], fmsg[BUFSIZE];
va_list args;
int len;
va_start(args, msg);
strncpy(tmp_msg, msg, BUFSIZE);
strncat(tmp_msg, "\r\n", BUFSIZE);
len = vsnprintf(fmsg, BUFSIZE, tmp_msg, args);
len = send(iobj->fd, fmsg, len, 0);
return len;
}
Run Code Online (Sandbox Code Playgroud)
你看,我在这里使用2个"临时"缓冲区,因为我首先必须将原始消息从函数参数复制到临时缓冲区,以便将"\ r \n"附加到它,然后将该临时缓冲区复制到另一个临时缓冲区做函数调用中提供的参数实际的格式化,只有那么我可以在它的途中送东西.
我怎么能让这个更干净,更好?
感谢这里的所有输入,我认为我唯一的问题是那里的混乱,但它实际上是一个滴答作响的定时炸弹!我的新功能如下所示:
int irc_sendline(irc *iobj, char *msg, ...)
{
char buffer[BUFSIZE];
va_list args;
int res_str_len;
int sent; …Run Code Online (Sandbox Code Playgroud) 得知两后strncmp是不是它似乎并strlcpy没有被使用我的操作系统(Linux)的,我想我可以尝试,并将其写入自己.
我发现了libc维护者Ulrich Drepper的一句话,他发布了另一种strlcpy使用方法mempcpy.我也没有mempcpy,但它的行为很容易复制.首先,这是我的测试用例
#include <stdio.h>
#include <string.h>
#define BSIZE 10
void insp(const char* s, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%c ", s[i]);
printf("\n");
for (i = 0; i < n; i++)
printf("%02X ", s[i]);
printf("\n");
return;
}
int copy_string(char *dest, const char *src, int n)
{
int r = strlen(memcpy(dest, src, n-1));
dest[r] = 0;
return r;
}
int main()
{
char …Run Code Online (Sandbox Code Playgroud) 我一直在玩弄,在C中编写一个小的IRC框架,我现在要扩展一些核心功能 - 但除此之外,我希望它可以通过插件进行扩展!
到目前为止,每当我写一些与IRC相关的东西时(我写了很多东西,现在大约有6种不同的语言......我很着火!)并且实际上继续实现了一个插件架构,它是在一种解释性语言中有设施(读:滥用)所以,就像eval在Ruby中干扰整个脚本文件一样(糟糕!).
现在我想在C中滥用一些东西!
基本上我可以做三件事
我喜欢第三个,如果可能的话,请避开其他两个选项.也许我是某种类型的受虐狂,但我认为这对于学习目的来说既有趣又有用.
逻辑思考,明显的"痛苦链"将是(从最低到最高)2 - > 1 - > 3,原因很简单,因为libdl处理的原始代码可以(而且会)在我的脸上爆炸.
所以这个问题告诉你,stackoverflow的其他用户,你认为libdl能胜任这个任务,还是一个现实的想法?
首先,这是一个家庭作业问题,只是为了立即解决这个问题.我当然不是在寻找一种勺子喂食的解决方案,只是指向正确的方向.
所以,我的任务是找到无法表示为IEEE-754浮点数(32位)的最小正整数.我知道在"5 == 5.00000000001"之类的东西上测试相等性会失败,所以我想我只是循环遍历所有数字并以这种方式测试它:
int main(int argc, char **argv)
{
unsigned int i; /* Loop counter. No need to inizialize here. */
/* Header output */
printf("IEEE floating point rounding failure detection\n\n");
/* Main program processing */
/* Loop over every integer number */
for (i = 0;; ++i)
{
float result = (float)i;
/* TODO: Break condition for integer wrapping */
/* Test integer representation against the IEEE-754 representation */
if (result != i)
break; …Run Code Online (Sandbox Code Playgroud) 我将是第一个承认,我是100%的C#家伙而C不适合我.但是我有问题.我需要连接7与HashUrl(HashInt),然后与HashInt连接任何帮助将不胜感激.
int main(int argc)
{
unsigned int HashInt;
HashInt = HashURL(argc);
// I need to return 7 + CheckHash(HashInt) + HashInt but not ADDING, but concanenating them
return HOWEVERTOGETTHESTRING;
}
Run Code Online (Sandbox Code Playgroud)
我应该已经指定了这个用法.它实际上将用于学生VB6项目.
Private Declare Function main Lib "checksum.dll" (ByVal pStr As String) As Long
Private Sub Command1_Click()
MsgBox main("http://hello.com")
End Sub
Run Code Online (Sandbox Code Playgroud)
C库的完整源代码是
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <string.h>
#include <winreg.h>
#include <stdlib.h>
int StrToInt(char *pStr, int Init, int Factor)
{
while (*pStr) {
Init *= Factor;
Init += *pStr++; …Run Code Online (Sandbox Code Playgroud) 我很难在这里决定删除派生类的最佳方法.我目前有以下布局:
class Tag {
// Stuff
// [...]
void releaseMemory(Tag *t);
};
class TagByte : public Tag { /* [...] */ };
class TagShort : public Tag { /* [...] */ };
Tag::releaseMemory(Tag *t) {
switch (t->getType()) {
case TAG_BYTE: delete (TagByte *)t; return;
case TAG_SHORT: delete (TagShort *)t; return;
// [...] many more
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是有更复杂的标签TagCompound,其中包含不同类型的标签,所有这些标签都存储为Tag *.在析构函数内部~TagCompound,~TagList我会调用Tag::releaseMemory();每个标记,因为delete在一个Tag *只会释放一个Tag而不是实际的TagWhatever,从而导致内存泄漏.
我想到的另一个选择是为每个派生类添加一个新的虚方法,因此每个子类Tag都拥有它自己 …
我坐在这里和下面的课:
class TagCompound : public Tag
{
public:
// [...] Constructor and other methods
void insert(Tag *t);
// [...] more modifying methods
protected:
std::vector<Tag *> _values;
};
TagCompound::insert(Tag *t)
{
_values.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有趣和花花公子,适用于派生类的堆栈和堆分配对象Tag.
当然,如果提供给的指针TagCompound::insert()是在堆上分配的,那么它必须在外面的某处解除分配.这意味着从向量中删除某些内容的每个方法都必须返回已删除的指针,以便外部可以再次释放它,如果必须的话.
我不喜欢这个,如果调用者忘了它,它会很麻烦并且容易出错delete.
我尝试的另一件事就是假设向量中的每个指针_values都是堆分配的,并且在每个以某种方式删除了某些东西的函数中进行删除,_values并delete在其中的每个剩余元素上运行TagCompound::~TagCompound.
这当然通过导致无效删除完全排除了堆栈指针.
我也试过使用std::auto_ptr但很快我发现它不适用于STL容器.可能有一些来自boost,但我不想使用boost(或任何类型的第三方库).
我是否已经采用其中一种方法正确的方式,或者是否有某种黑魔法效果更好?
我正在编写一个小游戏来教我自己的OpenGL渲染,因为它是我尚未解决的问题之一.我之前使用过SDL,同样的功能,虽然仍然表现不佳,但并没有像现在那样超越顶级.
基本上,我的游戏还没有太多进展,只是一些基本的动作和背景绘图.当我切换到OpenGL,它看起来好像是这样太快了.我的每秒帧数超过2000,此功能耗尽了大部分处理能力.
有趣的是,它的SDL版本中的程序使用了100%的CPU但运行顺畅,而OpenGL版本只使用了大约40% - 60%的CPU,但似乎对我的显卡征税,使我的整个桌面变得无法响应.坏.
它不是一个太复杂的功能,它根据玩家的X和Y坐标呈现1024x1024背景图块,以给出运动的印象,同时玩家图形本身保持锁定在中心.因为它是用于更大屏幕的小瓷砖,所以我必须多次渲染它以将瓷砖拼接在一起以获得完整的背景.下面代码中的两个for循环迭代12次,合并,所以我可以看到为什么当每秒调用2000次时这是无效的.
所以为了达到目的,这是邪恶的行为者:
void render_background(game_t *game)
{
int bgw;
int bgh;
int x, y;
glBindTexture(GL_TEXTURE_2D, game->art_background);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &bgw);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &bgh);
glBegin(GL_QUADS);
/*
* Start one background tile too early and end one too late
* so the player can not outrun the background
*/
for (x = -bgw; x < root->w + bgw; x += bgw)
{
for (y = -bgh; y < root->h + bgh; y += bgh)
{ …Run Code Online (Sandbox Code Playgroud)